我正在使用Sails.js並嘗試執行簡單登錄並將用戶信息保存到會話中。這裏是我的登陸行動代碼:Sails.js會話未按第一次請求保存
AuthService.login(req.body.email, req.body.password).then(user => {
// save user information in the session
req.session.user = user;
req.session.authenticated = true;
return res.json({
user:user,
token:token
});
}).catch(err => {
sails.log.error(err);
res.json(403, {
callstack: err.callstack,
error: 'Authentication error',
reason : err.reason
});
});
這是我對其他網頁策略(登錄後):
module.exports = function(req, res, next) {
// User is allowed, proceed to the next policy,
if (req.session.authenticated && req.session.user) {
return next();
}
// User is not allowed
return res.forbidden('You are not permitted to perform this action. (Authenticated)');
};
問題是會話數據不會保存爲先請求意思我得到403禁止只有第一次成功登錄後。因此,我必須註銷然後重新登錄才能顯示會話數據。
問題是不是僅限於登錄(使用身份驗證策略),但也適用於需要會話數據的任何操作,無論是否使用策略。對於每個新的會話都會發生 - 不僅是服務器第一次啓動。
我認爲問題是由於使用內存中的會話,所以我也試着配置Sail.js通過修改配置/ session.js以下與Redis的作爲會話存儲工作:
adapter: 'redis',
// host: 'localhost',
// port: 6379,
// ttl: 60*60*20,
// db: 0,
// prefix: 'sess:',
我註釋掉適配器線,並有和沒有可選redis的連接參數,但隨後的req.session被宣佈未定義到處
不知道發生了什麼,我從來沒有遇到過這樣的問題。但是,爲什麼不將會話信息放入JWT令牌中?正如我可以看到你正在使用令牌邏輯... – hlozancic
我想這可以是一種解決方法,只需將其放入JWT令牌中,但稍後就會失敗帆的目的... – Aaron
我的猜測是你有一個競爭條件兩個cookie正在爲同一會話設置。也許是前端的加載微調器加載了一些webfont的圖標,或者是一些其他資源,比如點擊「提交」登錄時動態加載的圖片。如果是這樣,解決方案是確保資源是預先加載的在用戶提交登錄表單之前加載。 – sgress454