在 OpenID Connect(OIDC)中,Flow(流程)指的是客户端与身份提供商(IdP)之间进行身份验证和授权的不同方式。以下是 OpenID Connect 中常见的几种流程:


1. Authorization Code Flow(授权码流程)

  • 特点:最常用、最安全的流程,适用于有后端的 Web 应用。
  • 步骤:
    1. 客户端将用户重定向到 IdP 的授权端点。
    2. 用户在 IdP 登录并授权。
    3. IdP 返回一个授权码(Authorization Code)给客户端。
    4. 客户端使用授权码向 IdP 的令牌端点请求访问令牌(Access Token)和 ID 令牌(ID Token)。
  • 适用场景:Web 应用、移动应用(有后端支持)。

2. Implicit Flow(隐式流程)

  • 特点:直接在浏览器中返回令牌,适用于纯前端应用(无后端)。
  • 步骤:
    1. 客户端将用户重定向到 IdP 的授权端点。
    2. 用户在 IdP 登录并授权。
    3. IdP 通过 URL 片段(Fragment)直接返回访问令牌和 ID 令牌。
  • 适用场景:单页应用(SPA)等纯前端应用。
  • 注意:由于令牌直接暴露在浏览器中,安全性较低,已被 PKCE 增强的授权码流程取代。

3. Hybrid Flow(混合流程)

  • 特点:结合授权码流程和隐式流程的特点,部分信息通过前端返回,部分信息通过后端获取。
  • 步骤:
    1. 客户端将用户重定向到 IdP 的授权端点。
    2. 用户在 IdP 登录并授权。
    3. IdP 返回授权码,并通过 URL 片段返回 ID 令牌或访问令牌。
    4. 客户端使用授权码向 IdP 的令牌端点请求其他令牌。
  • 适用场景:需要同时支持前端和后端的复杂应用。

4. Authorization Code Flow with PKCE(PKCE 增强的授权码流程)

  • 特点:在授权码流程基础上增加了 PKCE(Proof Key for Code Exchange)机制,增强安全性。
  • 步骤:
    1. 客户端生成一个随机字符串(Code Verifier)并计算其哈希值(Code Challenge)。
    2. 客户端将用户重定向到 IdP 的授权端点,并附带 Code Challenge。
    3. 用户在 IdP 登录并授权。
    4. IdP 返回授权码。
    5. 客户端使用授权码和 Code Verifier 向 IdP 的令牌端点请求令牌。
  • 适用场景:移动应用、单页应用(SPA)等无后端支持的应用。

5. Resource Owner Password Credentials Flow(资源所有者密码凭证流程)

  • 特点:客户端直接收集用户的用户名和密码,并向 IdP 请求令牌。
  • 步骤:
    1. 客户端直接向 IdP 的令牌端点发送用户的用户名和密码。
    2. IdP 返回访问令牌和 ID 令牌。
  • 适用场景:受信任的客户端(如第一方应用)。
  • 注意:安全性较低,不推荐使用。

6. Client Credentials Flow(客户端凭证流程)

  • 特点:客户端使用自己的凭证(而非用户凭证)直接向 IdP 请求令牌。
  • 步骤:
    1. 客户端向 IdP 的令牌端点发送自己的客户端 ID 和密钥。
    2. IdP 返回访问令牌。
  • 适用场景:服务器到服务器的通信(无用户参与)。

总结

流程名称 适用场景 安全性 用户参与
Authorization Code Flow Web 应用、有后端的移动应用 高 是
Implicit Flow 单页应用(SPA) 低 是
Hybrid Flow 复杂应用 中 是
Authorization Code Flow with PKCE 移动应用、单页应用(SPA) 高 是
Resource Owner Password Flow 受信任的客户端 低 是
Client Credentials Flow 服务器到服务器通信 高 否

根据应用场景和安全需求选择合适的流程即可。

最后修改日期: 2025年1月6日

作者