<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>第二部分：协议与标准 on IDaaS Book</title><link>https://idaas.xlabs.club/docs/protocols/</link><description>Recent content in 第二部分：协议与标准 on IDaaS Book</description><generator>Hugo</generator><language>zh-CN</language><copyright>Copyright (c) 2020-2024 xlabs.club</copyright><atom:link href="https://idaas.xlabs.club/docs/protocols/index.xml" rel="self" type="application/rss+xml"/><item><title>第5章：IAM OAuth 2.0 深度解读 — 授权模式、令牌管理与安全最佳实践 | IDaaS Book</title><link>https://idaas.xlabs.club/docs/protocols/oauth2-deep-dive/</link><pubDate>Thu, 01 Feb 2024 00:00:00 +0800</pubDate><guid>https://idaas.xlabs.club/docs/protocols/oauth2-deep-dive/</guid><description>&lt;h2 id="51-设计哲学"&gt;5.1 设计哲学&lt;/h2&gt;
&lt;p&gt;OAuth 2.0（RFC 6749）是由 IETF 制定的授权框架，它的核心使命简单而明确：&lt;strong&gt;让用户可以在不向第三方应用暴露自己密码的情况下，授权该应用访问自己在服务提供商处的受保护资源。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="oauth-20-解决的真实问题"&gt;OAuth 2.0 解决的真实问题&lt;/h3&gt;
&lt;p&gt;想象一个场景：你想让一个照片冲印应用访问你存在云盘上的照片。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;没有 OAuth 的糟糕做法&lt;/strong&gt;：你给冲印应用你的云盘用户名和密码。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;冲印应用可以冒充你做任何事（不是只读照片，还能删除文件、修改设置）&lt;/li&gt;
&lt;li&gt;你无法限制冲印应用的权限范围&lt;/li&gt;
&lt;li&gt;你改密码后，冲印应用就失效了，但你得在所有第三方应用上重设&lt;/li&gt;
&lt;li&gt;冲印应用的服务器被黑，你的密码就泄露了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;OAuth 2.0 的做法&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;冲印应用重定向你到云盘的授权页面&lt;/li&gt;
&lt;li&gt;你（在云盘的页面上）登录并确认&amp;quot;允许冲印应用读取照片&amp;quot;&lt;/li&gt;
&lt;li&gt;云盘给冲印应用发一个访问令牌（Access Token），只能读照片，有效期 1 小时&lt;/li&gt;
&lt;li&gt;冲印应用用这个令牌访问你的照片&lt;/li&gt;
&lt;li&gt;你随时可以在云盘上撤销这个授权&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="52-核心角色"&gt;5.2 核心角色&lt;/h2&gt;
&lt;p&gt;OAuth 2.0 定义了四个核心角色：&lt;/p&gt;



&lt;div class="expressive-code"&gt;
 &lt;figure class="frame not-content"&gt;
 &lt;figcaption class="header"&gt;
 &lt;span class="title"&gt;&lt;/span&gt;
 &lt;/figcaption&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;资源所有者（Resource Owner）
 │ 通常是终端用户
 │ 拥有受保护资源的数据
 ▼
客户端（Client）
 │ 第三方应用，想访问资源
 │ 
 ▼
授权服务器（Authorization Server）
 │ 认证资源所有者，发放令牌
 │ 
 ▼
资源服务器（Resource Server）
 托管受保护资源的服务&lt;/code&gt;&lt;/pre&gt;
 &lt;/figure&gt;
&lt;/div&gt;
&lt;h2 id="53-授权模式grant-types"&gt;5.3 授权模式（Grant Types）&lt;/h2&gt;
&lt;p&gt;OAuth 2.0 定义了四种核心授权模式，加上 PKCE 扩展和 Device Flow：&lt;/p&gt;
&lt;h3 id="531-授权码模式authorization-code"&gt;5.3.1 授权码模式（Authorization Code）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;这是最安全、最广泛使用的模式&lt;/strong&gt;。核心特征是用户浏览器不直接接触 Access Token——它只拿到一个一次性授权码（authorization code），由后端服务器用这个 code 去换 token，用户密码全程不经过客户端后端。&lt;/p&gt;</description></item><item><title>OAuth 2.0 授权码流程与 PKCE — IAM 认证授权核心协议图解 | IDaaS Book</title><link>https://idaas.xlabs.club/docs/protocols/oauth2-authorization-code-pkce/</link><pubDate>Tue, 07 Jul 2026 00:00:00 +0800</pubDate><guid>https://idaas.xlabs.club/docs/protocols/oauth2-authorization-code-pkce/</guid><description>&lt;h2 id="为什么需要这份图解"&gt;为什么需要这份图解&lt;/h2&gt;
&lt;p&gt;OAuth 2.0 授权码流程（Authorization Code Flow）是所有现代身份协议的基础。OIDC 基于它、单页应用靠它、移动 App 也用它——但大部分资料要么只有文字描述，要么跳过了关键的安全细节。&lt;/p&gt;
&lt;p&gt;这份图解的目标是：&lt;strong&gt;一图看懂完整交互，然后逐帧理解每个参数的设计意图和攻击面。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="授权码流程完整时序图"&gt;授权码流程完整时序图&lt;/h2&gt;
&lt;p&gt;下面是 OAuth 2.0 Authorization Code Flow 的标准交互，包含四个角色：用户（Resource Owner）、客户端（Client）、授权服务器（Authorization Server）和资源服务器（Resource Server）。&lt;/p&gt;
&lt;pre class="mermaid"&gt;
 sequenceDiagram
 actor User as 用户&amp;lt;br/&amp;gt;(Resource Owner)
 participant Client as 客户端&amp;lt;br/&amp;gt;(Client)
 participant AS as 授权服务器&amp;lt;br/&amp;gt;(Authorization Server)
 participant RS as 资源服务器&amp;lt;br/&amp;gt;(Resource Server)

 Note over User,RS: ═══ 第一步：发起授权请求 ═══
 User-&amp;gt;&amp;gt;Client: 1. 点击「使用 XX 账号登录」
 Client-&amp;gt;&amp;gt;Client: 2. 构造授权请求 URL&amp;lt;br/&amp;gt;含 client_id, redirect_uri,&amp;lt;br/&amp;gt;response_type=code, scope,&amp;lt;br/&amp;gt;state（防 CSRF 随机值）

 Note over User,RS: ═══ 第二步：用户授权 ═══
 Client-&amp;gt;&amp;gt;User: 3. HTTP 302 重定向到&amp;lt;br/&amp;gt;授权服务器的 /authorize 端点
 User-&amp;gt;&amp;gt;AS: 4. 浏览器跟随重定向，&amp;lt;br/&amp;gt;用户在授权服务器页面登录并确认授权
 AS-&amp;gt;&amp;gt;AS: 5. 验证用户身份&amp;lt;br/&amp;gt;检查 client_id 和 redirect_uri&amp;lt;br/&amp;gt;是否与注册时一致

 Note over User,RS: ═══ 第三步：获取授权码 ═══
 AS-&amp;gt;&amp;gt;User: 6. HTTP 302 重定向回&amp;lt;br/&amp;gt;redirect_uri?code=AUTH_CODE&amp;amp;state=xxx
 User-&amp;gt;&amp;gt;Client: 7. 浏览器跟随重定向，&amp;lt;br/&amp;gt;将 code 和 state 传给客户端
 Client-&amp;gt;&amp;gt;Client: 8. 验证 state 参数&amp;lt;br/&amp;gt;（防止 CSRF 攻击）

 Note over User,RS: ═══ 第四步：用授权码换令牌 ═══
 Client-&amp;gt;&amp;gt;AS: 9. POST /token&amp;lt;br/&amp;gt;grant_type=authorization_code&amp;lt;br/&amp;gt;code=AUTH_CODE&amp;lt;br/&amp;gt;redirect_uri（再次发送以验证）&amp;lt;br/&amp;gt;client_id + client_secret
 AS-&amp;gt;&amp;gt;AS: 10. 验证 code（一次性）&amp;lt;br/&amp;gt;验证 redirect_uri 一致性&amp;lt;br/&amp;gt;验证 client 身份
 AS-&amp;gt;&amp;gt;Client: 11. 返回 {access_token,&amp;lt;br/&amp;gt;refresh_token, expires_in}

 Note over User,RS: ═══ 第五步：使用令牌访问资源 ═══
 Client-&amp;gt;&amp;gt;RS: 12. GET /api/user&amp;lt;br/&amp;gt;Authorization: Bearer {access_token}
 RS-&amp;gt;&amp;gt;AS: 13. （可选）验证 token&amp;lt;br/&amp;gt;introspect 或本地校验
 RS-&amp;gt;&amp;gt;Client: 14. 返回受保护资源
&lt;/pre&gt;

&lt;h3 id="每一步的设计意图"&gt;每一步的设计意图&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;步骤&lt;/th&gt;
					&lt;th&gt;关键参数&lt;/th&gt;
					&lt;th&gt;为什么这么设计&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;response_type=code&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;指定使用授权码模式（不是 implicit）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;state&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;随机值，防止 CSRF——客户端在第 8 步验证，攻击者无法伪造&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;redirect_uri&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;必须在授权服务器上预注册，防止令牌被重定向到攻击者控制的地址&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;用户在授权服务器页面上登录&lt;/td&gt;
					&lt;td&gt;客户端永远看不到用户的密码——这是 OAuth 的核心理念&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;6&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;code&lt;/code&gt; 通过浏览器返回&lt;/td&gt;
					&lt;td&gt;授权码作为中间凭证，即使被截获也没有用——因为没有 client_secret&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;9&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;code&lt;/code&gt; + &lt;code&gt;client_secret&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;授权码 + 客户端密钥双重验证，确保只有合法客户端能换取 token&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;9&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;redirect_uri&lt;/code&gt; 再次发送&lt;/td&gt;
					&lt;td&gt;防止授权码被注入到其他客户端的回调中（mix-up attack 防护）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;12&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Authorization: Bearer&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Bearer token——持有即有权，所以必须通过 HTTPS 传输&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="pkce授权码流程的安全补丁"&gt;PKCE：授权码流程的安全补丁&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;PKCE（Proof Key for Code Exchange，RFC 7636）&lt;/strong&gt; 是授权码流程的关键安全扩展。它最初为移动 App 设计（因为移动端无法安全存储 client_secret），但现在 &lt;strong&gt;OAuth 2.1 要求所有客户端都必须使用 PKCE&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>OAuth 2.0 攻击面与防护 — IAM 安全威胁分析与防御指南 | IDaaS Book</title><link>https://idaas.xlabs.club/docs/protocols/oauth2-attack-surface/</link><pubDate>Wed, 08 Jul 2026 00:00:00 +0800</pubDate><guid>https://idaas.xlabs.club/docs/protocols/oauth2-attack-surface/</guid><description>&lt;h2 id="为什么需要这份攻击面分析"&gt;为什么需要这份攻击面分析&lt;/h2&gt;
&lt;p&gt;OAuth 2.0 是 IDaaS 世界的授权语言，但它不是「用了就安全」的银弹。RFC 6749 在 2012 年发布时，某些安全假设（如「机密客户端不会运行在不可信环境」）在移动和 SPA 时代已经被打破。&lt;/p&gt;
&lt;p&gt;理解 OAuth 的攻击面不是为了「破解 OAuth」，而是为了&lt;strong&gt;正确地实现它&lt;/strong&gt;。以下五个攻击面是过去十年里真实发生过的漏洞模式，每一个都配有攻击流程图和防护措施。&lt;/p&gt;
&lt;h2 id="五大攻击面总览"&gt;五大攻击面总览&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;#&lt;/th&gt;
					&lt;th&gt;攻击面&lt;/th&gt;
					&lt;th&gt;根本原因&lt;/th&gt;
					&lt;th&gt;关键防护&lt;/th&gt;
					&lt;th&gt;相关规范&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;1&lt;/td&gt;
					&lt;td&gt;Redirect URI 劫持&lt;/td&gt;
					&lt;td&gt;授权服务器未严格校验 redirect_uri&lt;/td&gt;
					&lt;td&gt;精确匹配白名单&lt;/td&gt;
					&lt;td&gt;RFC 6749 §3.1.2&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;CSRF / State 参数缺失&lt;/td&gt;
					&lt;td&gt;客户端不验证 state&lt;/td&gt;
					&lt;td&gt;生成并验证随机 state&lt;/td&gt;
					&lt;td&gt;RFC 6749 §10.12&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;授权码拦截&lt;/td&gt;
					&lt;td&gt;无 PKCE 时授权码可被恶意 App 截获&lt;/td&gt;
					&lt;td&gt;PKCE（code_challenge + code_verifier）&lt;/td&gt;
					&lt;td&gt;RFC 7636&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;Mix-Up Attack&lt;/td&gt;
					&lt;td&gt;客户端未校验 issuer / 端点一致性&lt;/td&gt;
					&lt;td&gt;验证 iss 参数 + redirect_uri 二次校验&lt;/td&gt;
					&lt;td&gt;RFC 9207&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;5&lt;/td&gt;
					&lt;td&gt;Token 泄露与重放&lt;/td&gt;
					&lt;td&gt;Bearer Token 持有即有权&lt;/td&gt;
					&lt;td&gt;DPoP / mTLS sender-constraining + 短有效期&lt;/td&gt;
					&lt;td&gt;RFC 9449&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="1-redirect-uri-劫持"&gt;1. Redirect URI 劫持&lt;/h2&gt;
&lt;h3 id="攻击原理"&gt;攻击原理&lt;/h3&gt;
&lt;p&gt;攻击者诱导用户点击一个精心构造的授权链接，其中 &lt;code&gt;redirect_uri&lt;/code&gt; 被替换为攻击者控制的地址。用户在授权服务器上正常登录后，授权码被重定向到攻击者服务器。&lt;/p&gt;</description></item><item><title>JWT 深入解读 — 结构、声明、验证与安全最佳实践 | IDaaS Book</title><link>https://idaas.xlabs.club/docs/protocols/jwt-deep-dive/</link><pubDate>Sun, 12 Jul 2026 00:00:00 +0800</pubDate><guid>https://idaas.xlabs.club/docs/protocols/jwt-deep-dive/</guid><description>&lt;h2 id="jwt-是什么"&gt;JWT 是什么&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;JWT（JSON Web Token，RFC 7519）&lt;/strong&gt; 是 IAM 领域最核心的数据格式之一。它不是认证协议，而是一种&lt;strong&gt;紧凑的、URL 安全的令牌格式&lt;/strong&gt;，用于在双方之间传递声明（Claims）。OAuth 2.0 的 Access Token、OpenID Connect 的 ID Token 都使用 JWT 作为载体。&lt;/p&gt;
&lt;p&gt;一句话理解：JWT 是一个&lt;strong&gt;自包含的、可验证的 JSON 对象&lt;/strong&gt;——你把信息编码进去，接收方可以独立验证它的真实性和完整性，不需要回查颁发服务器。&lt;/p&gt;
&lt;h3 id="jwt-在-iam-中的角色"&gt;JWT 在 IAM 中的角色&lt;/h3&gt;
&lt;pre class="mermaid"&gt;
 graph LR
 A[认证请求] --&amp;gt; B[IDP 验证身份]
 B --&amp;gt; C[签发 JWT]
 C --&amp;gt; D1[Access Token&amp;lt;br/&amp;gt;访问 API]
 C --&amp;gt; D2[ID Token&amp;lt;br/&amp;gt;身份信息]
 C --&amp;gt; D3[Refresh Token&amp;lt;br/&amp;gt;续期]
 D1 --&amp;gt; E[Resource Server&amp;lt;br/&amp;gt;验证 JWT 签名和声明]
 D2 --&amp;gt; F[Client&amp;lt;br/&amp;gt;解析用户信息]
&lt;/pre&gt;

&lt;p&gt;JWT 不解决「你是谁」的问题（那是认证协议的事），它解决的是「我怎么相信你给我的信息是真的」。&lt;/p&gt;
&lt;h2 id="jwt-的结构"&gt;JWT 的结构&lt;/h2&gt;
&lt;p&gt;一个 JWT 由三部分组成，用 &lt;code&gt;.&lt;/code&gt; 分隔：&lt;/p&gt;</description></item><item><title>OAuth 2.1 相比 OAuth 2.0 的变化 — IAM 协议升级与迁移指南 | IDaaS Book</title><link>https://idaas.xlabs.club/docs/protocols/oauth2.1-changes/</link><pubDate>Wed, 08 Jul 2026 00:00:00 +0800</pubDate><guid>https://idaas.xlabs.club/docs/protocols/oauth2.1-changes/</guid><description>&lt;h2 id="为什么需要-oauth-21"&gt;为什么需要 OAuth 2.1&lt;/h2&gt;
&lt;p&gt;OAuth 2.0（RFC 6749）发布于 2012 年。在接下来近十年里，安全研究者发现了若干严重攻击面——Redirect URI 劫持、授权码拦截、CSRF、Mix-Up Attack、Token 泄露重放。社区通过一系列补充 RFC 逐个修补：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RFC 7636 (PKCE)&lt;/strong&gt;：防止授权码拦截（2015）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RFC 6819 / Security BCP&lt;/strong&gt;：安全威胁模型与缓解措施&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RFC 9207 (iss 参数)&lt;/strong&gt;：防止 Mix-Up Attack（2022）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RFC 9449 (DPoP)&lt;/strong&gt;：Token 发件人约束（2024）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OAuth 2.1 不是全新协议，而是把这些分散的最佳实践整合成一份统一规范。它同时移除了已被证明不安全的流程，并强化了默认安全配置。&lt;/p&gt;
&lt;p&gt;如果你现在在写一个新的 OAuth 客户端或授权服务器，应该直接以 OAuth 2.1 为目标——2.0 的安全模型已经过期。&lt;/p&gt;
&lt;h2 id="变化总览"&gt;变化总览&lt;/h2&gt;
&lt;pre class="mermaid"&gt;
 graph TD
 A[&amp;#34;OAuth 2.0 (RFC 6749, 2012)&amp;#34;] --&amp;gt; B[&amp;#34;OAuth 2.1 (draft-ietf-oauth-v2-1)&amp;#34;]
 
 B --&amp;gt; C1[&amp;#34;✅ 保留 &amp;amp; 强化&amp;#34;]
 B --&amp;gt; C2[&amp;#34;❌ 废弃 &amp;amp; 移除&amp;#34;]
 B --&amp;gt; C3[&amp;#34;🆕 新增&amp;#34;]

 C1 --&amp;gt; D1[&amp;#34;Authorization Code Flow&amp;#34;]
 C1 --&amp;gt; D2[&amp;#34;Client Credentials Flow&amp;#34;]
 C1 --&amp;gt; D3[&amp;#34;Device Code Flow&amp;lt;br/&amp;gt;(RFC 8628)&amp;#34;]
 C1 --&amp;gt; D4[&amp;#34;Refresh Token&amp;#34;]
 C1 --&amp;gt; D5[&amp;#34;Bearer Token&amp;lt;br/&amp;gt;(不推荐，但仍可用)&amp;#34;]

 C2 --&amp;gt; E1[&amp;#34;Implicit Grant&amp;lt;br/&amp;gt;(response_type=token)&amp;#34;]
 C2 --&amp;gt; E2[&amp;#34;ROPC / Password Grant&amp;lt;br/&amp;gt;(grant_type=password)&amp;#34;]
 C2 --&amp;gt; E3[&amp;#34;无 PKCE 的授权码流程&amp;#34;]
 C2 --&amp;gt; E4[&amp;#34;redirect_uri 宽松匹配&amp;#34;]

 C3 --&amp;gt; F1[&amp;#34;PKCE 对所有客户端强制&amp;#34;]
 C3 --&amp;gt; F2[&amp;#34;DPoP (RFC 9449)&amp;#34;]
 C3 --&amp;gt; F3[&amp;#34;iss 参数 (RFC 9207)&amp;#34;]
 C3 --&amp;gt; F4[&amp;#34;Refresh Token 发件人约束&amp;#34;]
 C3 --&amp;gt; F5[&amp;#34;redirect_uri 精确匹配&amp;#34;]
&lt;/pre&gt;

&lt;h2 id="七大核心变化"&gt;七大核心变化&lt;/h2&gt;
&lt;h3 id="1-pkce-对所有客户端强制"&gt;1. PKCE 对所有客户端强制&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;OAuth 2.0&lt;/strong&gt;：PKCE（Proof Key for Code Exchange）只推荐给公共客户端（SPA、移动 App），机密客户端可以不用。&lt;/p&gt;</description></item><item><title>第6章：OpenID Connect — ID Token、UserInfo 端点与认证流程 | IDaaS Book</title><link>https://idaas.xlabs.club/docs/protocols/openid-connect/</link><pubDate>Fri, 02 Feb 2024 00:00:00 +0800</pubDate><guid>https://idaas.xlabs.club/docs/protocols/openid-connect/</guid><description>&lt;h2 id="61-oauth-20-缺了什么"&gt;6.1 OAuth 2.0 缺了什么？&lt;/h2&gt;
&lt;p&gt;OAuth 2.0 解决的是&lt;strong&gt;授权&lt;/strong&gt;问题——我允许这个应用访问我的资源。但它没有解决&lt;strong&gt;认证&lt;/strong&gt;问题——这个用户是谁？&lt;/p&gt;
&lt;p&gt;在企业 IAM（身份与访问管理）体系中，认证是授权的前提。一个完整的 IAM 平台不仅要能发 Token，还要能标准地回答「这个 Token 代表谁」。这就是 OIDC 在 IAM 栈中的位置——它是 OAuth 2.0 之上专门解决&lt;strong&gt;身份认证&lt;/strong&gt;的标准化层。&lt;/p&gt;
&lt;p&gt;很多开发者早期犯的错误是用 OAuth 2.0 来做认证：&lt;/p&gt;



&lt;div class="expressive-code"&gt;
 &lt;figure class="frame not-content"&gt;
 &lt;figcaption class="header"&gt;
 &lt;span class="title"&gt;&lt;/span&gt;
 &lt;/figcaption&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;用户通过 OAuth 登录了，所以我知道他是谁&amp;#34;&lt;/code&gt;&lt;/pre&gt;
 &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;但这不安全，因为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OAuth 2.0 没有定义用户身份的标准化传递方式&lt;/li&gt;
&lt;li&gt;Access Token 不包含用户身份信息（或者每个实现各不相同）&lt;/li&gt;
&lt;li&gt;没有标准化的发现机制&lt;/li&gt;
&lt;li&gt;没有会话管理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;OpenID Connect（OIDC）&lt;/strong&gt; 就是 OAuth 2.0 之上的一个薄层，专门解决认证问题。&lt;/p&gt;
&lt;h2 id="62-oidc-的核心概念"&gt;6.2 OIDC 的核心概念&lt;/h2&gt;
&lt;p&gt;OIDC = OAuth 2.0 + 身份认证 + JWT&lt;/p&gt;
&lt;p&gt;OIDC 在 OAuth 2.0 基础上增加了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ID Token&lt;/strong&gt;（JWT 格式）：携带用户身份信息的安全令牌&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UserInfo 端点&lt;/strong&gt;：获取用户额外属性的标准接口&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发现文档&lt;/strong&gt;：自动发现服务器配置的标准机制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;会话管理&lt;/strong&gt;：登录、登出、会话状态&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="id-token-vs-access-token"&gt;ID Token vs Access Token&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;ID Token&lt;/th&gt;
					&lt;th&gt;Access Token&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;用途&lt;/td&gt;
					&lt;td&gt;认证（这是谁）&lt;/td&gt;
					&lt;td&gt;授权（能做什么）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;受众&lt;/td&gt;
					&lt;td&gt;客户端应用&lt;/td&gt;
					&lt;td&gt;资源服务器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;格式&lt;/td&gt;
					&lt;td&gt;JWT&lt;/td&gt;
					&lt;td&gt;JWT 或不透明字符串&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;包含用户信息&lt;/td&gt;
					&lt;td&gt;是&lt;/td&gt;
					&lt;td&gt;不一定&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;应该发送给资源服务器？&lt;/td&gt;
					&lt;td&gt;不&lt;/td&gt;
					&lt;td&gt;是&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="63-id-token-深度解析"&gt;6.3 ID Token 深度解析&lt;/h2&gt;
&lt;h3 id="jwt-结构"&gt;JWT 结构&lt;/h3&gt;
&lt;p&gt;JWT（JSON Web Token，RFC 7519）由三部分组成，用 &lt;code&gt;.&lt;/code&gt; 分隔：&lt;/p&gt;</description></item><item><title>第7章：IAM SAML 2.0 身份联邦 — 断言、绑定、元数据与 SSO 流程图解 | IDaaS Book</title><link>https://idaas.xlabs.club/docs/protocols/saml2/</link><pubDate>Sat, 03 Feb 2024 00:00:00 +0800</pubDate><guid>https://idaas.xlabs.club/docs/protocols/saml2/</guid><description>&lt;h2 id="71-历史与现状"&gt;7.1 历史与现状&lt;/h2&gt;
&lt;p&gt;在企业 IAM（身份与访问管理）体系中，SAML（Security Assertion Markup Language）是由 OASIS 标准组织制定的基于 XML 的身份联邦协议。SAML 2.0 于 2005 年发布，是 Web 浏览器 SSO 的行业先驱，至今仍是 IAM 身份联邦场景中与 OIDC 并列的两大支柱协议之一。&lt;/p&gt;
&lt;p&gt;尽管 OIDC 在新应用中的采用率已远超 SAML，但 SAML 2.0 在企业级应用中依然占有重要地位。特别是在以下场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;金融、政府、教育等传统行业&lt;/li&gt;
&lt;li&gt;大型企业的遗留应用&lt;/li&gt;
&lt;li&gt;需要与 Microsoft AD FS 集成的场景&lt;/li&gt;
&lt;li&gt;教育和研究联邦（如 eduGAIN、InCommon，基于 Shibboleth）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="saml-vs-oidc-的历史视角"&gt;SAML vs OIDC 的历史视角&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th&gt;SAML 2.0&lt;/th&gt;
					&lt;th&gt;OIDC&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;发布时间&lt;/td&gt;
					&lt;td&gt;2005&lt;/td&gt;
					&lt;td&gt;2014&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;数据格式&lt;/td&gt;
					&lt;td&gt;XML&lt;/td&gt;
					&lt;td&gt;JSON&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;签名方式&lt;/td&gt;
					&lt;td&gt;XML DSig&lt;/td&gt;
					&lt;td&gt;JWS&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;加密方式&lt;/td&gt;
					&lt;td&gt;XML Enc&lt;/td&gt;
					&lt;td&gt;JWE&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;绑定协议&lt;/td&gt;
					&lt;td&gt;重定向、POST、Artifact 等&lt;/td&gt;
					&lt;td&gt;HTTP（Redirect/POST，含 form_post/jwt response mode）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;移动端支持&lt;/td&gt;
					&lt;td&gt;差&lt;/td&gt;
					&lt;td&gt;好&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SPA 支持&lt;/td&gt;
					&lt;td&gt;差&lt;/td&gt;
					&lt;td&gt;好&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;复杂度&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;低&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;行业采用&lt;/td&gt;
					&lt;td&gt;传统企业&lt;/td&gt;
					&lt;td&gt;现代应用&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;一句话总结：&lt;strong&gt;遗留系统用 SAML，新系统用 OIDC，作为 IDaaS 平台两者都要支持。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>SAML 2.0 攻击面与安全防护 — IAM 身份联邦安全深度分析 | IDaaS Book</title><link>https://idaas.xlabs.club/docs/protocols/saml2-attack-surface/</link><pubDate>Sun, 12 Jul 2026 00:00:00 +0800</pubDate><guid>https://idaas.xlabs.club/docs/protocols/saml2-attack-surface/</guid><description>&lt;h2 id="为什么需要-saml-安全分析"&gt;为什么需要 SAML 安全分析&lt;/h2&gt;
&lt;p&gt;上一章 

&lt;a class="link link--text" href="https://idaas.xlabs.club/docs/protocols/oauth2-attack-surface/"&gt;OAuth 2.0 攻击面与防护&lt;/a&gt; 分析了 OAuth 的五类攻击——但 IAM 身份联邦的另一大支柱 SAML 2.0 同样拥有自己的攻击面。在企业实践中，SAML 承载着金融、政务、教育等领域的身份联邦流量，一次 SAML 安全漏洞就可能导致跨系统身份伪造。&lt;/p&gt;
&lt;p&gt;SAML 的安全挑战与 OAuth 不同：OAuth 的安全问题多集中在 HTTP 重定向和 Token 传递环节，而 SAML 的根因在于 &lt;strong&gt;XML 解析的复杂性&lt;/strong&gt;——签名验证、XML Schema、实体引用等 XML 特性给了攻击者更多操作空间。&lt;/p&gt;
&lt;p&gt;以下四个攻击面是过去二十年里真实发生过的漏洞模式，每一个都配有攻击流程图、根因分析和防护方案。&lt;/p&gt;
&lt;h2 id="四大攻击面总览"&gt;四大攻击面总览&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;#&lt;/th&gt;
					&lt;th&gt;攻击面&lt;/th&gt;
					&lt;th&gt;根本原因&lt;/th&gt;
					&lt;th&gt;关键防护&lt;/th&gt;
					&lt;th&gt;相关规范&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;1&lt;/td&gt;
					&lt;td&gt;XML 签名包装（XSW）&lt;/td&gt;
					&lt;td&gt;SAML 处理器在签名校验后取错 XML 节点&lt;/td&gt;
					&lt;td&gt;仅信任签名引用的元素，使用 XPath 白名单&lt;/td&gt;
					&lt;td&gt;

&lt;a class="link link--text" href="https://docs.oasis-open.org/security/saml/v2.0/saml-sec-consider-2.0-os.pdf" rel="external"&gt;SAML 2.0 Security&lt;/a&gt; §3.1&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;断言重放（Replay）&lt;/td&gt;
					&lt;td&gt;SP 未校验断言的时效性/一次性/受众&lt;/td&gt;
					&lt;td&gt;校验 NotOnOrAfter + InResponseTo + Audience + OneTimeUse&lt;/td&gt;
					&lt;td&gt;

&lt;a class="link link--text" href="https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf" rel="external"&gt;SAML 2.0 Core&lt;/a&gt; §2.5&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;XXE 注入&lt;/td&gt;
					&lt;td&gt;SAML 处理器解析含外部实体的 XML 断言&lt;/td&gt;
					&lt;td&gt;禁用 DTD 和外部实体（XXE-safe parser config）&lt;/td&gt;
					&lt;td&gt;OWASP XXE Prevention&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;元数据伪造/MITM&lt;/td&gt;
					&lt;td&gt;攻击者替换 SP 元数据中的证书&lt;/td&gt;
					&lt;td&gt;证书 pinning、metadata 签名、TLS 双向校验&lt;/td&gt;
					&lt;td&gt;

&lt;a class="link link--text" href="https://docs.oasis-open.org/security/saml/v2.0/saml-metadata-2.0-os.pdf" rel="external"&gt;SAML 2.0 Metadata&lt;/a&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="1-xml-签名包装xsw"&gt;1. XML 签名包装（XSW）&lt;/h2&gt;
&lt;h3 id="攻击原理"&gt;攻击原理&lt;/h3&gt;
&lt;p&gt;XSW 是 SAML 历史上最著名也最危险的攻击类别（CVE-2012-0053 等）。核心思路是：&lt;strong&gt;XML 签名覆盖了原始断言，攻击者在签名覆盖之外插入伪造断言，利用 SAML 处理器「只验签不看节点」的缺陷完成身份伪造&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>SCIM 2.0 协议深度解读 — IAM 跨域身份同步标准 | IDaaS Book</title><link>https://idaas.xlabs.club/docs/protocols/scim-protocol/</link><pubDate>Mon, 05 Feb 2024 00:00:00 +0800</pubDate><guid>https://idaas.xlabs.club/docs/protocols/scim-protocol/</guid><description>&lt;h2 id="91-为什么需要-scimiam-用户生命周期的标准化"&gt;9.1 为什么需要 SCIM？——IAM 用户生命周期的标准化&lt;/h2&gt;
&lt;p&gt;在企业 IAM（身份与访问管理）体系中，OAuth 2.0 和 OIDC 解决了认证和授权问题，SAML 解决了联邦 SSO 问题，但它们都没有回答一个 IAM 核心问题：如何标准化地创建、更新和删除用户？SCIM 正是 IAM 用户生命周期管理的标准答案——它把&amp;quot;入职创建账号 → 调岗修改权限 → 离职回收身份&amp;quot;这一整套 IAM 流程变成了标准化的 REST API。&lt;/p&gt;
&lt;p&gt;在 SCIM 出现之前，每个系统都有自己的用户 API：&lt;/p&gt;



&lt;div class="expressive-code"&gt;
 &lt;figure class="frame not-content"&gt;
 &lt;figcaption class="header"&gt;
 &lt;span class="title"&gt;&lt;/span&gt;
 &lt;/figcaption&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;App1: POST /api/v1/users {&amp;#34;name&amp;#34;: &amp;#34;...&amp;#34;} ← 每种格式都不一样
App2: PUT /rest/user/create {&amp;#34;userName&amp;#34;: &amp;#34;...&amp;#34;}
App3: SOAP &amp;lt;CreateUser&amp;gt;&amp;lt;Name&amp;gt;...&amp;lt;/Name&amp;gt;&amp;lt;/CreateUser&amp;gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;SCIM（System for Cross-domain Identity Management）&lt;/strong&gt; 就是为了结束这种混乱而生的标准。它由 IETF 制定，共三份 RFC：&lt;strong&gt;RFC 7642&lt;/strong&gt;（定义、概念与概述）、&lt;strong&gt;RFC 7643&lt;/strong&gt;（Core Schema，含 User/Group 资源与 JSON 编码）、&lt;strong&gt;RFC 7644&lt;/strong&gt;（Protocol，REST API 与 PATCH 语义）。&lt;/p&gt;
&lt;h2 id="92-scim-的核心概念"&gt;9.2 SCIM 的核心概念&lt;/h2&gt;
&lt;h3 id="核心数据模型"&gt;核心数据模型&lt;/h3&gt;
&lt;p&gt;SCIM 定义了核心资源类型：&lt;/p&gt;</description></item><item><title>第8章：LDAP 与目录服务 — IAM 身份源集成、Active Directory 对接与目录同步 | IDaaS Book</title><link>https://idaas.xlabs.club/docs/protocols/ldap-directory-services/</link><pubDate>Sun, 04 Feb 2024 00:00:00 +0800</pubDate><guid>https://idaas.xlabs.club/docs/protocols/ldap-directory-services/</guid><description>&lt;h2 id="81-iam-目录服务概述--ldap-与-active-directory-基础"&gt;8.1 IAM 目录服务概述 — LDAP 与 Active Directory 基础&lt;/h2&gt;
&lt;p&gt;目录服务是一种专门为读操作优化的分布式数据库，用于存储组织化的、层次化的信息。在 IAM 体系中，目录服务是最重要的身份数据源——大多数企业的员工身份仍然以 LDAP/AD 为权威来源，IAM 平台通过 LDAP 协议消费这些身份数据，再向现代应用暴露 OIDC/SAML 等标准协议。&lt;/p&gt;
&lt;h3 id="为什么不是关系数据库"&gt;为什么不是关系数据库？&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;目录服务&lt;/th&gt;
					&lt;th&gt;关系数据库&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;读/写比例&lt;/td&gt;
					&lt;td&gt;100:1 或更高&lt;/td&gt;
					&lt;td&gt;变化多样&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;数据模型&lt;/td&gt;
					&lt;td&gt;层次化（树状）&lt;/td&gt;
					&lt;td&gt;关系化（表）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;查询语言&lt;/td&gt;
					&lt;td&gt;LDAP Filter&lt;/td&gt;
					&lt;td&gt;SQL&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;性能优化&lt;/td&gt;
					&lt;td&gt;索引和缓存优先&lt;/td&gt;
					&lt;td&gt;事务和一致性&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;数据结构&lt;/td&gt;
					&lt;td&gt;灵活 Schema&lt;/td&gt;
					&lt;td&gt;固定 Schema&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;典型用途&lt;/td&gt;
					&lt;td&gt;身份查找、认证&lt;/td&gt;
					&lt;td&gt;业务数据处理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;扩展方式&lt;/td&gt;
					&lt;td&gt;只读副本&lt;/td&gt;
					&lt;td&gt;读写分离&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;目录服务是为&amp;quot;查找&amp;quot;而生的：员工查找、组查找、认证等操作要求极低的延迟和极高的读并发，这正是目录服务的设计目标。&lt;/p&gt;
&lt;h2 id="82-ldap-协议基础"&gt;8.2 LDAP 协议基础&lt;/h2&gt;
&lt;h3 id="ldap-数据模型"&gt;LDAP 数据模型&lt;/h3&gt;
&lt;p&gt;LDAP 数据以&lt;strong&gt;树状结构&lt;/strong&gt;（Directory Information Tree, DIT）组织：&lt;/p&gt;



&lt;div class="expressive-code"&gt;
 &lt;figure class="frame not-content"&gt;
 &lt;figcaption class="header"&gt;
 &lt;span class="title"&gt;&lt;/span&gt;
 &lt;/figcaption&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt; dc=example,dc=com
 │
 ┌─────────┼─────────┐
 │ │ │
ou=users ou=groups ou=services
 │ │
cn=张三 cn=engineers&lt;/code&gt;&lt;/pre&gt;
 &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;每个节点称为一个 &lt;strong&gt;Entry&lt;/strong&gt;（条目），具有：&lt;/p&gt;</description></item></channel></rss>