def GET(self, jrequest, jresponse): assert isinstance(jrequest, JsonRpcRequest) assert isinstance(jresponse, JsonRpcResponse) jresponse.setId() jresponse.setRedirectTarget("/html/auth/error.html") try: oauth_token = jrequest.getValue("oauth_token")[0] oauth_verifier = jrequest.getValue("oauth_verifier")[0] except: raise OAuthError("OAuthCallback was called with neither oauth_token nor oauth_verifier.") session = gaesessions.get_current_session() try: request_token = session[REQUEST_TOKEN_SESSION_KEY] request_token_secret = session[REQUEST_TOKEN_SECRET_SESSION_KEY] except KeyError: raise OAuthError("Request token have not been obtained.") if oauth_token != request_token: raise OAuthError("OAuthCallback gets token which is not identical to retaining request token.") token = oauth2.Token(request_token, request_token_secret) token.set_verifier(oauth_verifier) consumer = oauth2.Consumer(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET) client = oauth2.Client(consumer, token) resp, content = client.request(ACCESS_TOKEN_URL, "POST") access_token_dict = dict(parse_qsl(content)) try: access_token = access_token_dict["oauth_token"] access_token_secret = access_token_dict["oauth_token_secret"] user_id = access_token_dict["user_id"] screen_name = access_token_dict["screen_name"] except KeyError: raise OAuthError({"request_token": request_token, "ACCESS_TOKEN_URL": ACCESS_TOKEN_URL }, message="OAuthCallback failed to exchange verified request token to access token.") # prepare TwittrUser try: twitter_user = TwitterUser.getByTwitterId(int(user_id)) twitter_user.setAccessToken(access_token, access_token_secret) twitter_user.screenName = unicode(screen_name) twitter_user.verifyCredentials11() twitter_user.put_async() except EntityNotFound: twitter_user = TwitterUser.create(int(user_id)) twitter_user.setAccessToken(access_token, access_token_secret) twitter_user.screenName = unicode(screen_name) twitter_user.verifyCredentials11() twitter_user.put() assert isinstance(twitter_user, TwitterUser) # prepare OdenkiUser try: odenki_user = OdenkiUser.loadFromSession() except EntityNotFound: odenki_user = None # reconcile TwitterUser and OdenkiUser if odenki_user is None: if twitter_user.odenkiId is None: odenki_user = OdenkiUser.createNew() assert isinstance(odenki_user, OdenkiUser) odenki_user.saveToSession() twitter_user.setOdenkiId(odenki_user.odenkiId) twitter_user.put_async() else: odenki_user = OdenkiUser.getByOdenkiId(twitter_user.odenkiId) odenki_user.saveToSession() else: if twitter_user.odenkiId is None: odenki_user.saveToSession() twitter_user.setOdenkiId(odenki_user.odenkiId) twitter_user.put_async() else: if twitter_user.odenkiId != odenki_user.odenkiId: raise InconsistentAuthentiation({twitter_user.__class__.__name__: twitter_user, odenki_user.__class__.__name__:odenki_user}) odenki_user.saveToSession() jresponse.setResultValue("OdenkiUser", odenki_user) jresponse.setResultValue("TwitterUser", twitter_user) jresponse.setRedirectTarget("/html/settings.html")
def GET(self, jrequest, jresponse): assert isinstance(jrequest, JsonRpcRequest) assert isinstance(jresponse, JsonRpcResponse) jresponse.setId() jresponse.setRedirectTarget("/html/auth/error.html") try: oauth_token = jrequest.getValue("oauth_token")[0] oauth_verifier = jrequest.getValue("oauth_verifier")[0] except: raise OAuthError( "OAuthCallback was called with neither oauth_token nor oauth_verifier." ) session = gaesessions.get_current_session() try: request_token = session[REQUEST_TOKEN_SESSION_KEY] request_token_secret = session[REQUEST_TOKEN_SECRET_SESSION_KEY] except KeyError: raise OAuthError("Request token have not been obtained.") if oauth_token != request_token: raise OAuthError( "OAuthCallback gets token which is not identical to retaining request token." ) token = oauth2.Token(request_token, request_token_secret) token.set_verifier(oauth_verifier) consumer = oauth2.Consumer(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET) client = oauth2.Client(consumer, token) resp, content = client.request(ACCESS_TOKEN_URL, "POST") access_token_dict = dict(parse_qsl(content)) try: access_token = access_token_dict["oauth_token"] access_token_secret = access_token_dict["oauth_token_secret"] user_id = access_token_dict["user_id"] screen_name = access_token_dict["screen_name"] except KeyError: raise OAuthError( { "request_token": request_token, "ACCESS_TOKEN_URL": ACCESS_TOKEN_URL }, message= "OAuthCallback failed to exchange verified request token to access token." ) # prepare TwittrUser try: twitter_user = TwitterUser.getByTwitterId(int(user_id)) twitter_user.setAccessToken(access_token, access_token_secret) twitter_user.screenName = unicode(screen_name) twitter_user.verifyCredentials11() twitter_user.put_async() except EntityNotFound: twitter_user = TwitterUser.create(int(user_id)) twitter_user.setAccessToken(access_token, access_token_secret) twitter_user.screenName = unicode(screen_name) twitter_user.verifyCredentials11() twitter_user.put() assert isinstance(twitter_user, TwitterUser) # prepare OdenkiUser try: odenki_user = OdenkiUser.loadFromSession() except EntityNotFound: odenki_user = None # reconcile TwitterUser and OdenkiUser if odenki_user is None: if twitter_user.odenkiId is None: odenki_user = OdenkiUser.createNew() assert isinstance(odenki_user, OdenkiUser) odenki_user.saveToSession() twitter_user.setOdenkiId(odenki_user.odenkiId) twitter_user.put_async() else: odenki_user = OdenkiUser.getByOdenkiId(twitter_user.odenkiId) odenki_user.saveToSession() else: if twitter_user.odenkiId is None: odenki_user.saveToSession() twitter_user.setOdenkiId(odenki_user.odenkiId) twitter_user.put_async() else: if twitter_user.odenkiId != odenki_user.odenkiId: raise InconsistentAuthentiation({ twitter_user.__class__.__name__: twitter_user, odenki_user.__class__.__name__: odenki_user }) odenki_user.saveToSession() jresponse.setResultValue("OdenkiUser", odenki_user) jresponse.setResultValue("TwitterUser", twitter_user) jresponse.setRedirectTarget("/html/settings.html")