def finish_login(): # Get the token from the request itself (although we've stored it in a session variable) code = request.args.get("oauth_token", None) if code: # Make sure the passed-in code and our session-stored code match up. if session["twitter-req-token"]["oauth_token"] != code: session.pop("twitter-req-token", None) # fixme(mkrautz): Show a page explaining what went wrong, instead. abort(404) # Set up our client object to fetch our access token token = oauth.Token(code, session["twitter-req-token"]["oauth_token_secret"]) consumer = oauth.Consumer(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET) client = oauth.Client(consumer, token) # Get the access token resp, content = client.request("https://api.twitter.com/oauth/access_token", "GET") data = dict(cgi.parse_qsl(content)) # Get existing or create a new user. bu = BetaUser.get_twitter_user(data["user_id"]) if not bu: bu = BetaUser( sid=data["user_id"], service=BetaUser.SERVICE_TWITTER, name=data["screen_name"], admin=False, lastlogin=datetime.datetime.now(), ) bu.udid = None bu.lastlogin = datetime.datetime.now() bu.put() # Store the key for the currently logged-in betauser. session["betauser"] = bu.key() session.pop("twitter-req-token", None) session.permanent = True # Should we redirect to a specific page? login_redirect_url = session.pop("login-redirect-url", None) if login_redirect_url: return redirect(login_redirect_url) # Redirect to front page else: # fixme(mkrautz): See comment about the same thing in facebook.py. return redirect("http://mumble-ios.appspot.com") session.pop("twitter-req-token", None) abort(404)
def finish_login(): # Fetch the code we've been passed from Facebook code = request.args.get('code', None) if not code: # fixme(mkrautz): Show a nice page here explaining what's wrong. abort(404) # Fetch our access token data = urlfetch.fetch('https://graph.facebook.com/oauth/access_token?' + urllib.urlencode({ 'client_id': settings.FACEBOOK_APP_ID, 'client_secret': settings.FACEBOOK_APP_SECRET, 'code': code, 'redirect_uri': callback_url, })) args = dict(cgi.parse_qsl(data.content)) access_token = args['access_token'] # Fetch data about the user using our acquired access token. data = urlfetch.fetch('https://graph.facebook.com/me?access_token=' + access_token) login_data = json.loads(data.content) # Get existing user, or create a new one. bu = BetaUser.get_facebook_user(login_data['id']) if not bu: bu = BetaUser(sid=login_data['id'], service=BetaUser.SERVICE_FACEBOOK, name=login_data['name'], admin=False, lastlogin=datetime.datetime.now()) bu.udid = None bu.lastlogin=datetime.datetime.now() bu.put() # Set the user's BetaUser key in a cookie, so we know # they're logged in (and which user they're logged in as). session['betauser'] = bu.key() session.permanent = True # Should we redirect to a specific page? login_redirect_url = session.pop('login-redirect-url', None) if login_redirect_url: return redirect(login_redirect_url) # Redirect to front page else: # We force a redirect to http:// (which means that even users on # https:// connections get redirected to the non-TLS version). # The reason for this is that App Engine's OpenID 'federated login' # feature seems to break when using https://. fixme(mkrautz): Look # into why that is. return redirect('http://mumble-ios.appspot.com')