express-jwt总是在验证用户时发送401未授权

时间:2017-03-31 09:35:27

标签: node.js express express-jwt

我有这个中间件功能,检查用户是否登录,因为我有web应用程序和Android平台因此我使用Android的令牌和web我正在使用会话,默认情况下经理通过护照。

In my function我正在检查如果我有一个Authorization标头,我知道它是我的android平台,因此通过验证jwt令牌来验证用户,但它总是发送给我401未经授权而不设置req.user。 / p>

这是中间件功能,如果有人可以在我的逻辑中错误地指出我的错误。

var jwt_auth = require('express-jwt')

// route middleware to make sure a user is logged in
function isLoggedIn(req, res, next) {

    if (req.get("Authorization")) {
        jwt_auth({secret: 'somesecret'});
        if (req.user) {
            return next();
        }
        res.send(200, "Unauthorized access");
    }
    else {
        // if user is authenticated in the session, carry on
        if (req.isAuthenticated())
            return next();

        // if they aren't redirect them to the home page
        res.redirect('/');
    }
}

1 个答案:

答案 0 :(得分:2)

那是因为jwt_auth是异步操作而你的res.send(200,“未经授权的访问”)永远不会等待jwt_auth完成。

你应该看一下express-jwt的例子。

基本的是

var jwt = require('express-jwt');

app.get('/protected',
    jwt({secret: 'shhhhhhared-secret'}),
    function(req, res) {
        if (!req.user.admin) return   res.sendStatus(401);
       res.sendStatus(200);
});

如果要传递自定义函数以从请求中提取令牌,请使用getToken选项,以下示例取自快递jwt的README,您可以根据需要修改该函数。

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