2017-07-29 43 views
1

我正在使用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被宣佈未定義到處

+0

不知道發生了什麼,我從來沒有遇到過這樣的問題。但是,爲什麼不將會話信息放入JWT令牌中?正如我可以看到你正在使用令牌邏輯... – hlozancic

+0

我想這可以是一種解決方法,只需將其放入JWT令牌中,但稍後就會失敗帆的目的... – Aaron

+0

我的猜測是你有一個競爭條件兩個cookie正在爲同一會話設置。也許是前端的加載微調器加載了一些webfont的圖標,或者是一些其他資源,比如點擊「提交」登錄時動態加載的圖片。如果是這樣,解決方案是確保資源是預先加載的在用戶提交登錄表單之前加載。 – sgress454

回答

0

我使用的Connect-蒙戈適配器,並發現了類似的問題嘗試。原因是當你使用req.session.user = user後臺代碼將會話保存到數據庫(在我的情況下,Mongo,在你的Redis中),並且在之前完成,你的代碼執行res.json部分。

爲應對DB節約的異步代碼,嘗試做這樣的事情(沒有測試你的代碼,但這樣做對我的情況下,解決了這個問題):

AuthService.login(req.body.email, req.body.password).then(user => { 

    // save user information in the session 

    // this is on memory 
    req.session.user = user; 
    req.session.authenticated = true; 

    // now the session is saved in DB 
    req.session.save(function() { 
     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 
    }); 
});