我正在使用JWT令牌来验证我的应用程序中的用户。我将我的令牌发送到后端req.headers.access_token
检查我是否在数据库中找到当前令牌并且它是否仍然有效,如果是,我更新令牌(更新expires
)然后转到当前路由。这部分就像它应该的那样工作。
我的问题是将令牌发送回前端,以便客户端可以使用更新的令牌发送下一个请求,但到目前为止我尝试的所有内容都没有正确更新标头:
res.header.access_token = token;
res.setHeader('access_token', token);
没用。
我读到的某个地方我还需要添加Access-Control-Expose-Headers
,所以我在快速设置中添加了以下内容:
app.use(function (req, res, next) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type, Authorization, access_token');
res.setHeader('Access-Control-Expose-Headers', 'X-Requested-With,content-type, Authorization, access_token');
next();
});
但存在同样的问题。
问题:
我使用jwt-simple
lib作为我的jwt
答案 0 :(得分:1)
在 ExpressJS 4.x 中使用res.set(field [, value])
(而不是res.setHeader(field, value);
。例如
res.set({
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE',
'Access-Control-Allow-Headers': 'X-Requested-With,content-type,Authorization, access_token',
'Access-Control-Expose-Headers': 'X-Requested-With,content-type, Authorization, access_token'
});
您正在以错误的方式处理令牌。您不必生成新令牌并在每次请求时发回给用户。在创建令牌时,您可以为令牌提供到期时间(使用jsonwebtoken NodeJS模块)。
var jwt = require('jsonwebtoken');
var profile = {
first_name: 'John',
last_name: 'Doe',
email: 'john@doe.com',
};
var token = jwt.sign(profile, secret, { expiresInMinutes: 60*5 });
当请求到达服务器时,您可以使用jwt.verify(token, secretOrPublicKey, [options, callback])
功能对其进行验证。或者,由于您使用的是ExpressJS,因此可以使用JWT Express中间件。
var expressJwt = require('express-jwt');
// protect /api routes with JWT
app.use('/api', expressJwt({secret: secret}));
有关更多选项,请参阅express-jwt NodeJS模块。
<小时/> 参考:Cookies vs Tokens. Getting auth right with Angular.JS