在express-jwt docs中有一个引用,可以使用getToken函数从请求中获取令牌。
如何在路线中使用此呼叫?
app.use(jwt({
secret: 'hello world !',
credentialsRequired: false,
getToken: function fromHeaderOrQuerystring (req) {
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
return req.headers.authorization.split(' ')[1];
} else if (req.query && req.query.token) {
return req.query.token;
}
return null;
}
}));
答案 0 :(得分:4)
一个有用的小技巧是添加unless
除了需要一个令牌之外,它会生成除指定之外的每个URL。
这意味着您不需要为您要保护的api中的每个路径创建app.get
(除非您想要为每个路径保留不同的秘密,我不知道您为什么会这样做)。
var jwt = require('jsonwebtoken');
var expressJWT = require('express-jwt');
app.use(
expressJWT({
secret: 'hello world !',
getToken: function fromHeaderOrQueryString (req) {
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer')
return req.headers.authorization.split(' ')[1];
else if (req.query && req.query.token)
return req.query.token;
return null;
}
}).unless({ path: ['/login'] }));
// Test paths
app.get('/login', function (req, res) {
res.send("Attempting to login.");
});
app.get('/otherurl', function (req, res) {
res.send('Cannot get here.');
});
或者您只需将其指定为单个路径:
app.get('/protected',
expressJWT({
secret: 'hello world !',
getToken: function fromHeaderOrQueryString (req) {
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer')
return req.headers.authorization.split(' ')[1];
else if (req.query && req.query.token)
return req.query.token;
return null;
}
}));
请注意配置中get
和use
的更改。
对于通过express-jwt
提供的每个路径,如果在配置中指定,则运行函数getToken
。
添加unless
的好处在于,现在您已经最大限度地减少了为了从每个路径的用户那里获取令牌所需的工作量。
请参阅express-jwt
的{{3}},它会告诉您有关getToken
如何运作的更多信息:
verify
的有用位置。 答案 1 :(得分:1)
像这样:
app.get('/protected',
jwt({
secret: 'hello world !',
credentialsRequired: false,
getToken: function fromHeaderOrQuerystring(req) {
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
return req.headers.authorization.split(' ')[1];
} else if (req.query && req.query.token) {
return req.query.token;
}
return null;
}
})
);
只需在传递给jwt中间件的对象中添加getToken
字段即可。它是问题中的示例和documentation中的第一个示例的组合。