2011-06-09 27 views
5

我試圖模仿從http://tipfy-auth.appspot.com(源http://code.google.com/p/tipfy/source/browse/examples/auth/app/)登錄頁面沒有成功。當用戶重定向回頁面時,我似乎遇到了問題。當前請求流程是這樣的:facebook tip auth問題與tipfy 1.0b

LoginPage(LoginHandler) - >的Facebook重定向(FacebookAuthHandler)302 - > Facebook.com - >的Facebook重定向(FacebookAuthHandler)302 - > SignupPage(SignupHandler)302 - > LoginPage(LoginHandler)。

這裏的問題(據我所知)是從註冊(應該是端點)到登錄頁面的最後302(http重定向)。

經過一番激烈的日誌記錄(無法找到本地測試),似乎從Facebook返回時設置會話。會話作爲字典存儲在請求處理程序(FacebookAuthHandler)的兩個地方self.auth.session(字典)和self.session(a SecureCookieSession)但重定向到SignupPage後self.auth.session爲None。

從SignUpPage到LoginPage重定向的發生是由於該SignupHandler的get方法有一個裝飾@login_required,着眼於self.auth.session以確定是否reuquest應該在這裏處理或重定向。

那麼爲什麼self.auth.session在請求之間保留self.session是?每個請求都設置self.auth.session?會話如何存儲?如果它在數據庫中,數據存儲類型是否重要(主/從或高複製)。

我在挖掘源代碼,但找不到任何有用的東西。

..fredrik

編輯下面

發佈答案。

+0

請將您的解決方案作爲答案發布,以便不會無人接聽。 – cope360 2011-08-21 23:13:11

回答

1

我把它縮小到問題在SessionAuthStore類的會話屬性中。

當訪問會話屬性(這是@login_required看,以確定是否將用戶重定向或不屬性)運行該代碼(tipfy.auth.SessionAuthStore):

if not self.loaded: 
    self._load_session_and_user() 

return self._session 

這裏的問題在_load_session_and_user方法中,希望能夠根據會話內的'token'鍵從數據存儲加載用戶。

不幸的是,從Facebook返回時沒有用戶。所以它會失敗並將用戶重定向到登錄頁面。

要繼續在項目中,我改變了代碼了一下,@login_required(tipfy.auth.init.py)

if not auth.session: 
     auth._load_session() # If no session try to load it from the _session_base 

    if not auth.session: 
     return handler.redirect(auth.login_url()) 

而且在MultiAuthStore類的新方法。

def _load_session(self): 
     self.loaded = True 
     session = self._session_base.get('_auth', {}) 
     if session: 
      self._session = session 

可能不是最好的解決方案,但它的工作原理。