我有一個可正常驗證並保存的工作登錄功能。但是,express永遠不會記住舊會話,它總是爲每個網絡請求創建一個新會話。Passport.js/Express.js在每個網絡請求中創建新會話
很明顯,護照對錶達中間件初始化的順序非常敏感。 (例如:https://www.airpair.com/express/posts/expressjs-and-passportjs-sessions-deep-dive)。我檢查了一些例子的配置,並重新安排了它,以便它可以幫助,但它沒有改變我的錯誤。要麼這不是問題,或者我還沒有找到配置聖盃。這是我目前的配置:
快速配置
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.use(express.static(path.join(config.root, '/views')));
app.set('views', config.root + '/views');
var sessionOpts = {
saveUninitialized: true,
resave: false,
store: new RedisStore({
host: 'localhost',
port: 6379
}),
secret: 'keyboard',
cookie: {
httpOnly: true,
maxAge: 1000
}
}
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: false
}));
app.use(cookieParser('keyboard'));
app.use(session(sessionOpts));
app.use(passport.initialize());
app.use(passport.session());
app.use(cors());
require('./routes/router.js')(app, passport);
護照配置
passport.use('local-login', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
},
function(req, username, password, done) {
client.hgetall(username, function(err, reply) {
if (err) {
return done(err);
}
if (!reply) {
return done(null, false, {
message: 'Incorrect username.'
})
}
if (reply.password !== password) {
return done(null, false, {
message: 'Incorrect password.'
})
}
return done(null, reply)
})
}));
確實護照需要手把手的Redis? Redis會話存儲在'sess'文件夾中,其中包含如下所示的鍵:sess:RhodmaK2V2wDNLglV5j1B6rC。我發現的所有教程都是關於Mongo的,因此我不確定在試圖查看它時是否需要以某種方式包含會話密鑰。在會話條目中,它正確地存儲在標準Cookie形式的護照,雖然:req.session.passport.user
有沒有辦法看到護照初始化內發生了什麼?在後續請求中,它應該這樣做:「我們設置的一般護照中間件(passport.initialize)在請求上被調用,它發現連接到會話的passport.user。如果不是(用戶尚未認證)它創建它就像req.passport.user = {}。「請參閱「後續認證請求流程」 - http://toon.io/understanding-passportjs-authentication-flow/我強烈懷疑我的問題在於此步驟,因此能夠看到它的內部會很高興。
一些有趣的花絮:
- 護照從來沒有一次叫deserializeUser。我認爲它從來沒有
達到這一點。 - 我已經檢查了有關此問題的其他StackOverflow問題, 但這些解決方案都不適用於我。
- 我檢查過新會話是否由任何靜態資源生成,但它們不是。它僅適用於有意識的服務器請求。在沒有它們的頁面上,不會創建新的會話。
- 所有會話都有一個填充或空的req.session.passport屬性。
你能發佈你的登錄路線的樣子嗎? –
可靠的事情: 'app.route('/ login')。post(passport.authenticate('local-login'),user.loginUser)' 目前loginUser回調只是檢查標題併發回200狀態。我沒有使用標準的重定向選項,因爲我在前端有一個angular.js應用程序,並且路由不能很好地與重定向一起播放。根據:「如果我不喜歡PASSPORT.AUTHENICATE重新授權用戶......」@ http:// toon。io/on-passportjs-specific-use-cases/- 我*應該*能夠實施帶護照的回撥解決方案。不過,如果它可能解決我的問題,我可以讓它接受重定向。 –
你有沒有解決這個問題?我有完全相同的問題 – user1180888