Базовый пример Flask OpenID Connect

В связи с приближающимся прекращением поддержки Google OpenID 2 любой, кто использует удобную библиотеку, например Flask-Googleauth придется перенести. Существует библиотека Flask для OpenID Connect, которая называется flask-oidc. К сожалению, похоже, нет никакой информации о том, как его использовать. Я искал SO-вопросы с тегами flask и openid-connect, но нашел ноль, отсюда и этот вопрос.

Вот то, что я собрал как доказательство правильности использования flask-oidc. Он основан на файле app.py flask-oidc:

"""
Flask app for testing the OpenID Connect extension.
"""
from flask import Flask
from flask.ext.oidc import OpenIDConnect

def index():
    return "too many secrets", 200, {
        'Content-Type': 'text/plain; charset=utf-8'
    }

def create_app(config, oidc_overrides=None):
    app = Flask(__name__)
    app.config.update(config)
    if oidc_overrides is None:
        oidc_overrides = {}
    oidc = OpenIDConnect(app, **oidc_overrides)
    app.route('/')(oidc.check(index))
    return app

if __name__ == '__main__':
    APP = create_app({
        'OIDC_CLIENT_SECRETS': './client_secrets.json',
        'SECRET_KEY': 'secret'})
    APP.run(host="127.0.0.1", port=8080, debug=True)

После регистрации моего приложения, как описано здесь, это успешно отправляет пользователя в Google для аутентификации, и возвращает их в http://127.0.0.1:8080/oidc_callback, который затем перенаправляет их в https://127.0.0.1:8080/, но затем перенаправляет пользователя обратно в Google для аутентификации, создавая цикл перенаправления.

Мой вопрос, конечно, прост: как я могу заставить аутентифицированного пользователя увидеть эту индексную страницу?


person Range vs. Range    schedule 14.03.2015    source источник


Ответы (1)


Проблема в том, что oidc_callback правильно создает файл cookie аутентификации (называемый oidc_id_token) и перенаправляет его на index, но index не может получить этот файл cookie, потому что приложение размещено на HTTP, а файл cookie имеет установлен флаг безопасности, поэтому браузер не желает отправлять его обратно в приложение по HTTP.

Решение состоит в том (только для целей локальной разработки!) Отключить флаг Secure, установив для элемента конфигурации OpenIDConnect OIDC_ID_TOKEN_COOKIE_SECURE значение False:

if __name__ == '__main__':
    APP = create_app({
        'OIDC_CLIENT_SECRETS': './client_secrets.json',
        'OIDC_ID_TOKEN_COOKIE_SECURE': False,
        'SECRET_KEY': 'secret'})
    APP.run(host="127.0.0.1", port=8080, debug=True)
person Range vs. Range    schedule 15.03.2015
comment
Спасибо за это. Мне удалось запустить набор Nosetest в flask-oidc, но я неоднократно получал ошибку несоответствия redirect_uri от Google с сообщением localhost : 8080 / oidc_callback не соответствует зарегистрированному URI перенаправления. В пакете тестов client.secrets URI перенаправления указан как localhost: 5000 / oauth2callback. Ни то, ни другое не помогло мне, потому что я менял их и запускал код через несколько минут. Когда я изменил учетные данные и через несколько часов снова попробовал, это сработало. - person Al Pacifico; 01.07.2015