def login_twitter_finish(request): """ Finish twitter authentication """ consumer_key = str(get_config('tw_consumer_key')) consumer_secret = str(get_config('tw_consumer_secret')) token = request.session.get('twitter_request_token') twitter = Twitter(auth=OAuth(token[0], token[1], consumer_key, consumer_secret), format='', api_version=None) verifier = request.GET.get('oauth_verifier') try: oauth_resp = twitter.oauth.access_token(oauth_verifier=verifier) except TwitterHTTPError as e: log.error('Invalid "access_token" request: {0}'.format(str(e))) return HTTPNotFound() oauth_resp_data = dict(urllib.parse.parse_qsl(oauth_resp)) # typical response: # {'user_id': '128607225', 'oauth_token_secret': 'NaGQrWyNRtHHHbvm3tNI0tcr2KTBUEY0J3ng8d7KFXg', 'screen_name': 'otmenych', 'oauth_token': '128607225-NWzT8YL1Wt6qNzMLzmaCEWOxqFtrEI1pjlA8c5FK'} tw_username = oauth_resp_data['screen_name'] user = find_twitter_user(tw_username) if user is None: dbsession = DBSession() # create user user = User() user.kind = 'twitter' user.login = tw_username dbsession.add(user) # re-request again to correctly read roles user = find_twitter_user(tw_username) if user is None: log.error('Unable to create twitter user') return HTTPServerError() # save user to the session user.detach() remember(request, None, user=user) return HTTPFound(location=request.GET['pyrone_url'])