2012-05-22 69 views
4

我正在實施調用我們內部認證服務的護照策略。內部auth服務生成會話ID,所以我需要確保連接會話使用該ID而不是默認生成的ID。如何覆蓋node.js快速會話的會話ID(使用護照)

有沒有辦法做到這一點?是否有可能提供我自己的鉤子函數來連接產生會話ID?我無法想象它像設置session.id或類似的東西那麼簡單,因爲我無法控制連接實際創建會話的時間或方式。

有沒有人解決過這個問題?

回答

2

這不能與當前的實現連接的會話中間件來實現,但你可以用叉子叉會話中間件和更改會話ID是如何產生的,即這一行:

https://github.com/senchalabs/connect/blob/master/lib/middleware/session.js#L202

通過「叉」我的意思是複製上面的文件,更改sessionID的分配,並在配置會話中間件時使用新文件。

UPDATE:

下面我將如何重新用自定義ID會話(注 - 這只是一個想法,我沒有測試過):

// this is the function you'll be calling in your routes or whatever 
req.regenerateSession = function(newSid) { 
    // keep old session data 
    var oldSessionData = req.session; 

    // destroy current session and make a new one with your custom id 
    store.destroy(req.sessionID, function() { 
    store.generate(req, newSid); 

    // copy back the session data 
    // since you don't want to lose it probably 
    req.session = oldSessionData; 
    }); 
} 

// replace the session store generate function to accept a custom sessionID 
// https://github.com/senchalabs/connect/blob/master/lib/middleware/session.js#L201 
store.generate = function(req, customID) { 
    req.sessionID = customID || utils.uid(24); 
    req.session = new Session(req); 
    req.session.cookie = new Cookie(req, cookie); 
} 
+0

謝謝。下面的工作是否會起作用,而不是分叉文件? – Jake

+0

我想你忘了粘貼東西..?繼什麼? – alessioalex

+0

抱歉,輸入重點提交。謝謝。不過,我不清楚我如何獲得自定義ID,如果我分叉該文件並更改該行。在使用登錄憑證調用auth服務後,我只會擁有自定義ID,並且我相信會在創建會話後發生。你能否詳細說明解決方案的工作原理?我的想法是替換護照策略中的req.session.save,它提供了來自閉包的會話ID。即req.session.save = function(fn){this.req.sessionStore.set(authServiceId,this,fn || function(){}); 返回此; } – Jake