【问题标题】:Lose cookie/session when reload page重新加载页面时丢失 cookie/会话
【发布时间】:2015-11-09 11:34:27
【问题描述】:

我有两个独立的应用程序:

  1. AngularJS 客户端在 http://localhost:8080 上工作
  2. NodeJS API 服务器在 http://localhost:3000 上工作

NodeJS API Server 只是将 json 数据提供给客户端(不提供任何 html 页面)。

我将认证用户的信息存储在 sessionStorage 中。

问题: 当我登录系统并重新加载页面时,我在 sessionStorage 中丢失了有关用户的信息。

这是我的 AngularJS 身份验证服务:

module.exports = function($http, $location, $cookies, $alert, $window) {
  $window.sessionStorage.setItem('currentUser',      JSON.stringify($cookies.get('user')));
  $cookies.remove('user');

  return {
   login: function(user) {
     return $http.post('http://localhost:3000/api/login', user).success(function(data) {
      $window.sessionStorage.setItem('currentUser', JSON.stringify(data));
      $location.path('/fillprofile');

      $alert({
        title: 'Cheers!',
        content: 'You have successfully logged in.',
        placement: 'top-right',
        type: 'success',
        duration: 3
      });
    }).error(function() {
        $alert({
          title: 'Error!',
          content: 'Invalid username or password.',
          placement: 'top-right',
          type: 'danger',
          duration: 3
        });
      });
  },
  signup: function(user) {
    return $http.post('http://localhost:3000/api/signup', user).success(function(data) {
      $location.path('/login');

      $alert({
        title: 'Congratulations!',
        content: 'Your account has been created.',
        placement: 'top-right',
        type: 'success',
        duration: 3
      });
    }).error(function(response) {
        $alert({
          title: 'Error!',
          content: response.data,
          placement: 'top-right',
          type: 'danger',
          duration: 3
        });
      });
  },
  logout: function() {
    return $http.get('http://localhost:3000/api/logout').success(function() {
      $window.sessionStorage.setItem('currentUser', null);
      $cookies.remove('user');
      $location.path('/login');

      $alert({
        content: 'You have been logged out.',
        placement: 'top-right',
        type: 'info',
        duration: 3
      });
    });
  }
};
};

NodeJS API

app.use(function(req, res, next) {
  if (req.user) {
    res.cookie('user', JSON.stringify(req.user));
  }
  next();
});

function ensureAuthenticated(req, res, next) {
  if (req.isAuthenticated()) next();
  else res.send(401);
}

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

passport.use(new LocalStrategy(function(username, password, done) {
  User.findOne({ username: username }, function(err, user) {
    if (err) return done(err);
    if (!user) return done(null, false);
    user.comparePassword(password, function(err, isMatch) {
      if (err) return done(err);
      if (isMatch) return done(null, user);
      return done(null, false);
    });
  });
}));

路线

app.post('/api/login', passport.authenticate('local'), function(req, res) {
  res.cookie('user', JSON.stringify(req.user));
  res.send(req.user);
});

app.post('/api/signup', function(req, res, next) {
  var user = new User({
    username: req.body.username,
    email: req.body.email,
    password: req.body.password
  });
  user.save(function(err) {
    if (err) return next(err);
    res.send(200);
  });
});

app.get('/api/logout', function(req, res, next) {
  req.logout();
  res.send(200);
});

【问题讨论】:

    标签: angularjs node.js cookies express passport-local


    【解决方案1】:

    我通过添加标题解决了这个问题

    res.header('Access-Control-Allow-Credentials', true);

    到我的 NodeJS API 服务器(CORS 启用部分)。而且我还需要使用withCredentials 属性从客户端发送http请求。

    $http({
        method: 'POST',
        url: 'http://localhost:3000/api/login',
        withCredentials: true,
        data: user
    });
    

    如上所述,cdurth 我需要删除 $cookies.remove('user'); 行。最后改变

    $window.sessionStorage.setItem('currentUser', JSON.stringify($cookies.get('user')));
    

    $window.sessionStorage.setItem('currentUser', $cookies.get('user'));
    

    【讨论】:

      【解决方案2】:

      尝试删除第 3 行的 $cookies.remove('user');

      【讨论】:

      • 他在使用 cookie 进行身份验证之前正在删除它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      • 2013-12-12
      • 2023-03-25
      • 2014-12-31
      • 2014-08-16
      相关资源
      最近更新 更多