我在使用龙卷风框架的Google+ OAuth中遇到问题。我使用AngularJS作为前端和python tornado作为后端与nginx服务器。我从AngularJS向Google+ API发送HTTP请求,我的龙卷风API重定向到Google登录。成功登录后,它会重定向回我的应用程序。在重定向时,我认为它会自动刷新,即来自Google的两次重定向调用。
请参阅龙卷风OAuth2的两次HTTP重定向调用
这是我的代码:
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 = {})
答案 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"])})))