代码交换验证密钥 (PKCE) 扩展
要提高 OAuth 和身份验证提供商实施的安全性,请使用 OAuth 2.0 代码交换验证密钥 (PKCE) 扩展。您可以在组织范围级别要求使用 PKCE,要求特定的已连接应用程序使用它,并为支持的身份验证提供商自动启用它。
所需的 Edition
| 在所有版本中可用 |
在 OAuth 授权代码流及其派生过程中,PKCE 扩展有助于确保启动该流的客户端与完成该流的客户端是同一客户端。在这些流期间,应用程序会从 Salesforce 请求授权代码,然后交换访问令牌。传统上,应用程序可以通过包含其连接的应用程序使用者密码来保护令牌请求。因为使用者密码是只有应用程序和 Salesforce 知道的信息,所以它用作访问 Salesforce 令牌端点的密码。即使攻击者以某种方式获得了授权代码,他们也不能用它来获得访问令牌,除非他们拥有使用者密码。
但移动应用程序和单页应用程序等公共客户端无法对使用者密码保密。与传统客户端-服务器架构的私有客户端应用程序不同,公共客户端没有存储使用者密码的私有后端。如果公共客户端在令牌请求中发送使用者密码,就有泄露密码的风险。因此,我们从不建议在公共客户端的令牌请求中包含使用者密码。
由于没有使用者密码,该应用程序容易受到攻击者的攻击,攻击者拦截授权代码并试图将其交换为访问令牌。PKCE 通过一组只有您的应用程序和 Salesforce 才能理解的散列参数来帮助填补使用者密码缺口。在实施 PKCE 的流期间,应用程序会创建随机字符串,称为 code_verifier 参数。然后,它使用 SHA-256 算法对该值进行散列运算。该散列值是 code_challenge 参数。SHA-256 散列法的一个关键概念是它只能以一种方式工作。您可以通过运行 SHA-256 算法从code_verifier获取code_challenge。但您不能反向运行它来从code_challenge获取code_verifier。
单向函数的概念在 PKCE 工作的原因中起着重要作用。当应用程序发送其对授权代码的初始请求时,它包括散列code_challenge参数。然后,当它请求访问令牌时,它包括 code_verifier 参数。现在,Salesforce 有两个参数,它可以对code_verifier值运行 SHA-256 算法,以将其与code_challenge进行比较。如果值匹配,Salesforce 可以验证同一应用程序是否发送了授权请求和令牌请求。即使攻击者拥有授权代码,他们也无法将其交换为访问令牌,因为他们没有只有您的应用程序和 Salesforce 知道的 PKCE 参数。
我们建议您始终为公共客户端实施 PKCE。对于私有客户端,我们建议您实施 PKCE,并在令牌请求中包含使用者密码。
当您使用 Salesforce 构建授权代码流的变体时,您可以选择通过包含code_challenge和code_verifier参数来实施 PKCE。这些流支持 PKCE。
- Web 服务器流
- 混合 Web 服务器流
- 授权代码和凭据流的所有变体,包括无头注册、无头无密码登录和无头来宾流。请参阅无头身份流。
为了确保 PKCE 得以实施,我们建议您采取以下安全措施。
- 从 OAuth 和 OpenID Connect 设置页面,在组织范围内要求使用 PKCE。启用此设置后,将自动阻止所有不使用 PKCE 的授权代码流变体。
- 要求特定的连接的应用程序使用 PKCE。作为连接的应用程序开发人员,如果启用此设置,则必须在使用此应用程序构建授权流时实施 PKCE。
- 将 PKCE 用于身份验证提供商。对于支持的身份验证提供商,您可以通过选择单个设置来自动使用 PKCE。这些身份验证提供商支持 PKCE。
- 生成 PKCE 参数
使用 PKCE 生成器端点快速生成可在授权代码流变体中实施的code_challenge和code_verifier参数。
生成 PKCE 参数
使用 PKCE 生成器端点快速生成可在授权代码流变体中实施的code_challenge和code_verifier参数。
- 为 OAuth 端点启用跨来源资源共享 (CORS),这将自动为
/services/oauth2/pkce/generator端点启用 CORS。 - 要生成
code_challenge和code_verifier参数,请向 My Domain 登录 URL 或 Experience Cloud 站点 URL 上的/services/oauth2/pkce/generator端点发送 HTTP GET 请求。不要在此请求中包含任何标题或正文参数。以下是使用 My Domain 登录 URL 的请求示例。GET /services/oauth2/pkce/generator? HTTP 1.1 Host: MyDomainName.my.site.salesforce.com以下是使用 Experience Cloud 站点 URL 的示例请求。GET /services/oauth2/pkce/generator? HTTP 1.1 Host: MyDomainName.my.site.comSalesforce 使用这些 PKCE 参数进行响应。
此处是示例响应。参数 描述 code_challenge_method用于计算 code_verifiercode_challenge的方法。Salesforce 使用S256方法,该方法使用 SHA256 算法计算来自code_verifier的code_challenge。有关更多信息,请查看 RFC 7636 中的第 4.2 节:OAuth 公共客户端代码交换验证密钥 中的第 4.2 节。code_challenge指定令牌请求中
code_verifier值的 SHA256 散列值。该值是按照 RFC 4648 第 5 节中的定义编码的 Base-64 URL:Base16、Base32 和 Base64 数据编码。配置授权流时,将此值包含在授权请求中。
code_verifier指定 128 字节的高熵随机数据,使猜测代码值变得困难。设置此参数有助于防止授权代码拦截攻击。该值是 RFC 4648 第 5 节中定义的 Base-64 URL:Base16、Base32 和 Base64 数据编码。
配置授权流时,将此值包含在令牌请求中。
{ “code_challenge_method”:“S256” “code_challenge”:“JB7nT*************” “code_verifier”:“GkLvw**************” }
当您配置 Web 服务器流、混合 Web 服务器流以及授权代码和凭据流的变体时,请按照指示在请求中包含 code_challenge 和 code_verifier 参数。

