在使用OAuth登录FB后,龙卷风应用程序无法设置cookie

时间:2014-01-29 11:37:09

标签: python facebook python-2.7 cookies tornado

我写了一个使用FB身份验证的龙卷风应用程序。首先,它获得用户的许可&获取访问令牌。然后它使用访问令牌再次调用FB,获取电子邮件ID并将其保存在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。我在几个地方打印了id self,看起来是一样的。我还打印了dir(self),它确实有set_secure_cookie功能。那么为什么它没有设置cookie呢?

1 个答案:

答案 0 :(得分:1)

在您有机会设置Cookie之前,您将重定向用户。移除_on_facebook_login中的重定向呼叫,并将其移至_save_user_profile的末尾。

此外,您在设置cookie后无法立即读取cookie - 设置cookie将在 next 请求中生效; get_cookie API返回请求进入时出现的cookie。