在 OpenID Connect(OIDC)中,Flow(流程)指的是客户端与身份提供商(IdP)之间进行身份验证和授权的不同方式。以下是 OpenID Connect 中常见的几种流程:
1. Authorization Code Flow(授权码流程)
- 特点:最常用、最安全的流程,适用于有后端的 Web 应用。
- 步骤:
- 客户端将用户重定向到 IdP 的授权端点。
- 用户在 IdP 登录并授权。
- IdP 返回一个授权码(Authorization Code)给客户端。
- 客户端使用授权码向 IdP 的令牌端点请求访问令牌(Access Token)和 ID 令牌(ID Token)。
- 适用场景:Web 应用、移动应用(有后端支持)。
2. Implicit Flow(隐式流程)
- 特点:直接在浏览器中返回令牌,适用于纯前端应用(无后端)。
- 步骤:
- 客户端将用户重定向到 IdP 的授权端点。
- 用户在 IdP 登录并授权。
- IdP 通过 URL 片段(Fragment)直接返回访问令牌和 ID 令牌。
- 适用场景:单页应用(SPA)等纯前端应用。
- 注意:由于令牌直接暴露在浏览器中,安全性较低,已被 PKCE 增强的授权码流程取代。
3. Hybrid Flow(混合流程)
- 特点:结合授权码流程和隐式流程的特点,部分信息通过前端返回,部分信息通过后端获取。
- 步骤:
- 客户端将用户重定向到 IdP 的授权端点。
- 用户在 IdP 登录并授权。
- IdP 返回授权码,并通过 URL 片段返回 ID 令牌或访问令牌。
- 客户端使用授权码向 IdP 的令牌端点请求其他令牌。
- 适用场景:需要同时支持前端和后端的复杂应用。
4. Authorization Code Flow with PKCE(PKCE 增强的授权码流程)
- 特点:在授权码流程基础上增加了 PKCE(Proof Key for Code Exchange)机制,增强安全性。
- 步骤:
- 客户端生成一个随机字符串(Code Verifier)并计算其哈希值(Code Challenge)。
- 客户端将用户重定向到 IdP 的授权端点,并附带 Code Challenge。
- 用户在 IdP 登录并授权。
- IdP 返回授权码。
- 客户端使用授权码和 Code Verifier 向 IdP 的令牌端点请求令牌。
- 适用场景:移动应用、单页应用(SPA)等无后端支持的应用。
5. Resource Owner Password Credentials Flow(资源所有者密码凭证流程)
- 特点:客户端直接收集用户的用户名和密码,并向 IdP 请求令牌。
- 步骤:
- 客户端直接向 IdP 的令牌端点发送用户的用户名和密码。
- IdP 返回访问令牌和 ID 令牌。
- 适用场景:受信任的客户端(如第一方应用)。
- 注意:安全性较低,不推荐使用。
6. Client Credentials Flow(客户端凭证流程)
- 特点:客户端使用自己的凭证(而非用户凭证)直接向 IdP 请求令牌。
- 步骤:
- 客户端向 IdP 的令牌端点发送自己的客户端 ID 和密钥。
- IdP 返回访问令牌。
- 适用场景:服务器到服务器的通信(无用户参与)。
总结
流程名称 | 适用场景 | 安全性 | 用户参与 |
---|---|---|---|
Authorization Code Flow | Web 应用、有后端的移动应用 | 高 | 是 |
Implicit Flow | 单页应用(SPA) | 低 | 是 |
Hybrid Flow | 复杂应用 | 中 | 是 |
Authorization Code Flow with PKCE | 移动应用、单页应用(SPA) | 高 | 是 |
Resource Owner Password Flow | 受信任的客户端 | 低 | 是 |
Client Credentials Flow | 服务器到服务器通信 | 高 | 否 |
根据应用场景和安全需求选择合适的流程即可。