MEAN Stack + passport本地:在单页应用程序上使用会话

时间:2015-09-25 10:08:07

标签: authentication meanjs passport-local

我尝试实现本教程,介绍如何将身份验证过程添加到MEAN应用程序: http://mherman.org/blog/2015/07/02/handling-user-authentication-with-the-mean-stack/#.VgUaT_mqpBc

我试图实现的改变是让应用程序成为单页应用程序...所以我留下的唯一路线是登录的帖子路径...我正在解决登录问题,因为如果我可以做那个工作..其余的将遵循

所以我的应用程序包含一个填充页面的谷歌地图和两个打开模态窗口的按钮(登录和注册)...里面我有登录表单...这里是模态的角度控制器的代码窗口和玉石模板

控制器:

angular.module('myApp')
  .controller('ModalInstanceCtrl', ['$scope', '$modalInstance', 'settings', '$location', 'AuthService', function ($scope, $modalInstance, settings, $location, AuthService) {
    $scope.settings = settings;
    $scope.texts = {
      login: {
        title: "Login details",
        button: "Login"
      },
      register: {
        title: "Registration form",
        button: "Register"
      }
    };
    $scope.register = function () {
      $modalInstance.close();
    };
    $scope.login = function () {
      // initial values
      $scope.error = false;
      // call login from service
      AuthService.login($scope.loginForm.username, $scope.loginForm.password)
        // handle success
        .then(function () {
          console.log(AuthService.getUserStatus());
          $modalInstance.close();
        })
        // handle error
        .catch(function () {
          $scope.error = true;
          $scope.errorMessage = "Invalid username and/or password";
        });
      //$modalInstance.close();
    };
    $scope.cancel = function () {
      $modalInstance.close();
    };
  }])

模态窗口的玉模板:

div(class="modal-header")
  h3(class="modal-title") {{texts[settings.action].title}}
  div(class="modal-body")
    div(ng-show="error", class="alert alert-danger")
    form(class="form", ng-submit="login()")
      div(class="form-group")
        label Username
        input(type="text", class="form-control", name="username", ng-model="loginForm.username")
      div(class="form-group")
        label Password
        input(type="password", class="form-control", name="password", ng-model="loginForm.password")
  div(class="modal-footer")
    button(ng-show="settings.action=='login'", class="btn btn-primary", type="button", ng-click="login()") {{texts.login.button}}
    button(ng-show="settings.action=='register'", class="btn btn-primary", type="button", ng-click="register()") {{texts.register.button}}
    button(class="btn btn-warning", type="button", ng-click="cancel()") Cancel

所以我的pb是这样的:护照身份验证正确执行..我得到登录成功消息...但是刷新...如果我运行AuthService.isLoggedIn()..我得到假.. 。

这是服务:

angular.module('myApp').factory('AuthService',
  ['$q', '$timeout', '$http',
    function ($q, $timeout, $http) {

      // create user variable
      var user = null;

      // return available functions for use in controllers
      return ({
        isLoggedIn: isLoggedIn,
        getUserStatus: getUserStatus,
        login: login,
        logout: logout,
        register: register
      });

      function isLoggedIn() {
        if(user) {
          return true;
        } else {
          return false;
        }
      }

      function getUserStatus() {
        return user;
      }

      function login(username, password) {

        // create a new instance of deferred
        var deferred = $q.defer();

        // send a post request to the server
        $http.post('/user/login', {username: username, password: password})
          // handle success
          .success(function (data, status) {
            if(status === 200 && data.status){
              user = true;
              deferred.resolve();
            } else {
              user = false;
              deferred.reject();
            }
          })
          // handle error
          .error(function (data) {
            user = false;
            deferred.reject();
          });

        // return promise object
        return deferred.promise;

      }

    }]);

这是passport.authenticate

的邮寄路线
router.post('/login', function (req, res, next) {
  passport.authenticate('local', function (err, user, info) {
    if (err) {
      return next(err)
    }
    if (!user) {
      return res.status(401).json({err: info})
    }
    req.logIn(user, function (err) {
      if (err) {
        return res.status(500).json({err: 'Could not log in user'})
      }
      res.status(200).json({status: 'Login successful!'})
    });
  })(req, res, next);
});

0 个答案:

没有答案