我有一个Sails.js(v0.12.0)应用程序,仅用作API。单页应用程序会对此应用程序中的端点进行ajax调用。
路由'PUT /login'
用于对用户进行身份验证,在我的控制器中设置req.session.authenticated = true
。
policies.js文件包含'*':['isAuthenticated']
,用于控制器上的所有其他功能。
这个政策很简单:
module.exports = function isAuthenticated(req, res, next) {
if (req.session.authenticated) {
return next();
}
return res.forbidden('You are not permitted to perform this action.');
};
当我在Redis ("connect-redis": "^3.0.2")
中检查值时,我可以看到我在会话对象上设置的值。
随后,在调用'GET /profile'
时,它会通过策略,因为用户已通过身份验证。
这可以在我的开发机器(ubuntu)上使用sails app和Redis本地工作,也可以在本地使用Postman(即localhost域中的所有内容)。
将应用程序部署到即将出现的生产系统时会出现问题。 UI是在Apache上运行的php应用程序,用于为站点提供所有Web内容。
这个前端应用程序的某些部分使用我们的sails.js后端,后端在第二台服务器上运行,例如已加载http://1.1.1.1/index.php
,并且从此单页应用程序向http://1.1.1.2/login
等进行了ajax调用。
目前还没有域名注册,我们在测试时只使用这两个IP地址。这里使用的ip只是例子。
在sails应用程序中调用/login
时,会对用户进行身份验证并更新会话,使用redis-cli可以看出这是正确的。 (Redis也在节点/风帆盒上运行。)
对/profile
的下一次调用因403而失败(由于该政策)。在请求标头中,我可以看到Origin
为http://1.1.1.1
,Cookie包含sails.sid,响应包含Set-Cookie
,但是包含不同的sails.sid。
在redis-cli中,我可以看到为第二个调用创建了一个新会话,因此对/profile
的调用似乎不会使用相同的会话。
来自浏览器的电话:
$http({
method: 'GET',
url: 'http://1.1.1.2/profile',
withCredentials:true
})
.then(function (response) {
console.log(response);
});
在cors.js
,我有
module.exports.cors = {
allRoutes: true,
origin: 'http://1.1.1.1,http://1.1.1.2',
credentials: true,
methods: 'GET, POST, PUT, DELETE, OPTIONS, HEAD',
headers: 'content-type'
};
据我了解,这应允许来自http://1.1.1.1
的呼叫到http://1.1.1.2
,但初始会话不会再次使用,并且任何受isAuthenticated
策略约束的端点的调用都会失败与403。
由于一切“在我的机器上运行”,我怀疑我的配置在这两个域的某处存在问题。
非常感谢任何帮助。
答案 0 :(得分:0)
在处理多个域时,结果是令牌是答案。 从这里开始: https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/
答案 1 :(得分:0)
请确保您在config:session.js
中为这两个应用设置了相同的密钥module.exports.session = { secret: '123abc', ... }