【问题标题】:Google OAuth with Flask-Dance (always redirect to "choose account" google page)带有 Flask-Dance 的 Google OAuth(始终重定向到“选择帐户”谷歌页面)
【发布时间】:2018-04-10 09:04:20
【问题描述】:

我有一个用 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,在那里(重定向后)我可以看到可供选择的谷歌帐户列表。当我在网络开发工具中选择一个帐户时,我看到以下路由(缺少 url 参数):

  1. https://accounts.google.com/_/signin/oauth?authuser=
  2. http://127.0.0.1:8001/google_login/google/authorized?state=
  3. http://127.0.0.1:8001/google_login/google

然后:

  1. https://accounts.google.com/o/oauth2/auth?response_type= ...

一切从头开始,我看到“选择帐户”屏幕。

在 Google API 帐户中,我有一个重定向网址:

http://127.0.0.1:8001/google_login/google/authorized

在开发环境中我设置了OAUTHLIB_INSECURE_TRANSPORT=1OAUTHLIB_RELAX_TOKEN_SCOPE=1

似乎路由中的第三个 URL 应该是 /auth/google 并尝试再次解析 google.authorized 但它没有,并且我在单击应用程序内的谷歌按钮时只看到一次 print(google.authorized) # False 的结果。

【问题讨论】:

    标签: flask oauth google-oauth flask-oauthlib


    【解决方案1】:

    make_google_blueprint 生成的蓝图默认在认证周期结束时重定向到/;你可以configure this 使用参数redirect_urlredirect_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'
    )
    

    编辑:还要确保您的应用具有 good secret_key 集。

    【讨论】:

    • 感谢您的回答!我试着玩redirect_urlredirect_to。现在我写了redirect_to='auth.google' 并得到了一个werkzeug 错误,所以它已经被处理了。然后我将其更正为auth.auth_google_view,但路由仍然存在相同的问题:/auth/google -> /google_login/google ->(选择帐户)-> /google_login/google ->(选择帐户)......而且仍然仅在单击按钮时查看print(google.authorized) 一次。怎么可能?
    • 如果我在选择帐户后设置redirect_url='/auth/google',它会转到 /google_login/google/authorized -> /google_login/google 然后显然会再次(选择帐户)。因为我找不到任何问题,我认为它应该很容易工作。为什么会跳过/auth/google
    • 您在auth_google_view 上是正确的,已修复。如果您使用装饰器而不是 add_url_rule 创建视图会发生什么?理论上应该没有变化,但我完全按照原样复制了您的代码,只是进行了更改,并且它使用redirect_to在我的本地工作。确保您的应用也有secret_key。这是一个snippet,我的代码有效。
    • 装饰器而不是 add_url_rule 没有任何改变,我再次检查了 SECRET_KEYGOOGLE_OAUTH_CLIENT_IDGOOGLE_OAUTH_CLIENT_SECRET 设置在 app.config 中。我现在试试你的 sn-p,因为它 100% 有效,然后回来。
    • 您未共享的代码中可能有一些东西会弄乱配置;确保您在问题中编写了所有相关代码。在这种情况下,尤其是创建 app 的代码以及可能会改变它的所有内容。
    猜你喜欢
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 2014-06-24
    • 2011-05-11
    • 2018-08-08
    • 1970-01-01
    • 2013-01-01
    相关资源
    最近更新 更多