2

我有以下代码(取自facebook-sdk appengine 示例):

class BaseHandler(webapp2.RequestHandler):
    @property
    def current_user(self):
        if not hasattr(self, "_current_user"):
            self._current_user = None
            cookie = facebook.get_user_from_cookie(
                self.request.cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET)
            if cookie:
                user = User.get_by_key_name(cookie["uid"])
                if not user:
                    graph = facebook.GraphAPI(cookie["access_token"])
                    profile = graph.get_object("me")
                    user = User(key_name=str(profile["id"]), ...)
                    user.put()
                elif user.access_token != cookie["access_token"]:
                    user.access_token = cookie["access_token"]
                    user.put()
                self._current_user = user
        return self._current_user

我有问题 #23中描述的确切问题

项目中包含的 Google App Engine 示例对每个请求调用 get_user_from_cookie,现在它向 Facebook 发送请求。该示例应缓存返回的访问令牌,以免发生这种情况。

我该如何解决这个问题?我担心的一个问题是,如果我将它们存储在会话中,我怎么知道访问令牌是有效的?

4

1 回答 1

1

get_user_from_cookie 调用 facebook 以获取访问令牌,访问令牌可以在其到期期间被缓存(使用 memache)(您也可以在调用 facebook 获取访问令牌时获得到期)。

获取访问令牌的步骤应该是:

  1. 检查它是否缓存在类(处理程序)级别。
  2. 检查它是否缓存在 memache 中。
  3. 从 facebook 中恢复,并缓存它(用于令牌的 duartion)
  4. 如果由于过期而失败,请使用访问令牌检索它(并缓存它)。
于 2012-06-06T16:26:45.467 回答