2014-01-29 35 views
0

我已經編寫了一個使用FB身份驗證的龍捲風應用。首先獲得來自用戶&的許可獲取訪問令牌。然後使用訪問令牌再次調用FB,獲取電子郵件ID並將其保存在cookie中。龍捲風應用未能在FB登錄後使用OAuth設置cookie

以下是處理程序:

class FAuthLoginHandler(tornado.web.RequestHandler, tornado.auth.FacebookGraphMixin): 
    @tornado.web.asynchronous 
    def get(self): 
     user_id = self.get_secure_cookie('trakr') 

     if self.get_argument('code', None): 
      self.get_authenticated_user(
       redirect_uri=settings.redirect_url, 
       client_id=self.settings['facebook_api_key'], 
       client_secret=self.settings['facebook_secret'], 
       code=self.get_argument('code'), 
       callback=self.async_callback(self._on_facebook_login)) 
      return 
     elif self.get_secure_cookie('access_token'): 
      self.redirect('/') 
      return 

     self.authorize_redirect(
      redirect_uri=settings.redirect_url, 
      client_id=self.settings['facebook_api_key'], 
      extra_params={'scope': 'email'} 
     ) 


    def _on_facebook_login(self, user):     
     if not user: 
      self.clear_all_cookies() 
      raise tornado.web.HTTPError(500, 'Facebook authentication failed') 

     # print "http//graph.facebook.com/%s/picture" % str(user['id']) 
     # print "http//graph.facebook.com/%s" % str(user['id']) 

     self.set_secure_cookie('fb_id', str(user['id'])) 
     self.set_secure_cookie('access_token', str(user['access_token'])) 
     self.facebook_request("/me", access_token=user["access_token"], callback=self.async_callback(self._save_user_profile)) 
     self.redirect('/') 

    def _save_user_profile(self, user): 
     if not user: 
      raise tornado.web.HTTPError(500, "Facebook authentication failed.") 
     # print user 
     print user.get('email') 
     self.set_secure_cookie('trakr', user.get('email')) 
     print self.get_secure_cookie('trakr') 

_save_user_profile,第一print聲明打印電子郵件ID的用戶登錄它成功地打印我的電子郵件。然後我嘗試保存在cookie中,但是當我打印時,我得到的迴應爲None

我以爲我搞砸了使用類&可能是我使用了錯誤的self。我在幾個地方打印了idself,看起來是一樣的。而且我還印了dir(self),它確實有set_secure_cookie的功能。那麼爲什麼它沒有設置cookie?

回答

1

在用戶有機會設置cookie之前,您正在重定向用戶。在_on_facebook_login中刪除重定向呼叫並將其移動到_save_user_profile的末尾。

另外,設置後無法立即讀取cookie - 設置cookie將在下一個請求中生效; get_cookie API返回請求進來時出現的cookie。

+0

但我在重定向之前調用它的權利?而且,在_save_user_profile裏面,它正在打印電子郵件,這意味着控制在這裏是正確的?那麼爲什麼它不能保存cookie? – avi

+0

不,您在重定向之前不會調用'_save_user_profile'。您正在請求在將來的某個時刻調用'_save_user_profile',但在調用'self.redirect'之前,該調用還沒有發生。僅僅因爲控制達到'_save_user_profile',這並不意味着瀏覽器仍然在注意接收新的cookie。 –

+0

'只是因爲控件達到了_save_user_profile,這並不意味着瀏覽器仍在注意接收新的cookie。'這是爲什麼?這背後的原因是什麼? – avi