如何在 Express 中签署 JSON 回复
How to sign JSON responses in Express
我正在开发 Express.js 服务器;因为它管理敏感数据,所以我想使用私钥为每个响应添加加密签名。签名部分已经OK了,问题是抓取JSON之前发送给客户端签名的字符串。
理想情况下,我想添加自定义响应 header,例如X-signature
,因此客户端可以根据服务公开的 public 密钥验证接收到的负载。
在 Express 中,如何在 JSON.stringify()
调用之后但在发送 header 之前拦截响应 body?
我复制了compression()
中间件的做法,把Response的send()
方法换成了我自己的方法,在计算签名后调用原来的方法。这里有一个简化的解决方案,只是为了展示这个概念,实际上我已经处理了 body
的可能类型。 calculateSignature()
是异步函数的事实有点麻烦,但现在似乎一切正常。
如有任何意见,我们将不胜感激!
import express, { RequestHandler } from 'express';
declare const calculateSignature = (payload: string) => Promise<string>;
const responseSignature = (): RequestHandler => (_, res, next) => {
const _send = res.send;
res.send = (body) => {
if (isPlaintextType(body)) {
calculateSignature(body)
.then((signature) => res.setHeader('X-Signature', signature))
.catch((e) => console.error(e))
.finally(() => _send.call(res, body));
return res;
} else {
return _send.call(res, body);
}
};
next();
};
const app = express();
app.use(responseSignature());
app.listen(3000);
我正在开发 Express.js 服务器;因为它管理敏感数据,所以我想使用私钥为每个响应添加加密签名。签名部分已经OK了,问题是抓取JSON之前发送给客户端签名的字符串。
理想情况下,我想添加自定义响应 header,例如X-signature
,因此客户端可以根据服务公开的 public 密钥验证接收到的负载。
在 Express 中,如何在 JSON.stringify()
调用之后但在发送 header 之前拦截响应 body?
我复制了compression()
中间件的做法,把Response的send()
方法换成了我自己的方法,在计算签名后调用原来的方法。这里有一个简化的解决方案,只是为了展示这个概念,实际上我已经处理了 body
的可能类型。 calculateSignature()
是异步函数的事实有点麻烦,但现在似乎一切正常。
如有任何意见,我们将不胜感激!
import express, { RequestHandler } from 'express';
declare const calculateSignature = (payload: string) => Promise<string>;
const responseSignature = (): RequestHandler => (_, res, next) => {
const _send = res.send;
res.send = (body) => {
if (isPlaintextType(body)) {
calculateSignature(body)
.then((signature) => res.setHeader('X-Signature', signature))
.catch((e) => console.error(e))
.finally(() => _send.call(res, body));
return res;
} else {
return _send.call(res, body);
}
};
next();
};
const app = express();
app.use(responseSignature());
app.listen(3000);