我正在使用 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/