SovereignID 作为 OpenID Connect Provider,通过一组标准端点完成用户登录、授权码交换、身份声明读取和签名校验。 接入方应优先使用自动发现地址,避免分别维护端点。
一、统一 issuer
将 <SOVEREIGNID_ISSUER_URL> 替换为当前环境的公网根地址,例如
https://id.example.com。环境变量、用户实际访问地址和接入方使用的 discovery 地址必须属于同一个 origin。
不要混用内外网地址
即使业务服务器可通过内网访问 SovereignID,也不要在 discovery 中混入内网 IP,否则 issuer 校验、回调和令牌验证可能失败。
二、标准端点
| 端点 | 地址 | 用途 |
|---|---|---|
| Discovery | <ISSUER>/.well-known/openid-configuration |
自动获取 issuer、授权、令牌、UserInfo 和 JWKS 地址。 |
| Authorization | <ISSUER>/oauth/authorize |
浏览器进入登录和授权流程,成功后返回授权码。 |
| Token | <ISSUER>/oauth/token |
服务端使用授权码、client_id、client_secret 和 redirect_uri 换取令牌。 |
| UserInfo | <ISSUER>/oauth/userinfo |
携带 access token 读取当前用户的标准身份声明。 |
| JWKS | <ISSUER>/oauth/jwks |
向接入方提供验证 ID Token 签名所需的公钥。 |
三、Scope 与身份声明
| Scope | 主要声明 | 说明 |
|---|---|---|
openid | sub | OIDC 必选 scope,用稳定 subject 标识用户。 |
profile | preferred_username、nickname、name | 用于用户名和显示名称同步。 |
email | email、email_verified | 用于邮箱同步;用户必须先绑定并验证邮箱。 |
groups | groups | 返回用户所属 Django Group 的名称列表。 |
四、接入检查
- 为每个业务系统创建独立的 Confidential / Authorization Code 应用,不共用客户端密钥。
- 回调地址必须与业务系统实际发出的
redirect_uri完全一致。 - 至少请求
openid profile email;需要用户组时再加入groups。 - 客户端密钥只保存在业务系统服务端,不进入浏览器、公开文档或代码仓库。