2013-07-26 126 views
5

此之前沒有被注意到,因爲客戶端 - 服務器的通信,沒有什麼需要認證通過XHR發生(作爲尚未)。在實現一些集成測試時,我正在創建realy請求node-xmlhttprequest到應用程序的一個實例。用戶正在第一次請求中進行身份驗證,理論上用戶的唯一標識符和一些其他相關信息存儲在會話中(正如我所說的,這對於真正的客戶端來說很好,他們不需要通過XHR確認他們的身份)。出於某種原因,即使隨後的請求正在使用完全相同的會話ID觸發,我無法在後續請求中檢索會話,因此無法看到用戶已通過身份驗證,並且這導致失敗的測試,其中預期的行爲不會發生,並且HTTP 401 UNAUTHORIZED正在填滿終端。Express.js /護照的應用程序創建爲每個請求新的會話,儘管請求頭會話ID

我見過一對夫婦的看起來有點像這樣的問題,但「同一個會話ID」的事情似乎並沒有在他們中間存在。

我需要的Set-Cookie頭手動添加到所有XHR請求?太糟糕了,這裏有更好的方法!

所以人們喜歡的源代碼,這裏的一些從測試,發射這些請求:

// Ensure logged in before sending request, to verify that authorized 
// users encounter the expected behaviour. 
jQuery.post(domain+'/login', {email:'[email protected]', password:'12345678'}, 
function(data,x,y){ 
    data.should.equal("true") 
    jQuery.ajax({url:domain+'/event', type:"POST", 
    name: "TestEvent", location: "TestVille", 
    startDate: new Date('2013-09-01'), startTime: '6:45 pm', 
    description: "Test Event #1", success: state.success, 
    error: state.error, completed: state.completed 
    }) 
}) 

登錄情況發生,用戶ID被寫入會議(`req.logIn()應該這樣做,而且不報告任何失敗),用戶標識的序列化不報告任何失敗,並且我對使用相同會話標識的後續請求無法找到序列化用戶標識的原因感到非常困惑。

我一般不參與與網絡的發展,所以這可能是很明顯的一些人,但我整天都在尋找答案,並簡單地沒有能夠找到一個。我很感激任何指針,並且很樂意提供儘可能多的代碼,以說明問題所在。

的代碼可以是相關的幾個附加分:

序列化/用戶ID(當前在最簡單的可能 方式實現的反序列化 - 這是在中間件的initiallization很早,initiallizing護照和後passpot.session(),這工作得很好非XHR請求)的用戶

// Serialize user for passport session-store 
// Currently only serializing 'user_id' 
passport.serializeUser(function(user, done) { 
    done(null, user._id) 
}) 

// Deserialize user from session-store to provide 
// access to the User instance 
passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
    done(err, user) 
    }) 
}) 

認證通過本地策略:

passport.use(new LocalStrategy({ 
    usernameField: "email", passwordField: "password", 
    passReqToCallback: true, failureFlash: true 
    }, 
    function(req, email, password, done) { 
    User.findByEmail(email, function(err, user) { 
     if(user) { 
     if(err) console.log(err) 
     if(user instanceof UserLocal) { 
      user.verifyPassword(password, function(err, match) { 
      if(err) console.log(err) 
      if(!match) { 
       return done(err, false, 
       "Username or password is incorrect.") 
      } 
      return done(null, user) 
      }) 
     } else { 
     var msg = "Account registered under " + user.providerName() 
       + ", please login using " + user.providerName() 
     return done(err, false, msg) 
     } 
    } else { 
     return done(err, false, "Username or password is incorrect.") 
    } 
    }) 
}) 

最後其寫入會議在首位的要求:

function loginHelper(req, res, next) { 
    passport.authenticate('local', { 
    failureFlash:true, 
    failureRedirect: false, 
    successRedirect: false 
    }, 
    function(err, user, info) { 
    req.logIn(user, function(err) { 
     if(!err) err = {} 
     if(req.xhr) { 
     console.log(req.session) 
     res.status(200).end(err.message || "true") 
     } else { 
     if(err.message) req.flash('error', err.message) 
     else res.redirect('/') 
     } 
    }) 
    })(req, res, next) 
} 

我知道有像發送的200狀態不管登錄狀態的一些奇怪的事情,但我可以證實,序列化的用戶id在初始登錄XHR請求中寫入會話,並且在隨後的XHR請求中不會反序列化。

我相信,正如我所說,我在這方面的經驗相對較少,並且可以非常使用升壓。任何幫助將非常感謝,提前感謝。

+1

你找到任何解決方案 – Sushant

回答

0

這是幫我 首先

app.use(express.static(__dirname + '/public', { maxAge: oneDay })); 

和更新功能,以不觸發數據庫

passport.serializeUser((user, done) => { 
     var sessionUser = { id: user.dataValues.id, fio: user.dataValues.fio, email: user.dataValues.localemail, role: user.dataValues.role, login: user.dataValues.login, position: user.dataValues.position } 
     done(null, sessionUser) 
    }) 

    passport.deserializeUser((sessionUser, done) => { 
     // The sessionUser object is different from the user mongoose collection 
     // it's actually req.session.passport.user and comes from the session collection 
     done(null, sessionUser) 
    }) 

https://www.airpair.com/express/posts/expressjs-and-passportjs-sessions-deep-dive

相關問題