Loading
识别您的用户并管理访问
目录
选择筛选器

          没有结果
          没有结果
          以下是一些搜索提示

          检查关键字的拼写。
          使用更普遍的搜索词。
          选择更少的筛选器,并扩大搜索范围。

          搜索所有 Salesforce 帮助
          面向 Web 应用程序集成的 OAuth 2.0 Web 服务器流

          面向 Web 应用程序集成的 OAuth 2.0 Web 服务器流

          要将外部 Web 应用程序与 Salesforce API 集成,请使用 OAuth 2.0 Web 服务器流,它实施OAuth 2.0 授权代码授权类型。通过此流,托管 Web 应用程序的服务器必须能够保护由客户端 ID 和客户端密码定义的外部客户端应用程序的身份。

          所需的 Edition

          适用于:Salesforce Classic(并非在所有组织中可用)和 Lightning Experience
          在所有版本中可用

          我们建议您使用带有适用于代码交换的证明密钥(PKCE,发音 pixy)的 Web 服务器流,以代替特殊场景的用户-客服人员流或用户名-密码流。使用 code_challengecode_verifier 参数,通过 Web 服务器流实施 PKCE。有关 PKCE 的更多信息,请参见互联网工程任务组 (IETF)。我们还建议您阻止所有外部客户端应用程序使用用户代理流或用户名密码流。有关步骤,请参见阻止授权流以提高安全性

          以下是实施 Web 服务器流的用例示例。您最近开发了一个允许安全访问客户订单状态的 Web 服务。订单状态数据安全地存储在您的 Salesforce CRM 平台中。要授权帮助台用户查看客户的订单状态,您需要开发订单状态应用程序,并将其配置为具有 Web 服务器流的外部客户端应用程序。

          • 帮助台用户单击订单状态 Web 应用程序。
          • 外部客户端应用程序向 Salesforce 授权端点发布授权代码请求。
          • 用户将被重定向到 Salesforce 登录页面。成功登录后,要求用户批准应用程序对订单状态数据的访问。
          • 用户批准订单状态应用程序访问数据后,Salesforce 会向订单状态应用程序发送带有授权代码的回拨。
          • 订单状态应用程序将授权代码传递给 Salesforce 标记端点,请求访问标记。
          • Salesforce 验证授权代码并以范围的形式发回包含相关权限的访问标记。
          • 订单状态应用程序向 Salesforce 发送请求,以访问订单状态数据。该请求包括具有相关范围的访问标记。
          • Salesforce 验证访问标记和相关范围。
          • 订单状态应用程序可以访问受保护的数据,客户的订单状态显示在应用程序中。
            备注
            备注 如果访问令牌无效,外部客户端应用程序可以使用刷新令牌来获取新的访问令牌。

          让我们仔细看看这个授权流的每个步骤。

          请求授权代码

          为了启动 OAuth 2.0 Web 服务器流,外部 Web 服务通过外部客户端应用程序,使用授权代码授权类型向 Salesforce 授权端点发布授权代码请求。通过授权代码,外部客户端应用程序可以证明它已被授权为站点的安全访问者,并且它有权请求访问令牌。

          授权代码是 HTTP 重定向的形式。

          https://MyDomainName.my.salesforce.com/services/oauth2/authorize?
          client_id=3MVG9IHf89I1t8hrvswazsWedXWY0i1qK20PSFaInvUgLFB6vrcb9bbWFTSIHpO8G2jxBLJA6uZGyPFC5Aejq&
          redirect_uri=https://www.mycustomerorderstatus.com/oauth2/callback&
          response_type=code

          将这些参数包含在授权代码请求中。

          参数 描述
          Request Header Salesforce OAuth 2.0 授权端点。外部客户端应用程序向该端点发送 OAuth 授权请求。
          client_id 外部客户端应用程序的使用者密钥。要访问使用者密钥,从应用程序管理器中,查找外部客户端应用程序,并从下拉列表中选择查看。然后,单击管理客户详细信息。在查看使用者密钥之前,有时会提示您验证您的身份。
          redirect_uri 成功身份验证后用户重定向的 URL。重定向 URI 必须匹配外部客户端应用程序的回调 URL 字段中的一个值。否则,批准失败。您可以在外部客户端应用程序的 OAuth 设置页面上找到重定向 URI。该值必须是编码 URL。
          response_type 外部客户端应用程序请求的 OAuth 2.0 授权类型。此流的值必须是 code,以表示外部客户端应用程序正在请求授权代码。

          您也可以在授权代码请求中包含这些参数。

          参数 描述
          scope

          定义外部客户端应用程序可以访问的受保护资源类型的权限。在构建外部客户端应用程序时,您可为其分配范围,并在授权流期间包含在 OAuth 令牌中。

          如果您不包含此参数,则会请求分配给外部客户端应用程序的所有范围。此参数中传递的范围必须是已注册范围的子集。有关有效参数,请参阅OAuth 令牌和范围

          sso_provider 为 My Domain 登录 URL 或 Experience Cloud 站点 URL 配置的单点登录 (SSO) 身份提供商的开发人员姓名。您可以使用此参数来创建一种 SSO 体验,感觉您的应用程序与 SSO 提供商集成在一起。例如,您可以使用此参数在无头身份实施中提供 SSO。有关更多信息,请参见在应用程序中创建本地单点登录体验
          state 外部 Web 服务请求发送到回调 URL 的任何状态。该值必须是编码 URL。
          immediate

          布尔值,用于确定是否提示用户登录和批准。默认值是 false。如果您将此参数设置为 true,将出现以下情况之一。

          • 如果用户已登录并且先前已批准了客户端的访问权限,Salesforce 会跳过批准步骤。
          • 如果用户未登录或此前未批准客户端访问,Salesforce 会立即终止,并显示immediate_unsuccessful错误代码。

          immediate选项对 Experience Cloud 站点不可用。

          code_challenge

          指定令牌请求中code_verifier值的 SHA256 散列值。设置此参数有助于防止授权代码拦截攻击。该值必须是 https://tools.ietf.org/html/rfc4648#section-5 中定义的 base64url 编码。

          如果在令牌请求中指定了code_verifier,则需要此参数。

          • 如果授权请求中提供了code_challenge值,令牌请求中提供了code_verifier值,Salesforce 会将code_challengecode_verifier进行比较。如果code_challenge无效或不匹配,登录将失败,并显示invalid_request错误代码。
          • 如果在授权请求中提供了code_challenge值,但在令牌请求中未提供code_verifier值,则登录失败,并显示invalid_grant错误代码。
          display

          更改登录和授权页面的显示类型。Salesforce 支持这些值。

          • page — 整页授权屏幕(默认)。
          • popup— 专为现代 Web 浏览器弹出窗口优化的紧凑对话框。
          • touch — 专为 Android 和 iPhone 等现代移动设备设计的移动优化对话框。
          • mobile — 专为功能较低的设备设计的移动优化对话框,例如 BlackBerry 操作系统 5。
          login_hint

          提供有效的用户名值,以使用用户名预填充登录页面,例如 login_hint=username@company.com。如果用户已在浏览器中拥有活动会话,login_hint 参数不会执行任何操作,活动用户会话将继续。

          要为 Experience Cloud 站点传递 login_hint 参数,还要传递 prompt=login 参数。凭借正确登录提示,这些参数共同将用户重定向到登录页面。

          nonce openid范围一起使用,以请求用户 ID 令牌。响应中将返回用户 ID 标记。此参数是可选的,但它有助于检测重放攻击。
          prompt

          指定验证服务器如何提示用户再验证和再批准。Salesforce 支持这些值。

          • login— 授权服务器必须提示用户重新验证,强制用户重新登录。
          • consent— 授权服务器在向客户端返回信息之前必须提示用户重新批准。
          • select_account— 如果显示,请采取以下操作之一。
            • 如果 0 或 1 提示可用且用户登录,则会显示批准页面,而不会提示进行登录。
            • 如果 0 或 1 提示可用且用户未登录,则提示进行登录。
            • 如果多个提示可用,则显示客户选择程序。

          您可以传递loginconsent值,用空格隔开,要求用户登录并重新验证。例如:?prompt=login%20consent

          Uvid-Hint标题

          或者,要将此流连接到无头来宾流,您可以包含带有基于 JWT 的访问令牌的Uvid-Hint标题,该令牌包含 UVID 值,UVID 值是应用程序生成和管理的版本 4 通用唯一标识符 (UUID)。要获取带有 UVID 的访问令牌,您必须使外部客户端应用程序能够发布基于 JWT 的访问令牌,并在您的应用程序上实施无头来宾流。

          如果您在应用程序中实施来宾用户流,您可以选择使用此标题来传入基于 JSON Web 令牌 (JWT) 的访问令牌,其中包含一个与来宾用户身份相关联的惟一访问者 ID (UVID)。通过将 UVID 传递给命名用户流,您可以将来自来宾用户会话的上下文信息(例如用户的 Cookie 首选项)传递给命名用户会话。

          uvid_hint正文参数

          普通UVID值,即应用程序生成和管理的版本 4 UUID。要获取UVID,您必须使外部客户端应用程序能够发布基于 JWT 的访问令牌,并在应用程序上实施无头来宾流。您可以选择使用该参数传入与来宾用户身份相关联的 UVID 值,将上下文信息从来宾用户会话传入命名用户会话。

          您还可以通过 UVID-Hint 标题在基于 JWT 的令牌中使用 UVID 进行传输,而不是在请求正文中传输 UVID。

          用户验证和授权访问

          在 Salesforce 向外部客户端应用程序提供授权代码之前,身份验证用户需要登录到 Salesforce。

          Salesforce 组织的登录页面

          成功登录后,Salesforce 会将用户重定向到批准页面,以授予对应用程序的访问权限。

          授予对连接的应用程序的访问权限的批准页面

          如果用户先前批准了访问,他们就不必再次批准访问。

          Salesforce 授予授权代码

          用户批准访问外部客户端应用程序后,Salesforce 会将用户重定向到回调 URL,用户可在其中使用授权代码查看回调。

          https://www.mycustomerorderstatus.com/oauth2/callback?
          code=aPrx4sgoM2Nd1zWeFVlOWveD0HhYmiDiLmlLnXEBgX01tpVOQMWVSUuafFPHu3kCSjzk4CUTZg==
          • 回调的第一部分是外部客户端应用程序的回调 URL:https://www.mycustomerorderstatus.com/oauth2/callback.
          • 第二部分是外部客户端应用程序用于获取访问令牌的授权代码: code=aPrx4sgoM2Nd1zWeFVlOWveD0HhYmiDiLmlLnXEBgX01tpVOQMWVSUuafFPHu3kCSjzk4CUTZg==。授权代码会在 15 分钟后过期。

          如果原始查询字符串中包含 state 参数,则指定的状态会传递到批准步骤。

          请求访问标记

          要请求访问令牌,外部客户端应用程序会将授权代码作为 HTTP POST 传输到 Salesforce 令牌端点。

          POST /services/oauth2/token HTTP/1.1
          Host: mycompany.my.salesforce.com
          Content-length: 307
          Content-type: application/x-www-form-urlencoded
          grant_type=authorization_code&
          code=aPrxhgZ2MIpkSy0aOdn07LjKFvsFOis6RGcWXz7p8JQCjcqfed5NQLe7sxWwMY_JQFuLwHRaRA==&
          client_id=3MVG9IHf89I1t8hrvswazsWedXWY0iqK20PSFaInvUgLFB6vrcb9bbWFTSIHpO8G2jxBLJA6uZGyPFC5Aejq&
          client_secret=*******************&
          redirect_uri=https://www.mycustomerorderstatus.com/oauth2/callback
          

          示例中的 POST 包含以下参数。

          重要
          重要 在开发 OAuth 集成时,请始终在 POST 请求的正文或请求标题中传递敏感信息。不要在 URL 查询字符串中使用 GET 参数来传递敏感信息。敏感信息包括但不限于用户名、密码、OAuth 令牌、客户端密码和任何个人身份信息。有关安全最佳实践的更多信息,请查看安全编码指南中的存储敏感数据
          参数 描述
          Request Header

          请求页眉可以包含以下参数。

          • Salesforce OAuth 2.0 端点。外部客户端应用程序向该端点发送 OAuth 令牌请求。
          • 托管服务的 URL。
          • 请求内容的长度。
          • 返回响应的请求格式。支持这些格式。
            • Accept: application/json
            • Accept: application/xml
            • Accept: application/x-www-form-urlencoded

          请求页眉还支持以下参数。

          • 接受*/*通配符并返回 JSON。
          • 从左向右检查的值列表。例如:application/xml,application/json,application/html,*/* 返回 XML。

          format 参数优先于访问请求标题。

          grant_type 外部客户端应用程序可以提供的验证类型,以证明它是安全的访问者。对于 Web 服务器流,值必须是 authorization_code
          code 从授权服务器接收的临时授权代码。外部客户端应用程序使用此代码交换访问令牌。这种 OAuth 2.0 流是将访问标记传递回应用程序的安全方式。
          client_id 外部客户端应用程序的使用者密钥。要访问使用者密钥,从应用程序管理器中,查找外部客户端应用程序,并从下拉列表中选择查看。然后,单击管理客户详细信息。在查看消费者密钥之前,有时会提示您验证您的身份。
          client_secret

          外部客户端应用程序的使用者密码。要访问使用者密码,从应用程序管理器中,查找外部客户端应用程序,并从下拉列表中选择查看。然后,单击管理客户详细信息。在查看使用者密码之前,有时会提示您验证您的身份。

          此参数是必填项,除非外部客户端应用程序未启用需要 Web 服务器流的密码。如果不需要client_secret,并且外部客户端应用程序在授权请求中发送它,Salesforce 仍然会尝试验证它。

          redirect_uri 成功身份验证后用户重定向的 URL。重定向 URI 必须匹配外部客户端应用程序的回调 URL 字段中的一个值。否则,批准失败。您可以在外部客户端应用程序的 OAuth 设置页面或外部客户端应用程序的定义中找到重定向 URI。该值必须是编码 URL。

          您也可以包含这些参数。

          参数 描述
          client_assertion 您可以提供client_assertionclient_assertion_type,而不是传递client_secret。如果未提供 client_secret 参数,Salesforce 会检查client_assertionclient_assertion_type。请参阅使用client_assertion而不是client_secret
          client_assertion_type

          使用 client_assertion 参数时提供此值。

          client_assertion_type 的值必须是 urn:ietf:params:oauth:client-assertion-type:jwt-bearer

          code_verifier

          仅当授权请求中指定了 code_challenge 参数时才需要。指定 128 字节的高熵随机数据,使猜测code值变得困难。设置此参数有助于防止授权代码拦截攻击。该值必须是 https://tools.ietf.org/html/rfc4648#section-5 中定义的 base64url 编码。

          • 如果标记请求中已提供 code_verifier 值且授权请求中已提供 code_challenge 值,则 Salesforce 会对比 code_verifiercode_challenge。如果 code_verifier 无效或不匹配,登录将失败,并显示invalid_grant错误代码。
          • 如果在令牌请求中提供了 code_verifier 值,但在授权请求中未提供 code_challenge 值,则登录失败,并显示invalid_grant错误代码。
          format

          如果没有包含在请求的标题中,您可以指定预期的返回格式。format 参数优先于请求的标题。支持这些格式。

          • urlencoded
          • json(默认)
          • xml

          使用 client_assertion 而不是 client_secret

          如果您提供client_assertion而不是client_secretclient_assertion 的值必须包含这些参数。

          • iss— 来自外部客户端应用程序定义的client_id
          • sub— 来自外部客户端应用程序定义的client_id
          • aud — 令牌 servlet URL:https://hostname/services/oauth2/token
          • exp— 声明在 5 分钟内的到期时间,用 UTC 测量的从 1970-01-01T0:0:0Z 开始的秒数表示。

          client_assertion还必须使用与 OAuth 使用者上传的证书相关联的私钥进行签名。仅支持 RS256 算法。有关 private_key_jwt 客户端身份验证方法,请参阅 OpenID Connect 规范

          HTTP 基础身份验证方案

          Salesforce 支持 HTTPS 基础身份验证方案,而不是在 POST 的正文中将客户端凭据作为参数发送。此方案的格式需要在帖子的授权标题中进行如下client_idclient_secret

          Authorization: Basic64Encode(client_id:secret)

          client_idclient_secret 使用冒号 (:) 分隔。有关更多信息,请查看 OAuth 2.0 授权框架文档。

          此示例显示使用 HTTPS 基础身份验证方案的访问令牌 POST 请求,而不是在 POST 请求正文中发送的客户端凭据。

          POST /services/oauth2/token HTTP/1.1
          Host: mycompany.my.salesforce.com
          Authorization: Basic client_id=3MVG9IHf89I1t8hrvswazsWedXWY0iqK20PSFaInvUgLFB6vrcb9bbWFTSIHpO8G2jxBLJA6uZGyPFC5Aejq&
          client_secret=*******************&
          
          grant_type=authorization_code&code=aPrxsmIEeqM9PiQroGEWx1UiMQd95_5JUZ
          VEhsOFhS8EVvbfYBBJli2W5fn3zbo.8hojaNW_1g%3D%3D&
          redirect_uri=https%3A%2F%2Fwww.mysite.com%2Fcode_callback.jsp
          备注
          备注 如果client_idclient_secret在 POST 的正文中发送,授权标题将被忽略。

          Salesforce 授予访问标记

          Salesforce 验证外部客户端应用程序的凭据后,将返回带有访问令牌的响应。在本示例中,响应为 JSON 格式。

          {
          "access_token": "00DB0000000TfcR!AQQAQFhoK8vTMg_rKA.esrJ2bCs.OOIjJgl.9Cx6O7KqjZmHMLOyVb.U61BU9tm4xRusf7d3fD1P9oefzqS6i9sJMPWj48IK",
          "signature": "d/SxeYBxH0GSVko0HMgcUxuZy0PA2cDDz1u7g7JtDHw=",
          "scope": "web openid",
          "id_token": "eyJraWQiOiIyMjAiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdF9oYXNoIjoiSVBRNkJOTjlvUnUyazdaYnYwbkZrUSIsInN1YiI6Imh0dHBzOi8vbG9...",
          "instance_url": "https://mycompany.my.salesforce.com",
          "id": "https://login.salesforce.com/id/00DB0000000TfcRMAS/005B0000005Bk90IAC",
          "token_type": "Bearer",
          "issued_at": "1558553873237"
          }
          

          响应包含这些参数。

          参数 描述
          access_token 外部客户端应用程序用于代表客户端应用程序请求访问受保护资源的 OAuth 令牌。访问标记可以附带范围形式的附加权限。
          signature 使用 client_secret 签名的 Base64 编码 HMAC-SHA256 签名。签名可以包括连接 ID 和issued_at value,您可以使用它们来验证身份 URL 在服务器发送后没有更改。
          scope

          与访问标记关联的范围。

          范围进一步定义了客户端可以访问的受保护资源的类型。在构建外部客户端应用程序时,您可为其分配范围,并在授权流期间包含在 OAuth 令牌中。

          有关有效参数,请参阅OAuth 令牌和范围

          id_token

          一种签名数据结构,包含经过身份验证的用户属性,包括用户的唯一标识符和指示标记发放时间的时间戳。此外,也会识别请求的客户端应用程序。请参见 OpenID Connect 规格

          如果范围参数包含 openid,则返回此参数。

          instance_url 指示用户的组织实例的 URL。例如:https://yourInstance.salesforce.com/.
          id 可用于标识用户以及查询有关用户的更多信息的身份 URL。请参阅身份 URL
          token_type Bearer 令牌类型,用于包含访问令牌的所有响应。
          issued_at 签名创建时间的时间戳,单位毫秒。

          响应也可以包含这些参数。

          参数 描述
          refresh_token

          从 Web 服务器、用户代理或混合应用程序标记流中获取的标记。该值是密钥。采取适当措施保护它。

          仅当您的外部客户端应用程序设置了refresh_token范围时,才会返回此参数。

          sfdc_site_url 如果用户是 Experience Cloud 站点的成员,则提供站点 URL。
          sfdc_site_id 如果用户是 Experience Cloud 站点的成员,则提供用户的站点 ID。
          state 客户端请求的状态。仅当原始查询字符串中包含 state 参数时,才会包含此值。

          另请参阅:

           
          正在加载
          Salesforce Help | Article