Google OAuth с Flask-Dance (всегда перенаправляйте на страницу "выберите аккаунт" на Google)

У меня есть приложение, написанное для Flask, и я пытаюсь использовать Flask-Dance ( Flask-Dance Docs - Пример Google), чтобы включить 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 на выбор. Когда я выбираю учетную запись в инструментах Network dev, я вижу следующую маршрутизацию (отсутствуют параметры 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 у меня есть 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 внутри приложения.

1 ответ

Решение

План, созданный make_google_blueprint по умолчанию перенаправление на / когда цикл аутентификации закончился; Вы можете настроить это с помощью параметров 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 задавать.

Другие вопросы по тегам