Sails.js在每次调用时创建新会话

时间:2016-05-07 11:02:34

标签: sails.js

我有一个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而失败(由于该政策)。在请求标头中,我可以看到Originhttp://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。

由于一切“在我的机器上运行”,我怀疑我的配置在这两个域的某处存在问题。

非常感谢任何帮助。

2 个答案:

答案 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', ...  }