【发布时间】:2022-02-09 14:57:52
【问题描述】:
我正在开发一个 Express.js 服务器;由于它管理敏感数据,我想使用私钥为每个响应添加加密签名。签名部分已经OK了,问题是在发送给客户端签名之前捕获JSON字符串。
理想情况下,我想添加一个自定义响应标头,例如X-signature,因此客户端可以根据服务公开的公钥验证接收到的有效负载。
在 Express 中,如何在 JSON.stringify() 调用之后但在标头发送之前截取响应正文?
【问题讨论】:
我正在开发一个 Express.js 服务器;由于它管理敏感数据,我想使用私钥为每个响应添加加密签名。签名部分已经OK了,问题是在发送给客户端签名之前捕获JSON字符串。
理想情况下,我想添加一个自定义响应标头,例如X-signature,因此客户端可以根据服务公开的公钥验证接收到的有效负载。
在 Express 中,如何在 JSON.stringify() 调用之后但在标头发送之前截取响应正文?
【问题讨论】:
我复制了compression() 中间件中所做的事情,用我自己的方法替换了send() Response 方法,并在计算签名后调用原始方法。这是一个简化的解决方案,只是为了展示这个概念,实际上我已经处理了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);
【讨论】: