【问题标题】:Express middleware Passport not responding unauthorizedExpress 中间件 Passport 未经授权未响应
【发布时间】:2016-07-29 21:59:10
【问题描述】:

护照

passport.use('jwt', new JwtStrategy(opts, function(jwt_payload, done) {
    User.where({id: jwt_payload.id}).fetch().then(function(user) {
        if(user) {
            return done(null, user);
        } else {
            return done(null, false);
        }
    }).catch(function(err) {
        return done(err, false);
    });
}));

示例 2
这可行,但是当未设置 JWT 时,当我认为应该收到 401 响应时,我会收到 res = null

app.get('/user', getProfile);
getProfile = function(req, res, next) {
    passport.authenticate('jwt', {session: false}, function(err, user, info) {
        if(user) {
            res.json(user);
        } else {
            res.json(err);
        }
    })(res, req, next);
};

示例 2
当未设置 JWT 时,我会得到正确的 401 响应,但如果已设置,我将无法返回 user,因为 res 不存在。

app.get('/user', passport.authenticate('jwt', {session: false}, getProfile);
getProfile = function(err, user) {
    if(user) {
        res.json(user); 
    } else {
            res.json(err);
    }
};

那么如何将 res 传递给这个函数呢?

【问题讨论】:

    标签: node.js express passport.js jwt


    【解决方案1】:

    示例 1

    在您的第一个示例中,您似乎只是在函数调用中混淆了reqres 的顺序。应该是

    })(req, res, next);
    

    不是

    })(res, req, next);
    

    示例 2

    在您的第二个示例中,我认为您错误地使用了对 passport.authenticate 的回调。

    passport.authenticate 方法只是在你的实际路由被命中之前调用的中间件。它的回调不会取代您定义的用于处理发送响应的常规路由回调函数 - 您仍然需要在中间件之后提供路由回调。

    app.get('/user',
    passport.authenticate('jwt', { session: false }),
    function(req, res, next) {
      res.json(req.user);
    });
    

    如果用户未通过身份验证,authenticate 方法应使用适当的状态代码处理响应,因此您可以在路由回调中安全地调用 req.user 并知道用户已通过身份验证。

    【讨论】:

      猜你喜欢
      • 2017-01-12
      • 2018-02-02
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多