【问题标题】:AWS Cognito OAuth configuration for Flask AppbuilderFlask Appbuilder 的 AWS Cognito OAuth 配置
【发布时间】:2020-09-29 07:29:43
【问题描述】:

我正在使用 Airflow 设置 RBAC,并在本地进行测试以启动。我已经通过控制台预置了一个 AWS Cognito 用户组。此外,我有一个 webserver_config.py 文件已安装到我的 Airflow docker 容器中,以使用 RBAC 设置 OAuth。

我的 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:我的用户池的“应用程序客户端”部分中我的应用程序的应用程序客户端 ID

COGNITO_CLIENT_SECRET:我的用户池的“应用程序客户端”部分中我的应用程序的应用程序客户端密码

在 Cognito UI 中,我的应用客户端有以下设置: enter image description here

基本上,我已经设置了端点,因为它们在测试时应该在我的本地机器上。我摆弄了http://localhost:8083/oauth2/idpresponsehttp://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 和/或其相关模式方面的任何帮助。

针对间距进行了编辑。

【问题讨论】:

  • 你得到什么错误?
  • @Vlad 我收到一个 HTTP 400 消息:“redirect_mismatch”

标签: python oauth airflow amazon-cognito flask-appbuilder


【解决方案1】:

Flask 构建器库使用配置对象的名称作为 redirect_uri 中的值。

在 AWS Cognito 客户端中将回调值设置为:http://localhost:8083/oauth-authorized/AWS%20Cognito 而不是 http://localhost:8080/oauth2/idresponse。这应该可以解决重定向问题。

由于 AWS cognito 使用 OpenID 身份验证模式,userinfo 端点将开始真正的问题。

aws-cognito-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

这应该让气流网络服务器与 AWS cognito 一起工作。角色和权限管理可以由您完成。

【讨论】:

  • 您是否能够使用 HTTPS redirect_uri 来实现这一点?似乎烧瓶只是忽略了架构并总是发送 HTTP...
  • @GonzaloVillafañeTapia 我相信这与标题有关。如果你有一个反向代理,比如 nginx,它会解析 TLS,然后转发请求,你需要在你的 nginx 配置中设置 "x-forwarded-proto"="https" 标头。
猜你喜欢
  • 2015-08-06
  • 2017-07-21
  • 2018-12-19
  • 2018-05-21
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
相关资源
最近更新 更多