12

express-jwt 文档中,有一个关于能够使用 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;
  }
}));
4

2 回答 2

7

一个有用的小技巧是添加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.jsexpress-jwt其中会告诉您有关如何getToken工作的更多信息:

  • 如果将选项指定为函数,则令牌值是函数的返回值
    • 这意味着您可以提供自定义逻辑来处理您的令牌,并且可能是一个有用的地方来调用verify.
  • 否则,它会运行标准逻辑,以从 Authorization 标头中提取令牌,格式为“[Authorization Bearer] [token]”(我用括号表示它在哪里拆分字符串)。
于 2015-05-30T00:51:42.757 回答
2

像这样:

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

只需getToken在传递给 jwt 中间件的对象中添加字段即可。它是问题中的示例和文档中的第一个示例的组合。

于 2015-05-26T15:21:31.123 回答