PassportJS重定向在使用AngularJS$http开机自检时不起作用

PassportJS redirect not working when using AngularJS $http to POST

本文关键字:http 开机自检 不起作用 AngularJS 重定向 PassportJS      更新时间:2023-09-26

我正在使用passportJS进行用户身份验证。这在我的应用程序的路由中,用于验证登录信息。

app.post('/login', passport.authenticate('local', { successRedirect: '/',
                                                failureRedirect: '/login' }));

当我有这样的表单时,重定向有效:

<form action="/login" method="post">
  ...
</form>

但是当我将 Angular 的ng-submit$http.post('/login')方法一起使用时,重定向不会触发。登录确实有效,但重定向不起作用。

<form ng-submit="submitLogin(name,password)">
  ...
</form>

主控制器.js

$scope.loginSubmit = function(n,p) {
    $http.post('/login', {
      email: n,
      password: p
    });
};

为什么 Angular 会阻止重定向工作?

我不确定为什么重定向不适用于 Angular,但我找到了解决我的问题的方法。

我们需要将内容发送回 Angular,然后使用 $location.path(( 来处理重定向。

PassportJS 建议在简单的身份验证功能不够时使用自定义回调。

app.post('/login', function(req, res, next) {
    passport.authenticate('local-login', function(err, user, info) {
      if (err) {
        return next(err);
      }
      if (!user) {
        res.send({
          message: 'no user'
        });
      }
      req.login(user, function(err) {
        if (err) {
          return next(err);
        }
        res.send({
          message: 'logged in'
        });
      });
    })(req, res, next);
  });

我们没有使用res.redirect(),而是简单地将消息发送回Angular。

控制器

$http.post('/login', {
  email: n,
  password: p
})
.success(function(data) {
  if (data.message === 'logged in') {
    $location.path('/presents');
});