2

我們有一個在Google Appengine(Python 2.7)上運行的應用程序,它使用Simple Auth作爲登錄和webapps2框架。 我們目前只支持Facebook登錄。在Google appengine(Python)中創建會話 - 簡單驗證失敗

問題:有時facebook登錄會話創建不能正常工作。 這並不總是發生,它隻影響網站整體流量的10%。 從Facebook身份驗證到我們網站的回調正常,我們也能夠獲得Facebook身份驗證令牌。但會話創建單獨失敗。

控制流: 1)中的「使用Facebook登入」按鈕用戶點擊我們頁面 2)用戶被重定向至Facebook爲權限(如果它的第一次登錄) 3)用戶被重定向回上我們的網站在Facebook上給予適當的授權 4)用戶認證令牌在我們的網站上獲得,我們使用此令牌從Facebook圖形API獲取用戶詳細信息 5)創建會話並在響應對象上設置cookie頭(Place當前問題發生在哪裏) 6)用戶被重定向到我們的儀表板(儀表板是一個只顯示登錄用戶的屏幕,所以如果會話/ cookie沒有正確創建,用戶將會我將被重定向回登錄頁面)。

補救措施已經嘗試: 我的第一個猜測是創建會話比下一行代碼執行所需的時間更多。如果會話創建是異步過程,則會發生這種情況。所以我在會話創建線和下一行之間加入了一個小的延遲。這個想法是給予足夠的時間來承諾未承諾的變更。此外,如果會話在休眠時間結束時並未真正創建,我嘗試重新創建會話對象。

ok, user = self.auth.store.user_model.create_user(auth_id, **_attrs) 
logging.info("creating user : "+str(ok)+" | user" +str(user)) 
if ok: 
    self.auth.set_session(self.auth.store.user_to_dict(user)) 
    logging.info("User: "+str(self.auth.get_user_by_session())) 
    if(self.auth.get_user_by_session() is None): 
     logging.info("Existing user logging in.. But the set session didn't work So wait for sometime") 
     time.sleep(0.5) 
     if(self.auth.get_user_by_session() is None): 
      logging.info("Existing user logging in.. But the set session didn't work So try again") 
      self.auth.set_session(self.auth.store.user_to_dict(user)) 

但上述技術不起作用。所以,我的診斷有一個缺陷。

請求幫助解決此問題。如果您需要更多相關信息,請告訴我。

回答

0

一般來說,等待是同步的一個不好的藉口。

無論哪種情況,您都會想深入您的auth庫進行調查。 你不希望auth.set_session是異步的。使其同步。這應該讓生活更輕鬆。

瞭解get_user_by_session()如何工作。你描述的問題聽起來很像最終的一致性行爲。如果get_user_by_session()發出數據存儲查詢操作,可能會發生這種情況,這可能會返回最終一致的結果。對於get_user_by_session()操作,您希望獲得強一致的結果,因此庫應該使用數據存儲區獲取操作。實際上,由於您只是創建了用戶和會話,因此庫應該已緩存該信​​息,根本不需要擊中數據存儲區。

這個庫是python,你應該能夠遍歷庫代碼並找出發生了什麼。