浏览器刷新

时间:2016-08-30 23:32:54

标签: javascript angularjs node.js express cookies

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

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

此处还有其他Cookie由Google Analytics设置,但每次都会随请求一起发送。如果我在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
      });
    });
  });

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

'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'
          });
        });
    });
  };
};

如果您希望看到其他部分代码,请告诉我们。谢谢,如果你提供所有帮助,请致谢!

2 个答案:

答案 0 :(得分:1)

所以我明白了。我使用/admin/login作为我的登录路由,/admin/whatever用于需要auth的其他路由,因此使用路径/admin/login设置cookie,因为我只在第一次使用该路由登录,这是第一次发送cookie的原因,但不是后续请求中的。

为了解决这个问题,我在设置这样的cookie时将路径设置为root:

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

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

答案 1 :(得分:0)

您说Cookie已已发送,然后您在浏览器中说明了 。这两个陈述相互矛盾。如果他们在浏览器中,也许您的Angular应用程序只需要阅读它们?如果没有发送它们,也许您需要在服务器上使用某种会话来存储令牌/其他任何内容,以便您可以将其作为cookie发回。