遇到JWT和express-JWT的问题

时间:2015-12-30 02:50:52

标签: node.js json-web-token express-jwt

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

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

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

Unfortunatley,我无法访问'/ api',因为它给了我这个错误

UnauthorizedError: No authorization token was found

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

Authorization -> Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImJhc2hpciIsImlhdCI6MTQ1MTQ0MjM4NywiZXhwIjoxNDUxNDQyNjg3fQ.CnaLvS_oCEy_mp_9MSAmTTylJqQMI2Qlq9V3emAmN3E

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

但我的问题出在我的快递申请中,特别是当我尝试将用户重定向到新的受保护路线时。

用户登录并创建新的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 个答案:

答案 0 :(得分:2)

尝试类似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文档和其他堆栈答案。