def init_facebook(self): """Sets up the request specific Facebook and User instance""" facebook = Facebook() user = None # initial facebook request comes in as a POST with a signed_request if u"signed_request" in self.request.POST: facebook.load_signed_request(self.request.get("signed_request")) # we reset the method to GET because a request from facebook with a # signed_request uses POST for security reasons, despite it # actually being a GET. in webapp causes loss of request.POST data. self.request.method = u"GET" self.set_cookie("u", facebook.user_cookie, datetime.timedelta(minutes=1440)) elif "u" in self.request.cookies: facebook.load_signed_request(self.request.cookies.get("u")) # try to load or create a user object if facebook.user_id: user = User.get_by_key_name(facebook.user_id) if user: # update stored access_token if facebook.access_token and facebook.access_token != user.access_token: user.access_token = facebook.access_token user.put() # refresh data if we failed in doing so after a realtime ping if user.dirty: user.refresh_data() # restore stored access_token if necessary if not facebook.access_token: facebook.access_token = user.access_token if not user and facebook.access_token: me = facebook.api(u"/me", {u"fields": User.get_fields()}) try: friends = [user[u"id"] for user in me[u"friends"][u"data"]] user = User( key_name=facebook.user_id, user_id=facebook.user_id, friends=friends, access_token=facebook.access_token, name=me[u"name"], email=me.get(u"email"), picture=me[u"picture"], ) user.put() except KeyError, ex: pass # ignore if can't get the minimum fields