Tornado Google+ Oauth错误代码400

时间:2016-02-12 10:30:10

标签: python angularjs nginx tornado google-oauth2

我在使用龙卷风框架的Google+ OAuth中遇到问题。我使用AngularJS作为前端和python tornado作为后端与nginx服务器。我从AngularJS向Google+ API发送HTTP请求,我的龙卷风API重定向到Google登录。成功登录后,它会重定向回我的应用程序。在重定向时,我认为它会自动刷新,即来自Google的两次重定向调用。

请参阅龙卷风OAuth2的两次HTTP重定向调用

enter image description here

这是我的代码:

class GoogleOAuth2LoginHandler(tornado.web.RequestHandler, tornado.auth.GoogleOAuth2Mixin):
    @tornado.gen.coroutine
        def get(self):
            if self.get_argument('code', False):
                user = yield self.get_authenticated_user(
                    redirect_uri='http://your.site.com/auth/google',
                    code=self.get_argument('code')
                )
                # Save the user with e.g. set_secure_cookie
            else:
                yield self.authorize_redirect(
                    redirect_uri='http://your.site.com/auth/google',
                    client_id=self.settings['google_oauth']['key'],
                    scope=['profile', 'email'],
                    response_type='code',
                    extra_params={'approval_prompt': 'auto'}

错误:

  

Google身份验证错误:HTTPResponse(_body =无,缓冲区=< _io.BytesIO对象位于0xb37809bc>,代码= 400,effective_url =' https://accounts.google.com/o/oauth2/token',错误= HTTPError(& #39; HTTP 400:错误的请求',),标头= {' X-Consumed-Content-Encoding&#39 ;:' gzip',' Alternate-Protocol' ;:' 443:quic,p = 1',' X-Xss-Protection':' 1; mode = block',' X-Content -Type-Options':' nosniff','转移编码':' chunked',' Set-Cookie':&# 39; NID = 76 = iaY_jJFPzvLg3_h3eqUFMt4fecbELKk9_bGJju-mwsHBNlxeDqSrtmpyazsrJ3mDgtDnTnzsw5_fjIfV8GcUAegoNgxGi5ynpcfg0vEWULSeVXKio_ANxEoK9C-F5oRs;域= .google.com;路径= /;过期=星期六,13 - 8 - 2016 10点17分46秒GMT;仅Http&#39 ;,'过期&# 39;:'周五,2016年2月12日10:17:46 GMT','服务器':' GSE','连接':& #39;关闭','缓存控制':'私人,max-age = 0','日期':'星期五,12 2016年2月10:17:46 GMT',' P3p':' CP ="这不是P3P政策!见{ {3}}了解更多信息。"',' Alt-Svc':' quic =":443&#34 ;; MA = 604800; v =" 30,29,28,27,26,25"',' Content-Type':' application / json; charset = utf-8',' X-Frame-Options':' SAMEORIGIN'},reason =' Bad Request',request =,request_time = 0.4158029556274414 ,time_info = {})

1 个答案:

答案 0 :(得分:0)

我们遇到了完全相同的配置问题(Tornado + nginx + angularjs)。我刚刚重写了OAuth认证部分,没有龙卷风,问题解决了。您可以使用tornado的AsyncHttpClient但我使用了aiohttp,因为我在asyncio中托管了龙卷风。 以下是新代码,注释部分是旧代码。

from backend.helpers.async_oauth2.client import Client

        oauth_client = Client(app_settings.security.google.client_id, app_settings.security.google.client_secret,
                              app_settings.security.google.redirect_uri, "https://accounts.google.com/o/oauth2/auth"
                              , "https://accounts.google.com/o/oauth2/token")

        access = await oauth_client.get_token(code, grant_type="authorization_code")

        # access = await self.get_authenticated_user(
        #     redirect_uri=app_settings.security.google.redirect_uri,
        #     code=code)

        # user = await self.oauth2_request(
        #     "https://www.googleapis.com/oauth2/v1/userinfo",
        #     access_token=str(access["access_token"]))

        user = await oauth_client.http_get(
            "https://www.googleapis.com/oauth2/v1/userinfo?{}".format(
                url_parse.urlencode({'access_token':str(access["access_token"])})))