JWT 和 express-JWT 有问题

Posted

技术标签:

【中文标题】JWT 和 express-JWT 有问题【英文标题】:Having issues with JWT and express-JWT 【发布时间】:2016-04-04 00:00:10 【问题描述】:

我正在测试 express-jwt 和 jsonwebtokens。我以前从未使用过它,希望得到一些帮助!

我已经完成了基本设置,我只有一条受保护的路线。

app.use('/api', expressJWT(secret: 'cat'));

不幸的是,我无法访问“/api”,因为它给了我这个错误

UnauthorizedError: No authorization token was found

如果我使用 POSTman 并发出带有以下标头的 GET 请求

Authorization -> Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImJhc2hpciIsImlhdCI6MTQ1MTQ0MjM4NywiZXhwIjoxNDUxNDQyNjg3fQ.CnaLvS_oCEy_mp_9MSAmTTylJqQMI2Qlq9V3emAmN3E

一切正常,我可以访问“/api”中的内容。

但我的问题在于我的 express 应用程序,特别是当我尝试将用户重定向到新的受保护路由时。

用户登录,我创建一个新的 jwt 令牌并将用户重定向到 '/api'

router.post('/login', passport.authenticate('local'), function (req, res) 
    myToken = jwt.sign(
      username: req.body.username
    , 'cat', expiresIn: 60*5);
    res.redirect('/api');
);

在这条路线中,我设置标题并呈现页面。

router.get('/api',  function (req, res) 
  res.render('index', user: req.user);
);

不幸的是,我收到以下错误

UnauthorizedError: No authorization token was found

我的目标是能够将用户重定向到受保护的路线。

据我了解,由于 /api 是受保护的路由,express-jwt 应该设置我的授权标头。即使我尝试使用中间件手动设置标题,我仍然会收到错误。

非常感谢任何帮助!

谢谢!

【问题讨论】:

【参考方案1】:

尝试类似res.redirect('/api?token ' + myToken);

然后为了接收查询输入,将 expressJWT 普通函数更改为自定义函数。

app.use('/api', expressJWT(
  secret: 'cat',
  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;
  
));

这主要来自阅读 expressJWT 文档和其他堆栈答案。

【讨论】:

非常感谢!你是通过 reddit 看到的吗? 在 reddit 上发布你的答案,这样我就可以给你金币了!

以上是关于JWT 和 express-JWT 有问题的主要内容,如果未能解决你的问题,请参考以下文章

express-jwt 的任何完整示例? [关闭]

使用 angular 和 express-jwt 实现刷新令牌

express-jwt 不尊重不受保护的路径

如何查看存储在 JWT 中的数据?使用 auth0 和 express-jwt

Express-jwt 中间件打字稿类型问题

如何在 express-JWT 中获取授权令牌?