如何用Python构建通用OIDC SSO框架适配所有OpenID Connect提供商
不需要绑定特定厂商SDK、仅修改客户端配置即可适配任意标准OIDC提供商的方案,优先选择以下纯规范实现的开发库,全部无需额外依赖各身份服务商的专属SDK:
Authlib
是目前Python生态适配性最好、维护最活跃的通用OAuth2/OIDC实现库,原生完整支持OIDC 1.0全标准流程,覆盖授权码流、PKCE校验、ID令牌验签、用户信息拉取、单点登出等所有SSO核心能力,内置OIDC Discovery动态发现机制。对接时仅需要配置3项核心参数:客户端ID、客户端密钥、OIDC提供商的issuer地址,库会自动拉取对应服务的授权端点、令牌端点、公钥等配置,不需要手动适配不同厂商的接口差异。
它原生提供Flask、Django、FastAPI等主流Python Web框架的集成适配,不管对接的是商用身份服务商(Okta、Auth0、Azure AD、Google账号等)还是自建OIDC服务(Keycloak、自研身份系统等),只要符合OIDC标准规范,修改配置即可直接接入。
最小接入示例(Flask场景):from authlib.integrations.flask_client import OAuth oauth = OAuth(app) oauth.register( name="sso_client", client_id="替换为你的client id", client_secret="替换为你的client secret", server_metadata_url="替换为对应OIDC服务的well-known配置地址", client_kwargs={"scope": "openid email profile"} )pyoidc
是OIDC规范的参考级纯Python实现,完全遵循相关RFC标准开发,没有任何厂商专属的硬编码逻辑,支持所有标准OIDC流程与Discovery动态发现能力。适合需要深度定制SSO逻辑、要自己封装上层通用框架的场景,目前很多上层OIDC工具的核心逻辑都是基于这个库开发的。FastAPI场景轻量选择:fastapi-oidc
如果技术栈用的是FastAPI/Starlette,可以直接用这个轻量封装库,底层依赖pyoidc实现,仅需要配置issuer地址、客户端凭证即可完成任意标准OIDC服务的接入,内置令牌校验、依赖注入能力,接入成本极低。
注:之前使用flask-oidc时出现需要依赖对应厂商SDK的问题,主要是因为该库长期维护不足,部分逻辑没有严格遵循通用OIDC规范,存在不少针对特定厂商的硬编码适配,并非OIDC协议本身需要绑定厂商SDK。
内容的提问来源于stack exchange,提问作者Sharma Saravanan

