我目前正在致力于在 Keycloak 和 Apache Superset 之间配置 OAuth 身份验证。我遇到一个问题,在 Keycloak 页面上输入凭据后,我被重定向回 Superset,并显示消息:“登录请求被拒绝。”
以下是我使用过的配置: Keycloak 配置(23.0.3 版)
有效的重定向 URI: http://localhost:8089/oauth-authorized/keycloak
网络起源: http://localhost:8089/%5C*
AUTH_TYPE = AUTH_OAUTH
LOGOUT_REDIRECT_URL = 'https://{my_keycloak_domain}/realms/{my_realm_name}/protocol/openid-connect/logout'
AUTH_USER_REGISTRATION = True
AUTH_USER_REGISTRATION_ROLE = 'Gamma'
Keycloak 的 OAuth 提供程序配置
OAUTH_PROVIDERS = [
{
'name': 'keycloak',
'icon': 'fa-key',
'token_key': 'access_token', # Keycloak uses 'access_token' for the access token
'remote_app': {
'client_id': 'test',
'client_secret': 'dElzstUQqUgQshK23IWWjmNuoe9GgIo8',
'api_base_url': 'https://{my_keycloak_domain}/auth/',
'client_kwargs': {
'scope': 'openid profile email',
},
'base_url': 'https://{my_keycloak_domain}/realms/{my_realm_name}/protocol/openid-connect/auth',
'request_token_url': None,
'access_token_url': 'https://{my_keycloak_domain}/realms/{my_realm_name}/protocol/openid-connect/token',
'authorize_url': 'https://{my_keycloak_domain}/realms/{my_realm_name}/protocol/openid-connect/auth',
},
}
]
在 Keycloak 登录页面中输入凭据后,重定向到 Superset 会显示以下消息: “登录请求被拒绝。”
我不确定可能导致此错误的原因,非常感谢您帮助识别和解决问题。
有人遇到过类似的问题吗?
我尝试了各种配置,并且已经调试了几个小时。 它似乎首先已连接(它重定向到 Keycloak 登录页面,并在提供正确的凭据后返回到 Superset),但它卡在了最后一步。
# Custom Security Manager class
class CustomSsoSecurityManager(SupersetSecurityManager):
def oauth_user_info(self, provider, response=None): # noqa: ARG002
me = self.appbuilder.sm.oauth_remotes[provider].get("openid-connect/userinfo")
me.raise_for_status()
data = me.json()
logging.info("User info from Keycloak: %s", data)
return {
"username": data.get("preferred_username", ""),
"first_name": data.get("given_name", ""),
"last_name": data.get("family_name", ""),
"email": data.get("email", ""),
"role_keys": data.get("groups", []),
}
# Set the custom security manager
CUSTOM_SECURITY_MANAGER = CustomSsoSecurityManager
# OAuth provider configuration for Keycloak
OAUTH_PROVIDERS = [
{
'name': 'keycloak',
'icon': 'fa-key',
'token_key': 'access_token', # Keycloak uses 'access_token' for the access token
'remote_app': {
'client_id': IAM_CLIENT_ID,
'client_secret': IAM_CLIENT_SECRET,
'client_kwargs': {
'scope': 'openid profile email roles',
},
'server_metadata_url': KEYCLOAK_METADATA_URL,
'api_base_url': KEYCLOAK_API_BASE_URL,
},
}
]