Google OAuth with Flask-Dance(总是重定向到 "choose account" google 页面)
Google OAuth with Flask-Dance (always redirect to "choose account" google page)
我有一个用 Flask 编写的应用程序,并尝试使用 Flask-Dance (Flask-Dance Docs - Google Example) 来启用 Google OAuth。我得到以下设置:
from flask import redirect, url_for, jsonify, Blueprint
from flask_dance.contrib.google import make_google_blueprint, google
from server.app import app
# Internal auth blueprint
auth = Blueprint('auth', __name__, url_prefix='/auth')
# Google auth blueprint
google_login = make_google_blueprint(
client_id=app.config['GOOGLE_CLIENT_ID'],
client_secret=app.config['GOOGLE_CLIENT_SECRET'],
scope=['profile', 'email']
)
def auth_google_view():
"""
Authenticate user with google
"""
# Not authorized
print(google.authorized)
if not google.authorized:
return redirect(url_for('google.login'))
# Authorized - check data
user_info = google.get('/oauth2/v2/userinfo')
if user_info.ok:
return jsonify({'status': 'ok', 'email': user_info.json() .['email']}), 200
return jsonify({'status': 'failed'})
# Add urls
auth.add_url_rule('/google', view_func=auth_google_view)
然后在 app/__init__.py
:
from server.app.auth import auth, google_login
app.register_blueprint(auth)
app.register_blueprint(google_login, url_prefix='/google_login')
通过单击应用程序中的按钮,我转到 /auth/google
并在那里(重定向后)我可以看到一个 google 帐户列表可供选择。当我在网络开发工具中 select 一个帐户时,我看到以下路由(缺少 url 参数):
https://accounts.google.com/_/signin/oauth?authuser=
http://127.0.0.1:8001/google_login/google/authorized?state=
http://127.0.0.1:8001/google_login/google
然后:
https://accounts.google.com/o/oauth2/auth?response_type=
...
一切从头开始,我看到 "choose account" 屏幕。
在 Google API 帐户中我有一个重定向 url:
http://127.0.0.1:8001/google_login/google/authorized
在开发环境中我设置了OAUTHLIB_INSECURE_TRANSPORT=1
和OAUTHLIB_RELAX_TOKEN_SCOPE=1
似乎路由中的第三个 URL 应该是 /auth/google
并尝试再次解析 google.authorized
但它没有,我只看到 print(google.authorized) # False
的结果单击应用程序内的 google 按钮时一次。
make_google_blueprint
生成的蓝图默认在身份验证周期结束时重定向到 /
;您可以 configure this 使用参数 redirect_url
或 redirect_to
。在你的情况下:
google_login = make_google_blueprint(
client_id=app.config['GOOGLE_CLIENT_ID'],
client_secret=app.config['GOOGLE_CLIENT_SECRET'],
scope=['profile', 'email'],
redirect_to='auth.auth_google_view'
)
编辑:还要确保您的应用有 secret_key
集。
我有一个用 Flask 编写的应用程序,并尝试使用 Flask-Dance (Flask-Dance Docs - Google Example) 来启用 Google OAuth。我得到以下设置:
from flask import redirect, url_for, jsonify, Blueprint
from flask_dance.contrib.google import make_google_blueprint, google
from server.app import app
# Internal auth blueprint
auth = Blueprint('auth', __name__, url_prefix='/auth')
# Google auth blueprint
google_login = make_google_blueprint(
client_id=app.config['GOOGLE_CLIENT_ID'],
client_secret=app.config['GOOGLE_CLIENT_SECRET'],
scope=['profile', 'email']
)
def auth_google_view():
"""
Authenticate user with google
"""
# Not authorized
print(google.authorized)
if not google.authorized:
return redirect(url_for('google.login'))
# Authorized - check data
user_info = google.get('/oauth2/v2/userinfo')
if user_info.ok:
return jsonify({'status': 'ok', 'email': user_info.json() .['email']}), 200
return jsonify({'status': 'failed'})
# Add urls
auth.add_url_rule('/google', view_func=auth_google_view)
然后在 app/__init__.py
:
from server.app.auth import auth, google_login
app.register_blueprint(auth)
app.register_blueprint(google_login, url_prefix='/google_login')
通过单击应用程序中的按钮,我转到 /auth/google
并在那里(重定向后)我可以看到一个 google 帐户列表可供选择。当我在网络开发工具中 select 一个帐户时,我看到以下路由(缺少 url 参数):
https://accounts.google.com/_/signin/oauth?authuser=
http://127.0.0.1:8001/google_login/google/authorized?state=
http://127.0.0.1:8001/google_login/google
然后:
https://accounts.google.com/o/oauth2/auth?response_type=
...
一切从头开始,我看到 "choose account" 屏幕。
在 Google API 帐户中我有一个重定向 url:
http://127.0.0.1:8001/google_login/google/authorized
在开发环境中我设置了OAUTHLIB_INSECURE_TRANSPORT=1
和OAUTHLIB_RELAX_TOKEN_SCOPE=1
似乎路由中的第三个 URL 应该是 /auth/google
并尝试再次解析 google.authorized
但它没有,我只看到 print(google.authorized) # False
的结果单击应用程序内的 google 按钮时一次。
make_google_blueprint
生成的蓝图默认在身份验证周期结束时重定向到 /
;您可以 configure this 使用参数 redirect_url
或 redirect_to
。在你的情况下:
google_login = make_google_blueprint(
client_id=app.config['GOOGLE_CLIENT_ID'],
client_secret=app.config['GOOGLE_CLIENT_SECRET'],
scope=['profile', 'email'],
redirect_to='auth.auth_google_view'
)
编辑:还要确保您的应用有 secret_key
集。