我如何访问 getToken

How do I access getToken in

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

像这样:

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.

中第一个示例的组合

一个有用的小技巧是添加 unless 这使得每个 URL 除了 unless 指定的那些都需要一个标记。

这意味着您不需要为 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-jwtindex.js,其中详细介绍了 getToken 的工作原理:

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

获取 JWT 和 Bearer 令牌的另一种方法是:

获取 JWT 令牌

let token = req.headers.authorization && req.headers.authorization.match(/^JWT (.*)$/);
if (token && token[1]) { token = token[1]; }
if (!token) { throw ['missingRequired']; }

获取不记名令牌

let token = req.headers.authorization && req.headers.authorization.match(/^Bearer (.*)$/);
if (token && token[1]) { token = token[1]; }
if (!token) { throw ['missingRequired']; }

要支持两种类型的令牌:

let token = req.headers.authorization
  && (
    req.headers.authorization.match(/^JWT (.*)$/)
    || 
    req.headers.authorization.match(/^Bearer (.*)$/)
  );
if (token && token[1]) { token = token[1]; }
if (!token) { throw ['missingRequired']; }