Keycloak 22作为SAML Broker对接远程IdP配置咨询
Keycloak 22 SAML Broker配置及Flask登录流程问题解决
一、配置选择:SAML IdP Broker还是直接Flask对接外部IdP?
你的需求是用户跳过Keycloak登录页、直接用外部IdP账号登录Flask应用,分两种场景:
- 场景A:Flask直接对接外部SAML IdP:无需配置Keycloak Broker,直接在Flask中搭建SAML服务提供者(SP)即可。
- 场景B:通过Keycloak作为Broker中转:需要配置Keycloak对接外部IdP,同时让Flask对接Keycloak,再设置Keycloak自动跳转外部IdP。
二、外部IdP Metadata.xml的使用
你提供的metadata.xml包含外部IdP的核心配置信息(实体ID、SSO/SLO地址、证书等),在配置SP端(Flask或Keycloak)时,直接导入该文件即可自动填充大部分参数,无需手动输入。
<md:EntityDescriptor validUntil="2025-11-13T14:27:57.8433870Z" cacheDuration="P365D" entityID="k*******b.*******.**"> <md:IDPSSODescriptor WantAuthnRequestsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"> <md:KeyDescriptor use="signing"> <ds:KeyInfo> <ds:X509Data> <ds:X509Certificate> </ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </md:KeyDescriptor> <md:KeyDescriptor use="encryption"> <ds:KeyInfo> <ds:X509Data> <ds:X509Certificate> </ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </md:KeyDescriptor> <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://k*******b.*******.**/saml20-logout"/> <md:NameIDFormat> urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified </md:NameIDFormat> <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://k*******b.*******.**/saml20-login"/> </md:IDPSSODescriptor> </md:EntityDescriptor>
三、cert.pem导出问题
IdP管理员索要的是你的SP端(Flask或Keycloak)的公钥证书,用于验证SP发送的请求签名或加密响应,获取方式分两种:
1. Flask作为SP时生成证书
用OpenSSL自行生成SP证书和密钥,再导出PEM格式公钥:
# 生成证书和私钥 openssl req -x509 -newkey rsa:4096 -keyout sp.key -out sp.crt -days 365 -nodes # 转换为PEM格式公钥(给IdP管理员的cert.pem) openssl x509 -in sp.crt -out cert.pem -outform PEM
2. Keycloak作为SP(Broker)时导出证书
- 登录Keycloak Admin控制台,进入目标Realm
- 左侧菜单选择Keys,找到类型为
RS256、用途为SIGNATURE的密钥 - 点击该密钥的Public Key按钮,复制公钥内容
- 将复制的内容粘贴到文本文件中,保存为
cert.pem即可
四、具体配置步骤
场景A:Flask直接对接外部IdP
- 使用
flask-saml2库搭建SP,安装依赖:pip install flask-saml2 - 配置Flask-SAML2:导入外部IdP的metadata.xml,指定SP的证书、密钥、回调地址
- 在Flask中实现登录路由,直接重定向到外部IdP的SSO地址,完成登录流程
场景B:Keycloak Broker + Flask对接Keycloak
步骤1:配置Keycloak对接外部SAML IdP
- 进入Realm → Identity Providers → Add provider → 选择SAML v2.0
- 在配置页选择Import from XML,粘贴你提供的metadata.xml内容,自动填充配置
- 补充IdP的签名证书(从metadata的
<X509Certificate>标签中提取内容,去掉换行和标签),保存配置
步骤2:设置Keycloak自动跳转到外部IdP
- 进入Realm → Authentication → Flows,复制默认的Browser流程,命名为
Browser-External-IdP - 修改复制后的流程:删除
Username Password Form步骤,添加Identity Provider Redirector步骤,设置默认IdP为你刚配置的SAML IdP - 进入Authentication → Bindings,将Browser Flow切换为
Browser-External-IdP
步骤3:Flask对接Keycloak
使用flask-oidc库(推荐OIDC协议,比SAML更简洁),配置Keycloak的OIDC参数(客户端ID、客户端密钥、授权地址等),实现登录流程,此时用户访问Flask会直接跳转到外部IdP。
内容的提问来源于stack exchange,提问作者tascio
相关产品推荐
相关产品推荐

