我有一個僅作爲API使用的Sails.js(v0.12.0)應用程序。單個頁面應用程序會在此應用程序中對端點執行ajax調用。Sails.js在每次調用時創建新會話
路由'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應用程序和Redis,以及使用郵遞員本地(即localhost域中的所有內容)。
將應用程序部署到我們即將生產的系統時出現問題。用戶界面是一個運行在Apache上的php應用程序,它爲該網站的所有網頁內容提供服務。
此前端應用程序的某些部分使用我們的sails.js後端,它在第二個服務器上運行,例如, http://1.1.1.1/index.php
已加載,從此單頁應用程序調用ajax調用爲http://1.1.1.2/login
等。 尚未註冊域名,我們僅在測試時使用這兩個IP地址。這裏使用的ip只是例子。
當在sails應用程序中調用/login
時,用戶通過身份驗證並更新會話,使用redis-cli可以看到該會話是正確的。 (Redis也在node/sails框中運行)。
/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的失敗。
因爲一切都「在我的機器上工作」我懷疑我的配置有關於這兩個域的問題。
任何幫助將不勝感激。