Конфигурация AWS Cognito OAuth для Flask Appbuilder

Я настраиваю RBAC с помощью Airflow и тестирую локально, чтобы начать. Я подготовил группу пользователей AWS Cognito через консоль. Кроме того, у меня есть файл webserver_config.py, который я подключил к своему док-контейнеру Airflow, чтобы настроить OAuth с помощью RBAC.

Соответствующий раздел в моем файле webserver_config.py:

COGNITO_URL = os.getenv('COGNITO_URL')
CONSUMER_KEY = os.getenv('COGNITO_CLIENT_KEY')
SECRET_KEY = os.getenv('COGNITO_CLIENT_SECRET')

# When using OAuth Auth, uncomment to setup provider(s) info
# Google OAuth example:
OAUTH_PROVIDERS = [{
  'name':'AWS Cognito',
    'whitelist': ['@company.com'],  # optional
    'token_key':'access_token',
    'icon':'fa-amazon',
        'remote_app': {
            'base_url': os.path.join(COGNITO_URL, 'oauth2/idpresponse'),
            # 'base_url': COGNITO_URL,
            'request_token_params':{
                'scope': 'email profile'
            },
            'access_token_url': os.path.join(COGNITO_URL, 'oauth2/token'),
            'authorize_url': os.path.join(COGNITO_URL, 'oauth2/authorize'),
            'request_token_url': None,
            'consumer_key': CONSUMER_KEY,
            'consumer_secret': SECRET_KEY,
        }
}]

Переменные следующие:

COGNITO_URL: доменное имя, которое я создал в разделе «Интеграция приложений» моего пула пользователей.

COGNITO_CLIENT_KEY: идентификатор клиента приложения для моего приложения в разделе «Клиенты приложений» моего пула пользователей.

COGNITO_CLIENT_SECRET: секрет клиента приложения для моего приложения в разделе «Клиенты приложений» моего пула пользователей.

В пользовательском интерфейсе Cognito у меня есть следующие настройки для моего клиента приложения: введите здесь описание изображения

По сути, я установил конечные точки так, как они должны быть на моем локальном компьютере при тестировании. Я возился с маршрутами http://localhost:8083/oauth2/idpresponse и http://localhost:8083/admin (обычная домашняя страница для Airflow) и получил ту же ошибку.

Я думаю, что проблема в том, что URI, который пытается запросить клиент, и указанный URI не совпадают. Я попытался последовать совету https://stackoverflow.com/a/53602884/13717098, но когда я извлек этот URI и сохранил его в консоли Cognito, я продолжаю получать ту же ошибку. Мне нужна помощь в определении необходимого URI. Запрос, который я определил в связанном сообщении: /oauth2/authorize?response_type=code&client_id=269vguq386076suj80vpq4ctmj&redirect_uri=http%3A%2F%2Flocalhost%3A8083%2Foauth-authorized%2FAWS%2520Cognito&scope=email+profile&state=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuZXh0IjpbImh0dHA6Ly9sb2NhbGhvc3Q6ODA4My9ob21lIl19.CcuxpZyuVIqW0GtnNL219Xkg1IftE0tzFiVilR6b4us Я был бы признателен за любую помощь с определением URI и / или связанных с ним шаблонов.

Отредактировано для интервала.


person Kyle Pekosh    schedule 10.06.2020    source источник
comment
Какая у вас ошибка?   -  person Vlad    schedule 10.06.2020
comment
@Vlad Я получаю HTTP 400 с сообщением: redirect_mismatch   -  person Kyle Pekosh    schedule 10.06.2020


Ответы (1)


Библиотека Flask Builder использует имя объекта конфигурации как значение в redirect_uri.

Задайте значение обратного вызова: http://localhost:8083/oauth-authorized/AWS%20Cognito вместо http://localhost:8080/oauth2/idresponse в клиенте AWS Cognito. Это должно решить проблему перенаправления.

Настоящая проблема начнется с конечной точки userinfo, поскольку AWSognito использует шаблон аутентификации OpenID.

aws -ognito-client

ИЗМЕНИТЬ

AWS Cognito имеет конечную точку oauth2 / userinfo для получения информации о пользователях. Чтобы получить информацию о пользователе, вы должны отправить область действия openid вместе с вашим запросом. Ниже приведен мой webserver_config.py.

from airflow.www_rbac.security import AirflowSecurityManager
from flask_appbuilder.security.manager import AUTH_OAUTH
import os
import json

class CognitoSecurity(AirflowSecurityManager):
    def oauth_user_info(self, provider, response=None):
        if provider == "aws_cognito":
            me = self.appbuilder.sm.oauth_remotes[provider].get("userInfo")
            data = json.loads(me.raw_data)
            print("User info from aws_cognito: {0}".format(data))
            return {"username": data.get("username"), "email": data.get("email")}
        else:
            return {}

AUTH_TYPE = AUTH_OAUTH

AUTH_USER_REGISTRATION = True

AUTH_USER_REGISTRATION_ROLE = "Admin"

COGNITO_URL = ""
CONSUMER_KEY = ""
SECRET_KEY = ""

OAUTH_PROVIDERS = [{
    'name':'aws_cognito',
    'whitelist': ['@positsource.com'],  # optional
    'token_key':'access_token',
    'url': COGNITO_URL,
    'icon': 'fa-amazon',
    'remote_app': {
        'base_url': os.path.join(COGNITO_URL, 'oauth2/idpresponse'),
        'request_token_params': {
            'scope': 'email profile openid'
        },
        'access_token_url': os.path.join(COGNITO_URL, 'oauth2/token'),
        'authorize_url': os.path.join(COGNITO_URL, 'oauth2/authorize'),
        'request_token_url': None,
        'consumer_key': CONSUMER_KEY,
        'consumer_secret': SECRET_KEY,
    }
}]

SECURITY_MANAGER_CLASS = CognitoSecurity

Это должно заставить веб-сервер воздушного потока работать с AWSognito. Вы можете управлять ролями и разрешениями.

person alex D    schedule 09.07.2020