Flask Appbuilder 的 AWS Cognito OAuth 配置
AWS Cognito OAuth configuration for Flask Appbuilder
我正在使用 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:我在用户池"App Integration"部分创建的域名
COGNITO_CLIENT_KEY:我的应用程序在我的用户池 "App Clients" 部分中的应用程序客户端 ID
COGNITO_CLIENT_SECRET:我的应用程序的应用程序客户端密码在我的用户池"App Clients"部分
在 Cognito UI 中,我的 App Client 有以下设置:
enter image description here
基本上,我已经设置了端点,因为它们在测试时应该在我的本地机器上。我摆弄了 http://localhost:8083/oauth2/idpresponse
和 http://localhost:8083/admin
(Airflow 的正常主页)路线并收到了相同的错误。
我认为问题在于客户端尝试请求的 URI 与指定的 URI 不匹配。我尝试按照 上的建议进行操作,但是当我提取该 URI 并将其保存在 Cognito 控制台中时,我继续遇到相同的错误。我正在寻求帮助来确定所需的 URI。我根据链接 post 确定的请求是:/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 and/or 及其相关模式,我将不胜感激。
针对间距进行了编辑。
Flask 构建器库使用配置对象的名称作为 redirect_uri 中的值。
在 AWS Cognito 客户端中将回调值设置为:http://localhost:8083/oauth-authorized/AWS%20Cognito
而不是 http://localhost:8080/oauth2/idresponse
。这应该可以解决重定向问题。
真正的问题将从 userinfo 端点开始,因为 AWS Cognito 使用 OpenID 身份验证模式。
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
这应该让 airflow 网络服务器与 AWS cognito 一起工作。角色和权限管理可以由您来完成。
我正在使用 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:我在用户池"App Integration"部分创建的域名
COGNITO_CLIENT_KEY:我的应用程序在我的用户池 "App Clients" 部分中的应用程序客户端 ID
COGNITO_CLIENT_SECRET:我的应用程序的应用程序客户端密码在我的用户池"App Clients"部分
在 Cognito UI 中,我的 App Client 有以下设置: enter image description here
基本上,我已经设置了端点,因为它们在测试时应该在我的本地机器上。我摆弄了 http://localhost:8083/oauth2/idpresponse
和 http://localhost:8083/admin
(Airflow 的正常主页)路线并收到了相同的错误。
我认为问题在于客户端尝试请求的 URI 与指定的 URI 不匹配。我尝试按照 上的建议进行操作,但是当我提取该 URI 并将其保存在 Cognito 控制台中时,我继续遇到相同的错误。我正在寻求帮助来确定所需的 URI。我根据链接 post 确定的请求是:/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 and/or 及其相关模式,我将不胜感激。
针对间距进行了编辑。
Flask 构建器库使用配置对象的名称作为 redirect_uri 中的值。
在 AWS Cognito 客户端中将回调值设置为:http://localhost:8083/oauth-authorized/AWS%20Cognito
而不是 http://localhost:8080/oauth2/idresponse
。这应该可以解决重定向问题。
真正的问题将从 userinfo 端点开始,因为 AWS Cognito 使用 OpenID 身份验证模式。
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
这应该让 airflow 网络服务器与 AWS cognito 一起工作。角色和权限管理可以由您来完成。