第 1 步
注册应用
注册应用,拿到 client_id
填写应用名与回调地址(redirect_uri)。回调地址必须是 HTTPS 且完全匹配——登录成功后我们只会跳回这里。localhost 可以用 HTTP,方便本地开发。
新注册的应用处于待审核状态,管理员通过后才能发起登录。这是防滥用的基线策略,不是可选项。
标准 OpenID Connect:授权码 + PKCE。下面每个地址都是完整可用的,直接复制即可。
填写应用名与回调地址(redirect_uri)。回调地址必须是 HTTPS 且完全匹配——登录成功后我们只会跳回这里。localhost 可以用 HTTP,方便本地开发。
新注册的应用处于待审核状态,管理员通过后才能发起登录。这是防滥用的基线策略,不是可选项。
先生成 code_verifier(随机串),再取它的 SHA-256 作为 code_challenge。PKCE 对所有客户端都是强制的,公开客户端与机密客户端都不例外。
https://identity.chwjh.com/oauth/authorize ?response_type=code &client_id=YOUR_CLIENT_ID &redirect_uri=https://yourapp.com/callback &scope=openid profile email &state=RANDOM &code_challenge=BASE64URL(SHA256(verifier)) &code_challenge_method=S256
用户登录后浏览器会带着 ?code=...&state=... 回到你的 redirect_uri。务必先核对 state 与你发出的一致。
curl -X POST https://identity.chwjh.com/oauth/token -H 'content-type: application/x-www-form-urlencoded' -d grant_type=authorization_code -d code=THE_CODE -d redirect_uri=https://yourapp.com/callback -d client_id=YOUR_CLIENT_ID -d code_verifier=THE_VERIFIER
返回 access_token(JWT,1 小时)、id_token,以及——仅当你申请了 offline_access——refresh_token。机密客户端改用 HTTP Basic 传 client_id:client_secret。
在你自己的服务端用 JWKS 本地验签,不要每次都来问我们——除了 5 分钟缓存的 JWKS,全程不需要网络往返。
// 1. 取公钥(可缓存 5 分钟) GET https://identity.chwjh.com/.well-known/jwks.json // 2. 按 JWT header 里的 kid 找到对应公钥验签 // 3. 核对 iss / aud / exp iss = https://identity.chwjh.com aud = YOUR_CLIENT_ID
签名算法是 EdDSA(主)与 RS256(兼容),密钥会轮换,所以务必按 kid 查找,不要写死。
| 用途 | 地址 |
|---|---|
| 发现文档 | https://identity.chwjh.com/.well-known/openid-configuration |
| JWKS | https://identity.chwjh.com/.well-known/jwks.json |
| 授权 | GET https://identity.chwjh.com/oauth/authorize |
| 换取令牌 | POST https://identity.chwjh.com/oauth/token |
| 用户信息 | GET https://identity.chwjh.com/oauth/userinfo |
| 令牌内省 | POST https://identity.chwjh.com/oauth/introspect |
| 吊销令牌 | POST https://identity.chwjh.com/oauth/revoke |
| OpenAPI | https://identity.chwjh.com/openapi/identity-api.yaml |
openid | 确认用户身份,返回 id_token。几乎总是需要。 |
profile | 名字与头像。 |
email | 邮箱地址与是否已验证。 |
offline_access | 换取 refresh_token;不申请就没有。 |
entitlements:read | 读取用户在各 Cmine 产品的订阅状态。 |