無周邊身分驗證 API:私人用戶端無周邊無密碼登入流程
若要簡化平台外應用程式的登入流程,請設定「無周邊無密碼登入流程」。使用者可透過輸入其電子郵件地址或電話號碼,並使用一次性密碼 (OTP) 驗證其身分,來登入您的應用程式。在前端,您會控制應用程式中的使用者體驗。在後端,您的應用程式會透過 Experience Cloud 網站呼叫「無周邊無密碼登入 API」將使用者登入。以下步驟會向您顯示流程如何搭配私人用戶端 (例如傳統用戶端-伺服器應用程式) 使用;私人用戶端可讓資訊保持機密。
必要版本
| 提供版本:Salesforce Classic (並非所有組織皆適用) 和 Lightning Experience |
| 提供版本:Enterprise、Unlimited 及 Developer Edition |
此流程是「授權代碼和認證流程」的變化,可延伸「OAuth 2.0 授權代碼」授與類型。與其他變化一樣,此變化包含對 Salesforce 端點的呼叫,以取得授權代碼並交換成存取權杖。在此變化中,您的應用程式會將要求識別碼和 OTP 交換成授權代碼,而非使用者名稱和密碼,就如同其在更傳統的無周邊登入流程中一樣。接著將代碼交換成存取權杖。
設定此流程前,請先完成下列步驟。
- 完成無周邊身分驗證的先決條件
- 使用下列其中一個選項將您的平台外應用程式與 Salesforce 整合。
- 設定無周邊無密碼登入的 Experience Cloud 設定
以下是「無周邊無密碼登入流程」的範例使用個案。您為一家旅遊公司工作,該公司使用 Salesforce 管理客戶資訊,且您已在自己的平台外應用程式中實作無周邊登入和註冊。在註冊流程期間,您會收集使用者的電子郵件地址。為了讓登入流程更簡單,您可以設定無周邊無密碼登入以電子郵件作為驗證方法。現在,當使用者造訪您的應用程式時,他們可以輸入其電子郵件地址,並會收到 OTP。使用者在您的應用程式中輸入 OTP,且 Salesforce 驗證其身分後,使用者便會登入並可存取受保護的 Salesforce 資料,例如其旅遊歷程記錄。
或者,為了讓使用者體驗更有彈性,您可以使用無周邊使用者探索 Apex 處理常式來 ⁇ 取使用者。開發您的處理常式,以根據使用者的電子郵件地址、電話號碼或任何其他可與 Salesforce 使用者連結的識別碼來查詢使用者。例如,提示使用者以其路途確認號碼登入。當使用者輸入其確認號碼時,Salesforce 會尋找相關聯的使用者名稱,並將 OTP 傳送至使用者的電子郵件地址。如需如何開發 Apex 處理常式的詳細資訊,請參閱 Apex 參考指南中的 Auth.HeadlessUserDiscoveryHandler。
對於可以安全地將應用程式取用者密碼儲存在其本身後端的私人用戶端,建議您透過驗證對「無周邊無密碼登入 API」的呼叫,來保護流程安全。在您的 Experience Cloud 設定中一律啟用「 需要驗證才能存取此 API 」,並在您 services/auth/headless/init/passwordless/login 對端點的初始要求中包含核發給內部整合使用者的存取權杖。若要取得存取權杖,請使用標準 OAuth 2.0 流程,例如使用者-代理程式流程。針對您用於標準 OAuth 流程的外部用戶端應用程式或連線應用程式,請包含 pwdless_login_api 範圍,以便其反映在您的存取權杖中。
您可以選擇性地額外新增一層安全性,方法是在 Experience Cloud 設定中啟用「需要 reCAPTCHA 才能存取此 API」,並在您的應用程式上實作 reCAPTCHA。但是,經驗證的 API 呼叫是您私人用戶端的最佳主要防禦線。
為了進一步保護您的流程,我們一律建議實作 OAuth 2.0 Proof Key for Code Exchange (PKCE) 擴充功能。
若要針對在流程期間傳送給一般使用者的一次性密碼 (OTP) 電子郵件展開電子郵件範本選項,請選擇加入電子郵件範本允許清單,並使用自訂範本建立允許清單。請參閱針對無周邊流程使用多個電子郵件範本。
以下是私人用戶端的「無周邊無密碼登入流程」概觀。
- 使用者開啟您的應用程式,並看見您的應用程式本身顯示登入表單。使用者依照登入表單的要求輸入電子郵件地址或電話號碼 (1)。
- 如果您未使用無周邊使用者探索處理常式,則您的應用程式會找到與使用者的電話號碼或電子郵件地址相關聯的使用者名稱 (2)。
- 您的應用程式會將無周邊 POST 要求提交至「無周邊無密碼登入 API」(Experience Cloud 網站上的
services/auth/headless/init/passwordless/login端點 (3)。 - (選用) 如果您使用無周邊使用者探索處理常式,則處理常式會尋找與在
login_hint參數中傳送的資料相關聯的使用者名稱,並確認已驗證與使用者相關聯的電子郵件地址或電話號碼。 - Salesforce 會將成功訊息傳回至您的應用程式。此外也會傳送稍後在流程中使用的要求識別碼 (4a)。
- 視驗證方法而定,Salesforce 會將含有 OTP 的電子郵件或 SMS 簡訊傳送給使用者 (4b)。
- 您的應用程式本身會顯示 OTP 驗證表單 (5)。
- 使用者會收到其 OTP,並將其輸入至您的應用程式 (6)。
- 如果您使用 PKCE (強烈建議),則您的應用程式會產生 PKCE 參數 (7)。
- 您的應用程式會透過對 Salesforce 授權端點 (
services/oauth2/authorize) 的 POST 或 GET 要求啟動「授權代碼和認證流程」。該要求包含要求識別碼和 OTP,以及可識別應用程式與指定要求類型的其他參數 (8)。 - Salesforce 會驗證要求識別碼和 OTP,並將 302 重新導向傳回至包含授權代碼的預先設定 URL。如果正在瀏覽器中執行流程,則會在瀏覽器中處理 302 重新導向,且會以無周邊的方式將回應傳遞至伺服器端回呼端點 (9)。
- 您的伺服器端回呼處理常式會從 302 重新導向中擷取程式碼和其他參數,並開始與權杖端點的 POST 要求交換代碼 (10)。
- Salesforce 會驗證權杖要求,並傳回存取權杖與狀態 (11)。
- 伺服器端回呼處理常式會處理權杖回應,並將登入狀態傳回至應用程式。此回應會包含工作階段詳細資料、使用者資訊,且可能包含存取權杖 (12)。
- 您的應用程式會接收權杖回應,並建立使用者的工作階段 (13)。
- 使用者現在已登入,並在您的應用程式中執行動作,例如按一下按鈕來查看其訂單歷程記錄 (14)。
- 您的應用程式會將已驗證的要求傳送至受保護的 Salesforce API (15)。
- 使用者現在可以在您的平台外應用程式中存取其 Salesforce 資料 (16)。
如步驟 10 中所述,針對私人用戶端,您建立了一個伺服器端回呼處理常式,它會擷取 302 重新導向並將授權代碼傳回至您的應用程式。若要瞭解要如何建立此處理常式,請參閱私人用戶端的授權代碼和認證流程,其中包含公開為 REST 資源的範例 Apex 處理常式。
一般使用者輸入用於登入的電子郵件地址或電話號碼
此流程會在一般使用者造訪您的應用程式時開始。您的應用程式本身會顯示登入表單,該表單只會要求使用者的電子郵件地址或電話號碼。或者,如果您使用無周邊使用者探索處理常式,以根據不同的識別碼 (例如訂單編號) 查詢使用者,則您的應用程式會顯示登入表單,提示使用者取得識別碼。一般使用者輸入資訊,然後按一下按鈕以登入。
您的應用程式尋找使用者名稱
如果您未使用無周邊使用者探索處理常式,您的應用程式會查詢使用者的電子郵件地址或電話號碼,並尋找相關聯的使用者名稱。
如果您使用無周邊使用者探索處理常式,則您的應用程式會略過此步驟。您的處理常式會在您提交初始要求後查詢使用者。
您的應用程式將要求傳送至無周邊無密碼登入 API
從瀏覽器,您的應用程式會將無周邊 POST 要求提交至 Experience Cloud 網站上的無周邊無密碼登入端點 (services/auth/headless/init/passwordless/login)。
包含用於驗證要求的標頭。
| 參數 | 是否必要? | 描述 |
|---|---|---|
Authorization
|
如果您在 Experience Cloud 設定中啟用「需要驗證才能存取此 API」(建議私人用戶端啟用),則為必要。 | 包含核發給內部整合使用者之存取權杖的「承載者」標頭。若要取得存取權杖,您可以使用 Salesforce 支援的任何標準 OAuth 流程。確定您將 pwdless_login_api 範圍指派給外部用戶端應用程式或連線的應用程式,或在流程期間將其作為參數傳遞。 |
在要求內文中包含這些參數。
| 參數 | 是否必要? | 描述 |
|---|---|---|
verificationmethod
|
是。 | 您想要用於驗證使用者身分的方法。您可以使用 email 或 sms。 |
username
|
如果您未使用無周邊使用者探索處理常式,則為必要。 | 與使用者提交的電子郵件地址或電話號碼繫結的使用者名稱。 |
recaptcha
|
如果這些條件適用於您,則為必要。
|
使用者完成 reCAPTCHA 挑戰時,由 Google reCAPTCHA API 核發的加密權杖。 |
recaptchaevent |
如果這些條件適用於您,則為必要:
|
包含這些子參數的 JSON 物件。
如需詳細資訊,請參閱 Google 的 reCAPTCHA 文件。 |
emailtemplate
|
如果已啟用電子郵件範本允許清單,則需要指定多個電子郵件範本。 如果您未啟用電子郵件範本允許清單,則無法包含此參數。 如果您未包含此參數,則無論是否啟用允許清單,Salesforce 都會使用在您 Experience Cloud 設定中設定的預設電子郵件範本。如果未設定範本,則 Salesforce 會使用預設 OTP 電子郵件範本。預設範本的電子郵件範本語言是由 Salesforce 中的使用者語言設定所控制。 |
自訂電子郵件範本開發人員名稱。此參數只能包含允許清單中的電子郵件範本。 若要控制自訂電子郵件範本的語言,請以所需語言建立範本 |
login_hint
|
如果您使用無周邊使用者探索 Apex 處理常式,則為必要。 | 您的 Apex 處理常式可用來尋找使用者 Salesforce 帳戶的識別碼。例如,在應用程式中收集使用者的訂單編號,並在 login_hint 參數中傳遞。我們會將 login_hint 值直接傳送至您的 Apex 處理常式。 |
以下為對「無周邊無密碼登入 API」的範例要求。在此範例中,需要驗證,但不需要 reCAPTCHA。此要求適用於不使用無周邊使用者探索處理常式的實作。
POST /services/auth/headless/init/passwordless/login? HTTP 1.1
Host: MyExperienceCloudSite.my.site.com
Authorization: Bearer <access token>
{
"verificationmethod": "email",
"username": "janice.edwards@example.com",
"emailtemplate": "unfiled$public/SalesNewCustomerEmail"
}以下是使用無周邊使用者探索處理常式的要求範例。
POST /services/auth/headless/init/passwordless/login? HTTP 1.1
Host: MyExperienceCloudSite.my.site.com
Authorization: Bearer <access token>
{
"verificationmethod": "email",
"login_hint": "<user identifier such as email address, phone number, order number>",
"emailtemplate": "unfiled$public/SalesNewCustomerEmail"
}(選用) 無周邊使用者探索處理常式尋找使用者
如果您使用無周邊使用者探索處理常式,則處理常式會取用 login_hint 參數並尋找相關聯的使用者。處理常式會確認使用者的電子郵件地址或電話號碼已驗證。
如需範例處理常式,請參閱《Apex 參考指南》中的 Auth.HeadlessUserDiscoveryHandler。
Salesforce 將要求識別碼傳回至您的應用程式
如果要求成功,Salesforce 會傳回成功訊息,其中包含要求的 identifier,這在稍後在流程中為存取權杖交換時十分重要。以下為範例成功訊息。
{
"status": "success",
"email": "jedwards@example.com",
"identifier": "0RXXXXXXXX"
}Salesforce 將 OTP 傳送給使用者
在 Salesforce 將要求識別碼傳送至您的應用程式後,也會立即將具有 OTP 的電子郵件或 SMS 簡訊傳送給使用者。
您的應用程式顯示驗證表單
在您的應用程式中,本身就會顯示驗證表單讓使用者輸入 OTP。
一般使用者輸入 OTP
一般使用者會透過電子郵件或簡訊收到 OTP,並在您應用程式的驗證表單中輸入。
您的應用程式產生 PKCE 的參數
如果您使用 PKCE 擴充功能 (強烈建議),則您的應用程式會產生 code_verifier 和 code_challenge 參數。
RFC 7636 中定義的 PKCE 規格也包含可在授權要求中傳送的選用 code_challenge_method 參數。Salesforce 會忽略您在此參數中傳送的任何值,並預設為 SHA256。
您的應用程式傳送要求至授權端點
只要使用者透過輸入 OTP 來驗證其身分,您的應用程式便會以對授權端點的要求來初始化「授權代碼和認證流程」,在其中會將要求識別碼和 OTP 交換成授權代碼。
在授權要求中包含這些標頭。
| 頁首 | 是否必要? | 描述 |
|---|---|---|
Auth-Request-Type
|
是。 | 指定您要向 Salesforce 提出的要求類型。針對無周邊無密碼登入,此值必須設定為 passwordless-login。 |
Auth-Verification-Type
|
是。 | 用於驗證使用者身分的方法。Salesforce 支援兩個驗證方法的值:email 和 sms。 |
Authorization
|
是。 | 識別無密碼登入要求的基本標頭,讓 Salesforce 能夠將該要求連結至使用者的已儲存資訊。 包含 Salesforce 提供的要求識別碼 ( |
Uvid-Hint
|
否。如果您在應用程式上實作來賓使用者流程,您可以選擇性地使用此標頭來傳遞 JSON Web 權杖 (JWT) 型存取權杖,其中包含與來賓使用者身分繫結的唯一訪客識別碼 ( 您也可以在要求內文中傳遞純文字 |
包含 UVID 值的 JWT 型存取權杖,這是完全由您的應用程式產生及管理的第 4 版通用唯一識別碼 (UUID)。若要透過 UVID 取得存取權杖,您必須啟用外部用戶端應用程式或連線應用程式來核發 JWT 型存取權杖,並在應用程式上實作無周邊來賓流程。 |
在要求內文中包含這些參數。
| 參數 | 是否必要? | 描述 |
|---|---|---|
response_type
|
是。 | 您應用程式要求的 OAuth 2.0 授與類型。針對「授權代碼和認證流程」,此值必須是 code_credentials。 |
client_id
|
是。 | 外部用戶端應用程式或連線的應用程式取用者金鑰。 |
redirect_uri
|
是。 | 成功驗證後,將使用者重新導向的 URL。 針對私人用戶端,請使用指向伺服器端回呼處理常式的 |
code_challenge
|
僅當您使用 PKCE 時。強烈建議 PKCE。 | 指定權杖要求中 如果授權要求中提供 如果授權要求中提供 |
uvid_hint
|
否。如果您在應用程式上實作來賓使用者流程,您可以選擇性地使用此參數傳遞與來賓使用者身分繫結的 您也可以 |
純文字 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.MyDomainName.my.site.com/services/apexrest/code/exchange&
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伺服器端回呼處理常式會擷取代碼並執行代碼交換
伺服器端回呼處理常式會從 302 重新導向中擷取授權代碼和其他參數。接著會透過將無周邊 POST 要求傳送至權杖端點來啟動程式碼交換。
此要求沒有標頭。在要求內文中包含這些參數。
| 參數 | 是否必要? | 描述 |
|---|---|---|
code
|
是。 | 授權伺服器會在成功驗證後建立授權代碼,並將其傳遞至用戶端,該授權代碼為短暫的權杖。用戶端會將授權代碼傳送至授權伺服器來取得存取權杖,或者是重新整理權杖。 |
client_id
|
是。 | 外部用戶端應用程式或連線應用程式的取用者金鑰。 |
client_secret
|
是。 | 外部用戶端應用程式或連線應用程式的取用者密碼。在此流程中,會作為應用程式用來存取 Salesforce 的密碼。 |
redirect_uri
|
是。 | 在成功驗證後,將使用者重新導向至其中的 URL。重新導向 URI 必須與外部用戶端應用程式「回呼 URL」欄位中的其中一個值相符。否則批准會失敗。這個值必須經過 URL 編碼。 針對私人用戶端,請使用指向伺服器端回呼處理常式的 |
grant_type
|
是。 | 應用程式可以提供用來證明其是安全訪客的驗證類型。針對「授權代碼和認證流程」,此值必須是 authorization_code。 |
code_verifier
|
僅當您使用 PKCE 時。 | 指定具有高熵的 128 個位元組的隨機資料,使得不易猜出 code 值。設定此參數來協助避免授權代碼攔截攻擊。此值必須依照在 https://datatracker.ietf.org/doc/html/rfc4648#section-5 中定義以 base64url 編碼。 如果權杖要求中有 如果權杖要求中有 |
以下是權杖要求的範例。此範例使用 PKCE。
POST services/oauth2/token? HTTP 1.1
Host: MyExperienceCloudSite.my.site.com
code=********&
client_id=**********&
client_secret=*********&
redirect_uri=https://www.MyDomainName.my.site.com/services/apexrest/code/exchange&
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 可用來識別使用者與查詢使用者的詳細資訊。請參閱身分 URL。 |
id_token
|
否。 | 包含經驗證使用者屬性的已簽署資料結構,屬性內含使用者的唯一識別碼,以及指示權杖核發時間的時間戳記。此外也會識別提出要求的應用程式。請參閱 OpenID Connect 規格。 |
instance_url
|
是。 | 指示使用者組織例項的 URL。例如,https://yourInstance.salesforce.com/。 |
issued_at
|
是。 | 建立簽章時的時間戳記,表示為從 1970-01-01T0:0:0Z UTC 開始的毫秒數。 |
refresh_token
|
否。 | 從 Web 伺服器、使用者代理程式或混合式應用程式權杖流程所取得的權杖。這個值是密碼。採取適當的措施來保護此值。只有在您的外部用戶端應用程式或連線應用程式設定為具有 refresh_token 範圍時,才會傳回此參數。 |
signature
|
是。 | 以 client_secret 簽署的 Base64 編碼 HMAC-SHA256 簽章。簽章可以包含串連的識別碼和 issued_at 值,您可以用來確認身分 URL 自伺服器傳送後未變更。 |
sfdc_community_url
|
是。 | Experience Cloud 網站的 URL。 |
sfdc_community_id
|
是。 | 使用者的 Experience Cloud 網站識別碼。 |
state
|
否。 | 用戶端所要求的狀態。只有在原始查詢字串中包含 state 參數時,才會包含此值。 |
token_type
|
是。 | Bearer 權杖類型,用於包含存取權杖的所有回應。 |
伺服器端回呼處理常式處理權杖回應
若要取得存取權杖,回呼處理常式會處理回應,然後將存取權杖和狀態傳回至瀏覽器,並連同使用者資料、權杖和工作階段資料一起傳回。作為最佳作法,建議您設定伺服器來儲存存取權杖、建立應用程式的工作階段,並將工作階段 (而非存取權杖) 傳回應用程式。身為開發人員,您擁有建立工作階段、儲存存取權杖及管理登入狀態的完整控制權,因此您的特定實作由您自行決定。
以下是瀏覽器主控台記錄中成功回應的範例。
{
"success":true,
"state":"https://MyExperienceCloudSite.my.site.com/",
"errMsg":"null",
"access_token":"00*******"
}
應用程式建立使用者的工作階段
應用程式接收存取權杖回應,並建立使用者的工作階段。
使用者已登入並在應用程式中執行動作
一般使用者現在已登入,他們在您的應用程式中執行需要存取 Salesforce 資料的動作。例如,他們按一下按鈕以檢視其儲存在 Salesforce 中的訂單歷程記錄。
應用程式對 Salesforce 端點發出已驗證的呼叫
為存取使用者的 Salesforce 資料,您的應用程式會使用存取權杖來對受保護的 Salesforce 端點 (例如 Salesforce API) 進行驗證呼叫。
使用者可存取 Salesforce 資料
使用者現在可以存取應用程式中的受保護 Salesforce 資料。例如,他們可以查看自己的訂單歷程記錄。對使用者來說,從登入到存取其資料的整個流程,他們都無須離開應用程式。

