KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
SSO 概念课:把应用课抛出的概念讲清楚 — keel 龙骨
SSO 概念课:把应用课抛出的概念讲清楚 的参考信息:SSO 概念课:把应用课抛出的概念讲清楚
短页参考 · 概念从哪来、是什么、解决什么问题、长什么样
《SSO 应用课》 是按主题一路往下写的:一章讲该选哪条协议、一章讲怎么把应用接进来、一章讲断了怎么定位。它假定你已经知道登录大致是怎么回事,直接把判断讲给你听。
但每一章都会抛出概念——IdP、SP、断言、令牌、redirect_uri、state、授权码、PKCE、会话、单点登出。这些概念在正文里是按"够用"的深度出现的:讲 PKCE 时说清"换令牌时要带上 code_verifier",就够你把 SPA 接起来了。
这门课补的就是那一段:当应用课里的某个概念让你推不下去、或者你只是想知道它到底是怎么回事时,来这里读一页。
它刻意很短。AI 已经替你写好了大部分接入代码,你不需要跟着再挖一遍协议细节——你需要的只是知道这个概念怎么产生的、它是什么、它解决什么问题、它面对什么需求、它具体长什么样。把这五件事弄清楚,回头再看应用课里那些面向场景与取舍的判断,会顺得多。
这门课是什么,不是什么
| 它是 | 它不是 |
|---|---|
| 参考页:一页一个概念,4–6 分钟读完 | 不是教程:没有从零讲起的引导 |
| 概念的来历与形态:它为什么需要存在、长什么样 | 不是原理深挖:不读协议规范全文、不推实现细节 |
| 应用课的下钻入口:从被卡住的那一句点进来 | 不是应用课的替代:选型、接入、定位仍在应用课 |
概念地图
| 概念 | 类型 | 回答什么 | 对应应用课 |
|---|---|---|---|
| 00 IdP 与 SP(依赖方) | 主题概念 | 谁发起、谁验证、谁保存会话;issuer 为什么必须和实际访问地址一致 |
01 章 · 全景与选型 |
| 01 断言与令牌 | 衍生概念(服务于「IdP 与 SP」) | "IdP 说这个人是谁"那句话长什么样;JWT 三段各管什么,为什么签名段不是加密段 | 03 章 · 令牌与校验 |
| 02 重定向与回跳 | 主题概念 | 为什么必须让浏览器亲自跑一趟;redirect_uri 为什么是边界;state 与 iss 各防什么 |
02 章 · 授权码流与 PKCE |
| 03 授权码与 PKCE | 衍生概念(服务于「重定向与回跳」) | code 为什么不是令牌、为什么只能用一次;code_verifier 与 code_challenge 各是谁生成的 |
02 章 · 授权码流与 PKCE |
| 04 会话与单点登出 | 主题概念 | IdP 侧会话与应用侧会话为什么是两回事;"登出一次全部失效"为什么难 | 04 章 · 会话与登出 |
主题概念是被应用课当作章节主题讲的东西;衍生概念是为了理解某个主题概念而必须先弄懂的东西——比如不懂"断言",就说不清"应用凭什么相信 IdP 的话"。每一页都会在第五节列出它带出的衍生概念,以及该去哪一页。
怎么读
- 按需读:应用课读到哪一句卡住,就从那一句旁边的链接点进来;每页最后都会指回去。
- 也可以当最小地图读:五页按顺序读一遍约 25 分钟,你会拿到一次 SSO 登录里这几个概念之间的位置关系。
- 不要背。每一页的重点不是定义,而是"这个概念改变了你的哪个判断"——那句话才是要带走的。
与相邻课程的分工
- 《SSO 应用课》:同源课。它管"怎么用对"(选哪条协议、怎么接、断了怎么定位),本课管"这个概念是什么"。同一个概念在两边的深度不同——应用课讲到"够你做判断"为止,本课讲到"你知道它是什么、从哪来"为止。
- 《权限与多租户课》:那边讲的是另一件事。它管授权(你能做什么、数据怎么隔离),本课管认证(你是谁、这个身份怎么在多个系统之间传递)。
- 基础课与概念课没有直接关系:入门者不问"这个构件为什么这样设计",所以本课不回指基础课;两者的读者本来就不是一批人。
关于证据口径
页面里的 URL、JSON、cookie 清单与命令输出都来自一次完整的真实登录 / 登出记录,环境是 Keycloak 26.8.1(dev 模式,宿主 8081 → 容器 8080,realm = sso-lab),参与的两个客户端是公开客户端 sp-spa 与机密客户端 sp-portal:
- 授权请求 URL、回跳的
Location响应头、令牌载荷、cookie 清单、JWKS 都是照录,数值未经改写。 - 里面的
code、state、nonce与两段令牌都是那一次运行真实产生的值——重跑一遍会得到不同的值;iss、aud、sub这类字段之间的关系不变。请核验的是字段之间的关系,不要把某个具体串当结论抄下来。 - 脚本与浏览器有一处行为差异:IdP 给会话 cookie 加了
Secure; SameSite=None,普通 HTTP 客户端不会回传它。这一处在 04 会话与单点登出 里单独说明了,不代表浏览器也登不上。
课程导读(起点自检、阅读方式)见 course/README.md。