Logo Logo
GitHub Designed by Logto

什么是客户端凭证流 (Client credentials flow)?

客户端凭证流 (Client credentials flow) 是一种 OAuth 2.0 授权 (Grant) 类型,允许机密客户端获取 访问令牌 (access tokens) 以访问受保护资源。通常,此流用于 机器对机器 (Machine-to-machine) 通信,其中客户端是服务器或服务。

[!Note] 客户端凭证流不适合终端用户授权。对于终端用户授权,你应该使用 认证请求 (Authentication request) 授权请求 (Authorization request)

客户端凭证流 (Client credentials flow) 如何工作?

客户端凭证流是一个简单的两步过程:

  1. 令牌请求 (Token request): 客户端发送带有其客户端凭证(客户端 ID 和客户端密钥)和请求的 scope (范围) Token 请求 (Token request)
  2. 令牌响应 (Token response): 授权服务器 (Authorization server) 验证客户端凭证,并在客户端被授权时颁发访问令牌 (access token)。

以下是客户端凭证流的简化序列图:

以下是一个客户端凭证流令牌请求的非规范示例:

POST /token HTTP/1.1
Host: your-authorization-server.com
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials
  &client_id=YOUR_CLIENT_ID
  &client_secret=YOUR_CLIENT_SECRET
  &scope=read write

授权服务器将验证客户端凭证,并在客户端被授权时颁发访问令牌。一旦客户端收到访问令牌,它可以使用该令牌访问受保护资源(例如 API)代表其本身。以下是客户端如何使用访问令牌访问 API 的示例:

请注意, 资源服务器 (Resource server) 应该验证访问令牌并实施 访问控制 (Access control) 策略,以确保客户端有必要的权限访问资源。

客户端凭证流令牌请求中的关键参数

与其他 OAuth 2.0 流不同,客户端凭证流有一个简单的 Token 请求 (Token request) ,其关键参数如下:

  • grant_type: 授权类型应设置为 client_credentials 以指示客户端凭证流。
  • client_id: 授权服务器颁发的客户端标识符。
  • client_secret: 授权服务器颁发的客户端密钥。
  • scope: 访问令牌请求的 scope (范围) (权限)。
  • resource: 可选参数,指定请求资源的 资源指示器 (Resource indicator) 。授权服务器需要支持 RFC 8707 以使用此参数。

安全考虑

机密客户端

客户端凭证流适用于可以安全存储客户端密钥的 机密客户端 (机密客户端)。如果客户端是公共客户端(例如单页应用),则不应使用客户端凭证流,因为客户端密钥可能会泄露。

令牌过期

尽管在客户端凭证流中获取的访问令牌可以有较长的过期时间,但建议使用短期访问令牌(例如,1 小时),以减少令牌泄露时未经授权访问的风险。

客户端密钥轮换

为了增强安全性,建议定期轮换客户端密钥。授权服务器应支持客户端密钥轮换,而不影响客户端获取访问令牌的能力。例如,授权服务器应支持多个客户端密钥,以便在轮换过程中保持向后兼容。

另请参阅