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

Rya*_*uck 4 javascript redirect angularjs passport.js

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

app.post('/login', passport.authenticate('local', { successRedirect: '/',
                                                failureRedirect: '/login' }));
Run Code Online (Sandbox Code Playgroud)

当我有我的表单时,重定向工作:

<form action="/login" method="post">
  ...
</form>
Run Code Online (Sandbox Code Playgroud)

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

<form ng-submit="submitLogin(name,password)">
  ...
</form>
Run Code Online (Sandbox Code Playgroud)

MainController.js

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

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

Rya*_*uck 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);
  });
Run Code Online (Sandbox Code Playgroud)

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

调节器

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