2014-09-05 93 views
2

我正致力於將具有NodeJS + Express後端的現有Web應用程序調整爲PhoneGap/Steroids應用程序。目前,Webapp的身份驗證由Passport(http://passportjs.org/)使用會話處理。通過令牌進行身份驗證,然後通過會話驗證令牌是否失敗,使用Passport?

app.use(passport.initialize()); 
app.use(passport.session()); 

在瀏覽器中很好用。不幸的是,似乎會話cookie在PhoneGap中不起作用。所以發送到服務器的請求只會被拒絕。

爲PhoneGap的建議的解決方案是替代,其中唯一的令牌被包括使用一個令牌策略與每一個請求給服務器,如在API端點。

所以,這裏是我想知道:

是否有可能適應passport.session(),這樣,如果沒有會話cookie被發現,它反而會檢查是否有req.token和授權對嗎?

我注意到,已經有可用護照某些基於令牌的策略。 (例如https://www.npmjs.org/package/passport-http-bearer)但是,所有這些策略似乎都假設會話不會被使用,並且被關閉。我真正需要的是使用兩者,所以如果一次認證失敗(例如會話),它可以通過並檢查另一個認證(令牌)。

有沒有人按照這個方法實現了一些東西?任何建議/指針將不勝感激。

回答

1

這幾乎正是導致我們寫一個JSON網絡令牌會話中間件模塊相同的使用情況。如果你使用Redis,它應該很好地適合你的堆棧。

https://www.npmjs.org/package/jwt-redis-session

如果更改requestKey初始化參數,以類似「jwtSession」,而不是「會話」,您可以在保留現有基於cookie的會話中間件運行這個中間件。然後,在您的路線中,您可以檢查req.session.whatever或req.jwtSession.whatever並處理獨立於Cookie/JWT傳輸機制的更高級別的功能。

您可能需要修改您的護照策略和/或序列化/反序列化功能,但它不應該太多的工作這個中間件合併到現有護照基礎的應用。

不管你是否要使用這個模塊,我認爲你應該考慮使用基於JSON網絡令牌的東西。當用戶認證你的服務器時,他們將令牌發送回phonegap應用程序,然後在每個後續請求中發送令牌。在這裏,JWT將簡單地通過cookie取代功能瀏覽器的支持。通過JWT來管理會話過期可能有點棘手,因爲過期已經融入到聲明中,因此無法在不重新生成新令牌的情況下「刷新」會話的TTL。這導致我們退回到redis來管理到期日。

無論哪種方式,你要尋找的不是一個隨機生成的UUID,而是一個加密令牌,如智威湯遜,只包含足夠的會話標識數據來代替餅乾的功能。

相關問題