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

express-jwt always sending 401 unauthorized while verifying user

我有这个 middle-ware 函数来检查用户是否登录,因为我有网络应用程序和 android 平台,因此我使用令牌 android 对于网络,我使用的是 session,默认情况下它是 passport 的管理器。

In my function 我正在检查是否有授权 header,我知道这是我的 android 平台,因此通过验证 jwt 令牌来验证用户,但它总是向我发送 401未经授权且未设置 req.user.

这里是middle-ware函数,如果有人能指出我的错误,我的逻辑哪里出了问题。

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('/');
    }
}

那是因为 jwt_auth 是一个异步操作,您的 res.send(200, "Unauthorized access") 永远不会等待 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选项,下面的例子取自express 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;
  }
}));