在 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日

作者