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

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

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

          搜索所有 Salesforce 帮助
          无头身份 API:公共客户端的无头无密码登录流

          无头身份 API:公共客户端的无头无密码登录流

          让客户和合作伙伴用户通过无头无密码登录流轻松登录到平台外应用程序。在该流中,用户通过输入他们的电子邮件地址或电话号码登录,并用一次性密码 (OTP) 验证他们的身份。您可在应用程序中控制前端体验。在后端,应用程序通过 Experience Cloud 站点调用无头无密码登录 API 让用户登录。这些步骤向您展示了该流如何与公共客户端(例如单页应用程序)一起工作,它不能保持信息的私密性。

          所需的 Edition

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

          该流是授权代码和凭据流的变体,它扩展了 OAuth 2.0 授权代码授权类型。像其他变体一样,它包括对 Salesforce 端点的调用,以获取授权代码并将其交换为访问令牌。在该变体中,应用程序将请求标识符和 OTP 交换为授权代码,而不是像在更传统的无头登录流中那样交换用户名和密码。然后,该代码被交换为访问令牌。

          在设置此流前,请完成这些步骤。

          以下是无头无密码登录流的示例用例。您为一家在 Salesforce 中管理客户信息的旅游公司工作,并且您已经在平台外移动应用程序中实施了无头登录和注册。在注册过程中,您会收集用户的电子邮件地址。为了使登录过程更容易,您配置了使用电子邮件作为验证方法的无头无密码登录。现在,当用户访问您的应用程序时,他们可以输入他们的电子邮件地址并接收 OTP。他们在应用程序中输入 OTP 后,Salesforce 会验证他们的身份,用户登录并可以访问受保护的 Salesforce 数据,例如他们的旅行历史记录。

          或者,为了用户体验更加灵活,您可以使用无头用户发现 Apex 处理器检索用户。开发处理程序,以根据电子邮件地址、电话号码或可链接到 Salesforce 用户的任何其他标识符查找用户。例如,提示用户使用出行确认号登录。在用户输入确认编号时,Salesforce 会查找关联的用户名,并向用户的电子邮件地址发送 OTP。有关如何开发 Apex 处理程序的更多信息,请查看 Apex 参考指南中的 Auth.HeadlessUserDiscoveryHandler

          对于无法保证应用程序使用者密码安全的公共客户端,例如移动应用程序或单页应用程序,在构建流时有一些额外的安全考虑。当您配置 Experience Cloud 登录和注册设置时,您必须启用至少一个这些安全选项:需要身份验证才能访问此 API,或需要 reCAPTCHA 才能访问此 API。对于公共客户端,我们建议您始终启用需要 reCAPTCHA 才能访问此 API,这要求您的应用程序在初始请求中包含 reCAPTCHA 令牌,以便无头无密码登录 API。我们从不建议您为公共客户端启用需要身份验证才可以访问此 API。此设置要求您的请求包括颁发给内部集成用户的访问令牌,并且公共客户端不能保留访问令牌密码。

          为了进一步保护流,我们始终建议实施 OAuth 2.0 代码交换验证密钥 (PKCE) 扩展。传统上,专用客户端应用程序使用使用者密码作为安全访问 Salesforce 的密码。但是公共客户不能保证使用者密码的安全,因为他们没有专用后台。PKCE 通过只有您的应用程序和 Salesforce 可以验证的参数帮助您弥合该缺口。这些参数有助于确保启动流的客户端与完成流的客户端是同一客户端。

          要扩展在流期间发送给最终用户的一次性密码 (OTP) 电子邮件的电子邮件模板选项,请选择电子邮件模板允许列表并使用自定义模板创建允许列表。请参阅为无头流使用多个电子邮件模板。

          下面是公共客户端的无头无密码登录流的概述。

          显示公共客户端的无头无密码登录的序列图。
          • 最终用户打开您的应用程序,会看到应用程序内本地显示的登录表单。他们按照登录表单的要求输入自己的电子邮件地址或电话号码 (1)。
          • 如果您未使用无头用户发现处理器,应用程序会找到与用户电话号码或电子邮件地址关联的用户名 (2)。
          • 应用程序向无头无密码登录 API(Experience Cloud 站点上的services/auth/headless/init/passwordless/login端点)提交无头 POST 请求 (3)。
          • (可选)如果您正在使用无头用户发现处理器,处理器会找到与 login_hint 参数中传递的数据相关联的用户名,并验证与用户相关联的电子邮件地址或电话号码是否经过验证。
          • Salesforce 将成功消息返回到应用程序。它还会发送请求标识符,稍后在流中使用 (4a)。
          • 根据验证方法,Salesforce 会向用户发送电子邮件或包含 OTP 的短信 (4b)。
          • 应用程序将本地显示 OTP 验证表单(5)。
          • 用户收到 OTP,并将其输入到应用程序 (6)
          • 如果您使用 PKCE(我们强烈建议),应用程序会生成 PKCE 参数 (7)。
          • 应用程序通过向 Salesforce 授权端点 (services/oauth2/authorize) 发送 POST 或 GET 请求来启动授权代码和凭据流。该请求包括请求 ID 和 OTP 以及其他参数,以识别应用并指定请求的类型 (8)。
          • Salesforce 验证请求 ID 和 OTP,并将 302 重定向返回到包含授权代码的预配置 URL。如果在浏览器中执行流,则 302 重定向将在浏览器中处理,响应将被无头传输到回调端点 (9)。
          • 回调端点会提取授权代码,并将其返回到应用程序 (10)。
          • 应用程序接收授权代码,并通过向 Salesforce 令牌端点 (services/oauth2/token) 发送 POST 请求中的代码和其他参数来启动代码交换 (11)。
          • Salesforce 验证令牌请求,并返回访问令牌和状态 (12)。
          • 应用程序处理访问权限令牌响应并创建用户会话 (13)。
          • 用户现在已登录,并在您的应用程序中执行需要访问 Salesforce 数据的操作,例如单击按钮查看他们的订单历史记录 (14)。
          • 应用程序会向受保护的 Salesforce API 发送验证请求 (15)。
          • 用户现在可以在您的平台外应用程序中访问他们的 Salesforce 数据 (16)。

          如步骤 10 中所述,该流需要一个回调端点,该端点可以处理 302 重定向并将授权代码和其他参数返回到您的应用程序。对于在浏览器中完成代码交换的实施,您可以使用 Salesforce /services/oauth2/echo 端点。此端点自动解析 302 重定向,提取参数并以 JSON 格式返回到应用程序。我们在这个流的代码示例中使用了 Echo 端点。

          最终用户为登录输入电子邮件地址或电话号码

          该流将在最终用户访问您的应用程序时启动。您的应用程序会本地显示登录表单,只要求用户的电子邮件地址或电话号码。或者,如果您正在使用根据订单号等不同标识符查找用户的无头用户发现处理器,应用程序可以显示登录表单,提示用户输入标识符。最终用户输入信息并单击按钮登录。

          应用程序查找用户名

          如果您未使用无头用户发现处理器,应用程序会查找用户的电子邮件地址或电话号码,并查找关联的用户名。

          如果您正在使用无头用户发现处理器,应用程序会跳过此步骤。处理程序会在您提交初始请求后查找用户。

          应用程序向无头无密码登录 API 发送请求

          从浏览器中,应用程序会将无头 POST 请求发送到 Experience Cloud 站点上的无头无密码登录端点 (services/auth/headless/init/passwordless/login)。

          在请求正文中包含这些参数。

          初始化无密码登录:请求正文
          参数 必需? 描述
          verificationmethod 是。 您希望用于验证用户身份的方法。您可以使用emailsms
          username 如果您未使用无头用户发现处理器,则需要此项。 与用户提交的电子邮件地址或电话号码相关联的用户名。
          recaptcha

          如果这些条件对您适用,将是必填项。

          • 您在 Experience Cloud 登录和注册页面上启用了需要 reCAPTCHA 才能访问此 API。我们强烈建议您始终为公共客户端启用此设置。
          • 您正在使用 reCAPTCHA v2 或 v3。
          当用户完成 reCAPTCHA 质询时,由 Google reCAPTCHA API 颁发的加密令牌。
          recaptchaevent

          如果这些条件适用于您,则需要:

          • 您在 Experience Cloud 登录和注册设置中启用了需要 reCAPTCHA 才能访问此 API
          • 您正在使用 reCAPTCHA Enterprise。

          包含这些子参数的 JSON 对象。

          • token— 当用户完成 reCAPTCHA 质询时,Google reCAPTCHA API 颁发的加密令牌。
          • siteKey— Google reCAPTCHA 站点密钥。
          • (可选)expectedAction— 您希望用户采取的启动 reCAPTCHA 的操作,例如 login。此参数映射到 Google 的 action 参数。
          • projectId— Google 的项目 ID。

          有关更多信息,请查看 Google reCAPTCHA 文档

          emailtemplate

          如果启用电子邮件模板允许列表,需要指定多个自定义电子邮件模板。

          如果没有启用电子邮件模板允许列表,则不能包含此参数。

          如果不包含此参数,Salesforce 会使用在 Experience Cloud 设置中配置的默认电子邮件模板,而不管是否启用了允许列表。如果没有配置模板,Salesforce 将使用默认 OTP 电子邮件模板。默认模板的电子邮件模板语言由用户在 Salesforce 中的语言设置控制。

          自定义电子邮件模板开发人员名称。此参数只能包含来自允许列表的电子邮件模板。

          要控制自定义电子邮件模板的语言,请使用所需语言创建模板

          login_hint 如果您使用无头用户发现 Apex 处理器,则需要此项。 Apex 处理程序可用于查找用户的 Salesforce 帐户的标识符。例如,在应用程序中收集用户的订单号,并在 login_hint 参数中传递。我们将login_hint值直接发送到 Apex 处理程序。

          下面是一个对无头无密码登录 API 的请求示例。此请求适用于不使用无头用户发现处理器的实施。

          POST /services/auth/headless/init/passwordless/login? HTTP 1.1
          Host: MyExperienceCloudSite.my.site.com
          {
           "verificationmethod": "email",
          "username": "janice.edwards@example.com",
          "recaptcha": "***********",
          "emailtemplate": "unfiled$public/SalesNewCustomerEmail"
          }

          如果您正在使用无头用户发现处理器,以下是请求示例。

          POST /services/auth/headless/init/passwordless/login? HTTP 1.1
          Host: MyExperienceCloudSite.my.site.com
          {
           "verificationmethod": "email",
          "login_hint": "<user identifier such as email address, phone number, order number>",
          "recaptcha": "***********",
          "emailtemplate": "unfiled$public/SalesNewCustomerEmail"
          }

          (可选)无头用户发现处理器查找用户

          如果您正在使用无头用户发现处理器,处理器会获取 login_hint 参数并查找关联用户。处理程序确认用户的电子邮件地址或电话号码已验证。

          有关示例处理程序,请参见 Auth.HeadlessUserDiscoveryHandler

          Salesforce 向您的应用程序返回请求标识符

          如果请求成功,Salesforce 会发送回包含请求identifier的成功消息,这在流的后面交换访问令牌时很重要。以下是成功消息示例。

          {
              "status”: "success",
              "email": "jedwards@example.com",
              "identifier": “0RXXXXXXXX”
          }

          Salesforce 向用户发送 OTP

          在 Salesforce 向您的应用程序发送请求标识符后,它还会立即向用户发送包含 OTP 的电子邮件或短信文本消息。

          您的应用程序会显示验证表单

          在应用程序中,您将本地显示验证表单,用户可在其中输入 OTP。

          最终用户输入 OTP

          最终用户通过电子邮件或短信收到 OTP,并在应用程序的验证表单中输入。

          应用程序会为 PKCE 生成参数

          如果您正在使用 PKCE 扩展(我们强烈建议 ) , 应用程序会生成code_verifiercode_challenge参数。

          RFC 7636 中定义的 PKCE 规范还包括您可以在授权请求中发送的可选code_challenge_method参数。Salesforce 忽略您在此参数中发送的任何值,并默认设置为 SHA256

          应用程序向授权端点发送请求

          一旦用户通过输入 OTP 验证了他们的身份,应用程序就会初始化授权代码和凭据流,并向授权端点发出请求,在那里用请求 ID 和 OTP 交换授权代码。

          在授权请求中包含这些标题。

          授权请求:标题
          标题 必需? 描述
          Auth-Request-Type 是。 指定您想要向 Salesforce 发送的请求类型。对于无头无密码登录,此值必须设置为 passwordless-login
          Auth-Verification-Type 是。 用于验证用户身份的方法。Salesforce 支持验证方法的两个值:emailsms
          Authorization 是。

          标识无密码登录请求的基本标题,以便 Salesforce 可以将其链接到用户的存储信息。

          包括 Salesforce 提供的请求标识符 (identifier) 和用于验证用户身份的 OTP。以 <identifier:OTP> 格式将这些值相互附加,并对结果值进行 Base64 编码。整个标题值看起来像 <Base64-encoded identifier:OTP>

          Uvid-Hint

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

          您也可以在请求正文中传递普通的 UVID 值,而不是在标题中传递带有 UVID 的基于 JWT 的令牌。

          基于 JWT 的访问令牌,包含 UVID 值,这是一个版本 4 通用唯一标识符 (UUID),完全由您的应用程序生成和管理。要获得带有 UVID 的访问令牌,您必须使外部客户端应用程序或连接的应用程序能够发布基于 JWT 的访问令牌,并在您的应用程序上实施无头来宾流。

          在请求正文中包含这些参数。

          授权请求:正文
          参数 必需? 描述
          response_type 是。 应用程序请求的 OAuth 2.0 授权类型。因为该流是授权代码和凭据流的变体,所以该值必须是 code_credentials
          client_id 是。 外部客户端应用程序或连接的应用程序的使用者密钥。
          redirect_uri 是。

          成功身份验证后用户重定向的 URL。redirect_uri必须匹配外部客户端应用程序或连接的应用程序回调 URL 字段中的值之一。否则,批准失败。该值必须是编码 URL。

          对于此流,您可以使用 Echo 端点 https://MyExperienceCloudSite.my.site.com/services/oauth2/echo 作为回调端点。

          code_challenge 仅当您使用 PKCE 时。强烈推荐 PKCE,尤其是对公共客户端。

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

          如果授权请求中提供了code_challenge,令牌请求中提供了code_verifier,Salesforce 会比较这两个值。如果code_challenge无效或不匹配,登录将失败,并显示invalid_request错误代码。

          如果授权请求中提供了code_challenge,但令牌请求中没有code_verifier,则登录失败,并显示invalid_grant错误代码。

          uvid_hint

          否。如果您在应用程序上实施来宾用户流,您可以选择使用此参数传入与来宾用户身份相关的 UVID 值,将来自来宾用户会话的上下文信息传送到命名用户会话中。

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

          普通的 UVID 值,这是完全由您的应用程序生成和管理的第 4 版 UUID。要获得 UVID,您必须使外部客户端应用程序或连接的应用程序能够发布基于 JWT 的访问令牌,并在您的应用程序上实施无头来宾流。

          以下是授权端点的示例请求。此示例包含 PKCE。

          POST /services/oauth2/authorize? HTTP 1.1
          Host: MyExperienceCloudSite.my.site.com
          Auth-Request-Type: passwordless-login
          Auth-Verification-Type: email
          Authorization: Basic <base64-encoded identifier:OTP
          
          response_type=code_credentials&
          client_id=***********&
          redirect_uri=https://www.MyExperienceCloudSite.my.site.com/services/oauth2/echo&
          code_challenge=********
          

          Salesforce 验证请求并返回 302 重定向

          当请求到达授权端点时,Salesforce 验证请求标识符和 OTP。然后,Salesforce 将 HTTP 302 重定向返回到包含授权代码的预配置 URL。如果流在浏览器中发生,302 重定向将在浏览器中处理,并且 Salesforce 会自动将重定向响应发送到重定向 URL,即回调端点。这是一个预配置 URL 的例子。

          https://www.MyDomainName.my.site.com/services/apexrest/code/exchange?code=aPrxC1*******
          &sfdc_community_url=https%3A%2F%2FMyDomainName.my.site.com&sfdc_community_id=0DBxxxxxxxxxxxx

          回调端点向您的应用程序发送授权代码

          回调端点提取授权代码并将其返回到您的应用程序。在这些代码示例中,重定向 URL 指向 Experience Cloud 站点上的 /services/oauth2/echo 回调端点。该端点自动解析 302 重定向,提取授权代码和其他参数,并以 JSON 格式返回给应用程序。

          应用程序启动令牌交换

          应用程序会收到代码响应。要获取访问令牌,应用程序通过向/services/oauth2/token端点发送无头 POST 请求来启动代码交换。

          该请求没有标题。在请求正文中包含这些参数。

          令牌交换请求:正文参数
          参数 必需? 描述
          code 是。 授权服务器创建授权代码,这是一个短期标记,并在成功身份验证后将其传递给客户端。客户端会将授权码发送到授权服务器,以获取访问标记,或刷新标记。
          client_id 是。 外部客户端应用程序或连接的应用程序的使用者密钥。
          redirect_uri 是。

          成功身份验证后用户重定向的 URL。重定向 URI 必须与外部客户端应用程序或连接的应用程序回调 URL 字段中的值之一匹配。否则,批准失败。该值必须是编码 URL。

          对于此流,您可以使用 Echo 端点 https://MyExperienceCloudSite.my.site.com/services/oauth2/echo 作为回调端点。

          grant_type 是。 应用程序可以提供的验证类型,以证明它是一个安全的访问者。对于授权代码和凭据流,值必须是 authorization_code
          code_verifier 仅当您使用 PKCE 时。

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

          如果令牌请求中有code_verifier值,授权请求中有code_challenge值,Salesforce 会比较这两个值。如果code_verifier无效或不匹配,登录将失败,并显示invalid_grant错误代码。

          如果令牌请求中包含code_verifier值,但授权请求中没有code_challenge值,则登录失败,并显示invalid_grant错误代码。

          以下是令牌请求示例。此示例使用 PKCE。

          POST services/oauth2/token? HTTP 1.1
          Host: MyExperienceCloudSite.my.site.com
          
          code=********&
          client_id=**********&
          redirect_uri=https://MyExperienceCloudSite.my.site.com/services/oauth2/echo&
          grant_type=authorization_code&
          code_verifier=*******

          Salesforce 授予访问令牌

          验证应用程序的凭据后。Salesforce 向浏览器返回访问令牌。以下是 JSON 格式的访问令牌响应示例。

          {
          "access_token":"*******************",
          "sfdc_community_url":"https://MyDomainName.my.site.com",
          "sfdc_community_id":"0DBxxxxxxxxxxxx",
          "signature":"ts6wm/svX3jXlCGR4uu+SbA04M6qhD1SAgVTEwZ59P4=",
          "scope":"openid api",
          "id_token":"XXXXXX",
          "instance_url":"https://yourInstance.salesforce.com",
          "id":"https://yourInstance.salesforce.com/id/00Dxxxxxxxxxxxx/005xxxxxxxxxxxx",
          "token_type":"Bearer",
          "issued_at":"1667600739962"
          }

          访问令牌响应包含这些参数。

          令牌响应参数
          参数 必需? 描述
          access_token 是。 外部客户端应用程序或连接的应用程序用来代表客户端应用程序请求访问受保护资源的 OAuth 标记。访问标记可以附带范围形式的附加权限。
          id 是。 可用于标识用户以及查询有关用户的更多信息的身份 URL。请参阅身份 URL
          id_token 否。 一种签名数据结构,包含经过身份验证的用户属性,包括用户的唯一标识符和指示标记发放时间的时间戳。它还识别请求的应用程序。请参见 OpenID Connect 规格
          instance_url 是。 指示用户的组织实例的 URL。例如,https://yourInstance.salesforce.com/
          issued_at 是。 签名创建时的时间戳,以 UTC 时间 1970-01-01T0:0:0Z 的毫秒数表示。
          refresh_token 否。 从 Web 服务器、用户代理或混合应用程序标记流中获取的标记。该值是密钥。采取适当措施保护它。仅当您的外部客户端应用程序或连接的应用程序设置了refresh_token范围时,才会返回此参数。
          signature 是。 使用 client_secret 签名的 Base64 编码 HMAC-SHA256 签名。签名可以包括连接 ID 和issued_at值,您可以使用它们来验证身份 URL 自服务器发送以来没有更改。
          sfdc_community_url 是。 Experience Cloud 站点的 URL。
          sfdc_community_id 是。 用户的 Experience Cloud 站点 ID。
          state 否。 客户端请求的状态。仅当原始查询字符串中包含 state 参数时,才会包含此值。
          token_type 是。 Bearer标记类型,用于包含访问标记的所有响应。

          应用程序创建用户会话

          浏览器存储来自令牌响应的信息,并创建用户会话。应用程序会调用 Salesforce 用户信息端点,以确认登录成功。

          备注
          备注 确保您对访问令牌存储进行完全安全审查。永远不要将访问令牌存储在浏览器的本地存储中,并且尽可能避免将其存储在 Cookie 中。

          用户已登录并在应用程序中执行操作

          最终用户现在已登录,他们在您的应用程序中执行需要访问 Salesforce 数据的操作。例如,他们单击按钮来查看他们的订单历史,该历史存储在 Salesforce 中。

          备注
          备注 在您为授权代码和凭据流设置外部客户端应用程序或连接的应用程序时,您可将允许用户策略设置为管理员批准的用户已预授权,并配置哪些简档或权限集可以访问应用程序。通过该策略,用户无需授权即可访问应用程序,因此他们不会看到授权屏幕提示他们让应用程序访问他们的数据。

          应用程序对 Salesforce 端点进行身份验证调用

          要访问用户的 Salesforce 数据,您的应用程序使用访问标记对受保护的 Salesforce 端点进行身份验证调用,例如 Salesforce API。

          用户可以访问 Salesforce 数据

          用户现在可以在您的应用程序中访问受保护的 Salesforce 数据。例如,他们可以查看他们的订单历史。从用户的角度来看,从登录到访问他们的数据的整个过程都不需要他们离开应用程序。

           
          正在加载
          Salesforce Help | Article