javascript - 浏览器刷新后,AngularJS 设置的 Cookie 将被忽略

标签 javascript angularjs node.js express cookies

我正在使用 SQL、Angularjs、Node.js 和 Express 创建一个 Angularjs 单页应用程序,它使用护照和基本身份验证进行登录。当用户登录时,他们可以访问路由来编辑数据库中的项目。这一切都工作正常,问题是只有浏览器不刷新时才会发送 cookie。

如果浏览器刷新, token 将不再与请求一起发送,因此用户无法再访问路由,因为请求中没有 token 。但是,如果您查看浏览器中的 cookie, token 仍然存在,并且只要服务器未重新启动, token 就应该仍然有效。

还有其他由 Google Analytics 设置的 cookie,但它们每次都会随请求一起发送。如果我在 app.run 中设置一个 cookie,它会持续存在并每次都随请求一起发送,只有使用登录工厂创建的 cookie 在浏览器刷新后不会发送。

我的登录工厂如下所示:

'use strict';

import * as customFunctions from '../../shared/methods/common-functions.js';

const userLoggingRESTResources = (app) => {

  app.factory('userLoggingRESTResources', ['$http', '$base64', '$cookies', '$window', ($http, $base64, $cookies, $window) => {
    return (user, callback) => {
      return {
        signIn: (user, callback) => {
          var encoded = $base64.encode(user.username + ':' + user.password);
          $http.get('/auth/login', {
              headers: {
                'Authorization': 'Basic ' + encoded
              }
            })
            .success((data) => {

              $cookies.put('token', data.token);
              $cookies.put('interopAdmin', data.admin);
              $window.sessionStorage.token = data.token;
              $http.defaults.headers.common.Authorization = data.token;
              callback(null);
            })
            .error((data) => {
              callback(data);
            })
        }

      };
    }


  }])
}

module.exports = userLoggingRESTResources;

我的登录路线如下所示:

  router.get('/login', passport.authenticate('basic', {
    session: false
  }), (req, res) => {
    let userJSON = {
      randomString: req.user.dataValues.randomString,
      id: req.user.dataValues.id
    };
    res.req.headers.authorization = 'hahaha';
    for (let key in res.req.rawHeaders) {
      if (res.req.rawHeaders[key].slice(0, 5) === 'Basic') {
        res.req.rawHeaders[key] = 'Basic xxxx';
      }

    }
    req.user.$modelOptions.instanceMethods.generateToken(userJSON, process.env.SECRET_KEY, (err, token) => {
      if (err) {
        console.log(err);
        return res.status(500).json({
          msg: 'error generating token'
        });
      }

      res.status('200').header('token', token).json({
        token: token,
        'admin': req.user.dataValues.isAdmin
      });
    });
  });

我正在使用eat npm 中的模块用于处理 token 解码:

'use strict';

const eat = require('eat');
const models = require('../models');
const User = models.User;
const clc = require('cli-color');

module.exports = (secret) => {
  return (req, res, next) => {
    let token = req.cookies.token || req.headers.token || req.body.token || req.headers.authorization;
    if (!token) {
      console.log(clc.white.bgRed('no token in request'));
      return res.status(401).json({
        msg: 'not authorized'
      });
    }
    eat.decode(token, secret, (err, decoded) => {
      if (err) {
        console.log(clc.white.bgRed('Error, login failed:   '), err);
        return res.status(401).json({
          msg: 'not authorized'
        });
      }

      User.findOne({
          where: {
            id: decoded.id
          }
        })
        .then((user) => {
          if (!user) {
            console.log(clc.white.bgRed('user not found'));
            return res.status(401).json({
              msg: 'not authorized'
            });
          }

          req.user = user;
          next();
        })
        .error((error) => {
          console.log(clc.white.bgRed('Error:  '), err);
          return res.status(401).json({
            msg: 'not authorized'
          });
        });
    });
  };
};

如果您想查看代码的其他部分,请告诉我。提前感谢您提供的所有帮助!

最佳答案

所以我想通了。我使用 /admin/login 作为我的登录路由,使用 /admin/whatever 作为需要身份验证的其他路由,因此使用以下路径设置 cookie:/admin/login 并且由于我只在第一次登录时使用该路由,这就是为什么第一次发送 cookie,但在后续请求中不发送 cookie。

为了解决这个问题,我在设置 cookie 时设置了根路径,如下所示:

$cookies.put('token', data.token, {'expires': expireDate, 'path': '/'});

现在 cookie 会随所有请求一起发送!感谢您的所有提示和帮助:-)

关于javascript - 浏览器刷新后,AngularJS 设置的 Cookie 将被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39238600/

相关文章:

javascript - 如何在 jquery 插件中使用悬停事件?

angularjs - 从 Angular 1.0 切换到 1.2.3 的未知提供商

html - Spring Boot 与 AngularJS html5Mode

node.js - 在运行测试之前清理测试数据库

javascript - 当相应的页面 div 可见时,使用 jQuery 将一类事件添加到导航项?

javascript - Angularjs - 扩展 ngModel

javascript - Express 服务器 404ing 所有来自索引的请求

javascript - Angular JS 深度链接是如何工作的

heroku 上的 node.js : Error: Cannot find module 'csv'

node.js - 如何从 saveAsync 返回 Mongoose 对象?