一个有用的小技巧是添加unless
使除由除非指定的 URL 之外的每个 URL 都需要令牌的 URL。
这意味着您不需要为app.get
要保护的 api 中的每个路径创建一个(除非您想要为每个路径创建不同的秘密,我不知道您为什么要这样做)。
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
是,现在您已经最大限度地减少了从用户那里获取每条路径的令牌所需的工作量。
请参阅index.js,express-jwt
其中会告诉您有关如何getToken
工作的更多信息:
- 如果将选项指定为函数,则令牌值是函数的返回值
- 这意味着您可以提供自定义逻辑来处理您的令牌,并且可能是一个有用的地方来调用
verify
.
- 否则,它会运行标准逻辑,以从 Authorization 标头中提取令牌,格式为“[Authorization Bearer] [token]”(我用括号表示它在哪里拆分字符串)。