使用AngularJS $ http到POST时,PassportJS重定向无法正常工作

时间:2014-12-07 02:29:22

标签: javascript angularjs redirect passport.js

我正在使用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>

MainController.js

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

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

1 个答案:

答案 0 :(得分:5)

我不确定为什么重定向不适用于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);
  });

我们只是将消息发送回Angular,而不是使用res.redirect()

<强>控制器

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