如何在

时间:2015-05-20 13:02:20

标签: express-jwt

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;
  }
}));

2 个答案:

答案 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;
      }
 }));

请注意配置中getuse的更改。

对于通过express-jwt提供的每个路径,如果在配置中指定,则运行函数getToken

添加unless的好处在于,现在您已经最大限度地减少了为了从每个路径的用户那里获取令牌所需的工作量。

请参阅express-jwt的{​​{3}},它会告诉您有关getToken如何运作的更多信息:

  • 如果将选项指定为函数,则标记值是函数的返回值
    • 这意味着您可以提供用于处理令牌的自定义逻辑,并且可能是调用verify的有用位置。
  • 否则它运行标准逻辑,用于从Authorization标头中提取令牌,格式为'[Authorization Bearer] [token]'(我用括号表示它分割字符串的位置)。

答案 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中的第一个示例的组合。