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 常见实现:三处最容易混的地方

  1. iss 一定要在授权响应里吗? RFC 9207 定义了这个参数、RFC 9700 把它列为
    Mix-Up 的首选缓解手段之一;但一个只在单 IdP 场景下工作的应用,不做这项校验
    仍然能跑通。「跑得通」不等于「符合最佳实践」——05 章把这条说成一个判断而不是一条铁律。
  2. 授权码只能用一次吗? RFC 6749 要求授权服务器拒绝被重复使用的授权码
    (用过的码必须作废)。至于「失败的那一次算不算用过」,是实现细节:
    本课主案例的表现是「失败也消耗」,正文把它写成需要亲自验证的一条,而不是协议结论。
  3. 刷新令牌轮换 = 旧令牌立刻作废吗? RFC 9700 要求公开客户端使用轮换的刷新令牌,
    并且把「旧令牌再次出现」当作泄露信号去处理;但「轮换」与「检测到重放就撤销整条链」
    是两件事,后者要显式实现(reuse detection)。本课主案例的默认行为只做前者——
    正文如实写成默认行为,不写成协议要求。

术语口径

本课用到的术语在 glossary.md 里给了本课程口径的工作定义;规范的严格定义以
上表出处为准。两边冲突时,以上表为准,并在正文里说明差异。

进入 keel 阅读