2015-05-14 85 views
2

我有一個可正常驗證並保存的工作登錄功能。但是,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屬性。
+0

你能發佈你的登錄路線的樣子嗎? –

+0

可靠的事情: 'app.route('/ login')。post(passport.authenticate('local-login'),user.loginUser)' 目前loginUser回調只是檢查標題併發回200狀態。我沒有使用標準的重定向選項,因爲我在前端有一個angular.js應用程序,並且路由不能很好地與重定向一起播放。根據:「如果我不喜歡PASSPORT.AUTHENICATE重新授權用戶......」@ http:// toon。io/on-passportjs-specific-use-cases/- 我*應該*能夠實施帶護照的回撥解決方案。不過,如果它可能解決我的問題,我可以讓它接受重定向。 –

+0

你有沒有解決這個問題?我有完全相同的問題 – user1180888

回答

0

對於每個請求,您的會話ID可能會有所不同,因爲您的Cookie設置爲在1秒後過期。 cookie.maxAge這裏是MS:

cookie: { 
    httpOnly: true, 
    maxAge: 1000 
} 

編輯:我也有嘮叨你有關明文存儲密碼。不要這樣做;)

+0

這是一個很好的接觸,並可能爲我解決未來的問題(我正在設置基於Redis商店的cookie,它使用秒)。可悲的是,它並沒有解決我原來的問題。至於明文密碼,bcrypt即將到來。在添加另一層複雜性之前,我只需要基本的會話工作。 –

+0

所以在完成修復後,每個請求'req.session.id'仍然不同? –

相關問題