KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
资料与课程依据 — keel 龙骨
SSO 工程课:协议、令牌与会话 的参考信息:资料与课程依据
这份文档的用途
本课的每一处协议结论都要能追到一个规范条文或官方文档;追不到的,正文会写明
「这是本课的设计说明」,不写成协议要求。这份文档是那张对照表的落点。
三类依据要分开看,正文里也是分开写的:
| 类别 | 含义 | 正文里的写法 |
|---|---|---|
| 协议规定 | 规范用 MUST / SHOULD 之类的措辞写死的行为 | 写「规范要求……」并给出条款出处 |
| 常见实现 | 规范没规定、但主流实现默认这么做(本课主案例是 Keycloak 26.8.1) | 写「默认行为是……」,并说明它不属于协议要求 |
| 本课设计 | 为了讲清楚而选的教学形态(最小实现、固定配置、示例口径) | 写「本课这样做,真实部署要换」 |
第三类不冒充前两类。最典型的例子是 course/project/ 用 HS256 对称签名
代替真实部署的 RS256/ES256——原因与代价写在 project/README.md,07 章把它当成一个必须替换的点。
出处清单
| 依据 | 出处 URL | 检索日期 | 本课用在哪 |
|---|---|---|---|
OAuth 2.0 授权框架(授权码流程、state、redirect_uri 精确匹配) |
https://www.rfc-editor.org/rfc/rfc6749 | 2026-10-15 | 02、06 章 |
PKCE(code_challenge / code_verifier / S256) |
https://www.rfc-editor.org/rfc/rfc7636 | 2026-10-15 | 02、06 章 |
Bearer token 的使用与错误码(invalid_token) |
https://www.rfc-editor.org/rfc/rfc6750 | 2026-10-15 | 03 章 |
JWT 结构与 claim 定义(iss / aud / exp / iat / jti) |
https://www.rfc-editor.org/rfc/rfc7519 | 2026-10-15 | 03 章 |
| JSON Web Signature(三段结构与签名校验) | https://www.rfc-editor.org/rfc/rfc7515 | 2026-10-15 | 03 章 |
JWK 与 JWK Set(kid / use / alg 的作用) |
https://www.rfc-editor.org/rfc/rfc7517 | 2026-10-15 | 03、07 章 |
| 授权服务器元数据(discovery 文档的字段来源) | https://www.rfc-editor.org/rfc/rfc8414 | 2026-10-15 | 01、02 章 |
授权响应中的发行者标识 iss(Mix-Up 防护) |
https://www.rfc-editor.org/rfc/rfc9207 | 2026-10-15 | 02、05、06 章 |
| OAuth 2.0 安全最佳实践(Mix-Up、授权码注入、刷新令牌轮换与 reuse detection) | https://www.rfc-editor.org/rfc/rfc9700 | 2026-10-15 | 05、06、07 章 |
OpenID Connect Core 1.0(ID Token、nonce、at_hash、auth_time、acr) |
https://openid.net/specs/openid-connect-core-1_0.html | 2026-10-15 | 02、03 章 |
| OpenID Connect Discovery 1.0 | https://openid.net/specs/openid-connect-discovery-1_0.html | 2026-10-15 | 01、02 章 |
| OpenID Connect Front-Channel Logout 1.0 | https://openid.net/specs/openid-connect-frontchannel-1_0.html | 2026-10-15 | 04 章 |
| OpenID Connect Back-Channel Logout 1.0 | https://openid.net/specs/openid-connect-backchannel-1_0.html | 2026-10-15 | 04 章 |
OpenID Connect RP-Initiated Logout 1.0(end_session_endpoint / id_token_hint / post_logout_redirect_uri) |
https://openid.net/specs/openid-connect-rpinitiated-1_0.html | 2026-10-15 | 04、07 章 |
OpenID Connect Session Management 1.0(session_state 与 check_session_iframe) |
https://openid.net/specs/openid-connect-session-1_0.html | 2026-10-15 | 04 章 |
| SAML 2.0 Core(断言、Subject、NameID、元数据交换) | https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf | 2026-10-15 | 01、05 章 |
| SAML 2.0 元数据 | https://docs.oasis-open.org/security/saml/v2.0/saml-metadata-2.0-os.pdf | 2026-10-15 | 05 章 |
| Keycloak 服务端管理文档(realm / client / 会话 / 密钥轮换) | https://www.keycloak.org/docs/latest/server_admin/ | 2026-10-15 | 01、04、07 章 |
Keycloak 应用接入文档(客户端类型、PKCE、client_secret) |
https://www.keycloak.org/docs/latest/securing_apps/ | 2026-10-15 | 02、03、06 章 |
上表里列的是规范与官方文档。本课主案例的运行输出(code、state、nonce、
各类 id、令牌寿命)来自真实运行记录,环境与版本见课级 README.md 的「关于证据口径」;
那些数字随环境变化,正文引用它们只为呈现参数的位置与关系。
规范规定 vs 常见实现:三处最容易混的地方
iss一定要在授权响应里吗? RFC 9207 定义了这个参数、RFC 9700 把它列为
Mix-Up 的首选缓解手段之一;但一个只在单 IdP 场景下工作的应用,不做这项校验
仍然能跑通。「跑得通」不等于「符合最佳实践」——05 章把这条说成一个判断而不是一条铁律。- 授权码只能用一次吗? RFC 6749 要求授权服务器拒绝被重复使用的授权码
(用过的码必须作废)。至于「失败的那一次算不算用过」,是实现细节:
本课主案例的表现是「失败也消耗」,正文把它写成需要亲自验证的一条,而不是协议结论。 - 刷新令牌轮换 = 旧令牌立刻作废吗? RFC 9700 要求公开客户端使用轮换的刷新令牌,
并且把「旧令牌再次出现」当作泄露信号去处理;但「轮换」与「检测到重放就撤销整条链」
是两件事,后者要显式实现(reuse detection)。本课主案例的默认行为只做前者——
正文如实写成默认行为,不写成协议要求。
术语口径
本课用到的术语在 glossary.md 里给了本课程口径的工作定义;规范的严格定义以
上表出处为准。两边冲突时,以上表为准,并在正文里说明差异。