我有以下代码(取自 facebook-sdk appengine example ):
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
我遇到了 Issue #23 中描述的确切问题
项目中包含的来自 Google App Engine 的示例会在每次请求时调用 get_user_from_cookie,它现在会向 Facebook 发送请求。该示例应缓存返回的访问 token ,以免发生这种情况。
我该如何解决这个问题?我担心的一个问题是,如果我将它们存储在 session 中,我怎么知道访问 token 有效?
请您参考如下方法:
get_user_from_cookie 调用 facebook 以获取访问 token ,访问 token 可以在其过期期间缓存(使用 memache)(调用 facebook 获取访问 token 时也会过期)。
获取访问 token 的步骤应该是:
- 检查它是否缓存在类(处理程序)级别。
- 检查它是否缓存在 memache 中。
- 来自 facebok 的 Restive,并将其缓存(用于 token 的使用)
- 如果由于过期而失败,则使用访问 token 检索它(并缓存它)。
