我正在尝试使用JWT构建无状态API。我的路由器中有一个中间件功能,用于检查JWT是否已过期,如果有,则动态生成带有新时间戳的新令牌。
我想将新令牌与JSON对象中的响应一起传递。我目前的做法是这样的,但它当然不起作用:
router.use(function (req, res, next) {
// JWT Expired
// Generate new JWT
res.write(JSON.stringify({token: token});
next();
});
router.get('/securedRoute' function(req, res) {
// Fetch data
res.json({data: data});
});
// Output should be:
{token: 'erg34jlkgjre.3f4fknlj.34f3', data: ['sdfa', 'sdf']}
找到一种方法会很好,我不必改变现有的所有代码并检查是否有新的令牌。
感谢您的帮助!
答案 0 :(得分:1)
一种选择是在response
标题中添加授权令牌:
router.use((request, response, next) => {
response.setHeader('Token', token);
next();
});
router.get('/securedRoute', (request, response) => {
response.json({ data: data });
});
或者,您始终可以将令牌添加到request
,然后有条件地将request.token
添加到您的所有路由中,就像上一个建议的回答一样。不幸的是,这意味着您需要修改所有路线。
作为替代方法,您可以覆盖response.json
方法并手动注入令牌(如果存在)。这样做,您就不需要修改任何路线。
router.use((request, response, next) => {
request.token = token;
((proxied) => {
response.json = function (data) {
if (request && request.token) {
data.token = request.token;
}
return proxied.call(this, data);
};
})(response.json);
next();
});
router.get('/securedRoute', (request, response) => {
response.json({ data: data });
});
在上面的示例中,中间件中覆盖了response.json
方法。这是通过传递对旧response.json
方法的引用,然后在有条件地将令牌注入有效负载后调用它来完成的。
答案 1 :(得分:0)
答案是假设你想用同样的方法实现它
而不是在中间件中编写令牌,而不是像
那样(req,res,next)=>{
req.token = newToken;
next();
}
并在你的路线
res.json(req.token ? {token:req.token,data:data} : {data:data});