如何在 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);