对passportjs+Node.js+Express.js Rest API调用成功身份验证和失败的路由处理程序

Invoke route handlers on both, Successful Authentication and failure, for passportjs + Node.js + Express.js Rest API

本文关键字:失败 路由 程序 处理 身份验证 成功 js+Express passportjs+Node js Rest 调用      更新时间:2023-09-26

请使用Rest API的passport基本策略来查看此基本登录/令牌过程:

路线:

router.get('/token', authenticate.basic, controller.token);

验证基本策略:

authenticate.basic = passport.authenticate('basic', {session: false});
/* implementation of the Basic Strategy*/
passport.use('basic', new BasicStrategy(function(username, password, done) {
    authenticationService.login(username, password).then(function(user) {
        if (!user) { 
              return done(null, false, { message: 'Login failed' }); 
        }
        return done(null, user);    
    }).catch(function(e) {
        return done(e)
    });
}));

令牌控制器(路由处理程序):

controller.token = function(req, res, next) {
    if (!req.user) {
        // TODO fix this dead branch 
        return res.json(401, {error: "Login failed"});
    }
    authService.issueToken(req.user).then(function(token) {
        var user = {
            user_id: req.user.id,
            access_token: token
        }           
        return res.json(user);
    }).catch(function(e) { 
        return next(e);
    });
};

如文件中所述:

默认情况下,如果身份验证失败,Passport将返回401未授权状态,任何其他路由处理程序都不会调用。如果身份验证成功,将调用下一个处理程序req.user属性将被设置为经过身份验证的用户。

有没有一种方法可以绕过这种行为,即使身份验证失败也可以调用路由处理程序?

您正在寻找Passport的"自定义回调"功能。

基本上,您需要为authenticate方法提供第三个参数来覆盖默认行为。这意味着应用程序将负责登录用户,这只是调用req.login()方法的问题。

authenticate.basic = function (req, res, next) {
  passport.authenticate('basic', {
    session: false
  }, function(err, user, info) {
    if (err) {
      // Authentication failed, you can look at the "info" object
      return next(err);
    }
    if (!user) {
      // The user is not logged in (no token or cookie)
      return res.redirect('/login');
    }
    req.login(user, function(err) {
      if (err) {
        // Something wrong happened while logging in, look at the err object
        return next(err);
      }
      // Everything's good!
      return res.redirect('/users/' + user.username);
    });
  })(req, res, next);
}