在Angular App中设置登录

时间:2014-12-30 00:10:26

标签: angularjs node.js mean-stack

我正在尝试为角度应用程序实现持久登录。通过持久性我的意思是我能够重定向到新页面或刷新而不会被注销。这是一个两部分问题。

1)我很确定我的登录工作正常,但我的退出按钮给了我一个POST http://localhost:3000/api/sessions 500 (Internal Server Error)

2)我现在无法在刷新后或重定向第三方身份验证后将用户名显示在我的应用程序的右上角。 (我还应该提到我正在使用getUser()并获得GET http://localhost:3000/api/users 401 (Unauthorized)返回

我的代码是:

HTML

<section class="top-bar-section" ng-controller="LoginCtrl">
    <ul class="right">
      <li>
        <a ui-sref="dashboard">Dashboard</a>
      </li>
      <li class="pink">
        <a ui-sref="post-item">Post New Item!</a>
      </li>
      <li>
        <a ng-click='logout()'>Logout</a>
      </li>
      <li class="has-dropdown">
        <a href=""><span ng-if="currentUser">{{ currentUser.username }}</span></a>
        <ul class="dropdown">
          <li><a href="http://google.com">Settings</a></li>
          <li><a ng-click="logout()">Logout</a></li>
        </ul>
      </li>
    </ul>
  </section>

routes.js

  app.post('/api/sessions', function(req, res, next) {
    User.findOne({username: req.body.username})
    .select('password').select('username')
    .exec( function(err, user){
      if (err) {return next(err)}
      if (!user) {return res.send(401)}
      bcrypt.compare(req.body.password, user.password, function (err, valid){
        if (err) {return next(err)}
        if (!valid) {return res.send(401)}
        var token = jwt.encode({username: user.username}, config.secret)
        res.send(token)
      })
    })
  })

  app.get('/api/users', function(req, res, next) {
    if(!req.headers['x-auth']){
      return res.send(401)
    }
    var auth = jwt.decode(req.headers['x-auth'], config.secret)
    User.findOne({username: auth.username}, function (err,user){
      if (err) {return next(err)}
        res.json(user)
    })
  })

  app.post('/api/users', function(req, res, next) {
    var user = new User({username: req.body.username})
    bcrypt.hash(req.body.password, 10, function (err, hash){
      if (err) {return next (err)}
      user.password = hash
      user.save(function (err){
        res.send(201)
      })
    })
  })

angular.js

 app.service('UserSvc', function($http, $window){
    var svc = this;
    svc.getUser = function() {
      return $http.get('/api/users',{
        headers: { 'X-Auth': this.token }
      })
    }
    svc.login = function(username, password){
      return $http.post('/api/sessions', {
        username: username, password: password
      }).then(function(val){
        svc.token = val.data
        // window.localStorage.token = val.data
        return svc.getUser()
      })
    }

    svc.logout = function() {
      $http.post('/api/sessions', {
        username: null, password: null
      }).then(function(val){
        svc.token = null
        // window.localStorage.token = val.data
      })
    }
  })

  app.controller('LoginCtrl', function($scope, $location, UserSvc){
    $scope.login = function(username, password) {
      UserSvc.login(username, password)
      .then(function(response) {
        $scope.$emit('login', response.data)
        $location.path('/dashboard');
      })
    }
    $scope.logout = function() {
      UserSvc.logout();
      $scope.$emit('logout')
    }
  });

  app.controller('ApplicationCtrl', function($scope, UserSvc) {

    angular.element(document).ready(function () {
      $scope.currentUser = UserSvc.getUser();
    })

    $scope.modalShown = true;

    $scope.$on('login', function (_, user){
      $scope.currentUser = user;
    })

    $scope.$on('logout', function (){
      $scope.currentUser = null;
    })
  });

如果有人有任何指示,请告诉我!我花了很多时间在这上面:(

3 个答案:

答案 0 :(得分:1)

1)当您退出时,您的/api/sessions端点正在查找数据库中用户名为null的用户,其中包含查询User.findOne({username: null})

2)getUser()正在使用'X-Auth'设置标题(请注意大写字母),但您要在{?1}}

的用户端点检查小写

答案 1 :(得分:1)

为了实现客户端持久性,我使用角度为$cookieStore的服务将令牌保存在本地存储中。 它是一个键值存储。 要将令牌存储在存储中,请使用:
$cookieStore.put('token', data.token)
并将其取回使用:
$cookieStore.get('token')

希望有所帮助

答案 2 :(得分:0)

@XxscurvyxX:您还可以使用$ window.sessionStorage,它基于键/值对,并为getter和setter提供。

语法:

$window.sessionStorage.setItem(key, value) // key: String value: String
$window.sessionStorage.getItem(key) // key: String

键/值对存储在会话存储中,直到您关闭选项卡或关闭浏览器。