2016-05-07 36 views
2

我有一個僅作爲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(由於該策略)。在請求頭中,我可以看到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.1http://1.1.1.2但初始會話不被再次使用來並且對受到isAuthenticated策略影響的任何端點的任何呼叫都將失敗,並且將導致403的失敗。

因爲一切都「在我的機器上工作」我懷疑我的配置有關於這兩個域的問題。

任何幫助將不勝感激。

回答

0

請確保您有配置爲您的應用程序相同的密鑰:session.js

module.exports.session = { secret: '123abc', ... } 
相關問題