Вы находитесь здесь:
Headless Identity API: Поток входа без пароля для личных клиентов
Чтобы упростить процесс входа для внеплатформенного приложения, настройте поток входа без пароля. Пользователи входят в приложение, введя электронный адрес или номер телефона и проверив подлинность с помощью одноразового пароля (OTP). На лицевой стороне вы управляете взаимодействием пользователя в вашем приложении. В фоновом режиме ваше приложение вызывает API входа без пароля посредством сайта Experience Cloud для входа пользователя. Эти действия отображают, как поток работает с личным клиентом, например, традиционным приложением клиентского сервера, который может сохранить конфиденциальность информации.
Требуемые версии
| Доступно в версиях: Salesforce Classic (недоступно во всех организациях) и Lightning Experience. |
| Доступно в версиях: Enterprise Edition, Unlimited Edition и Developer Edition |
Этот поток является вариацией потока кода авторизации и регистрационных данных, который расширяет тип предоставления кода авторизации OAuth 2.0. Как и другие варианты, он содержит вызовы конечных точек Salesforce для получения кода авторизации и обмена его на маркер доступа. В этом варианте приложение обменивает идентификатор запроса и ОТП на код авторизации, а не имя пользователя и пароль, как в более традиционном потоке входа без заголовка. Код потом обменивается на маркер доступа.
Прежде чем настраивать поток, выполните данные действия.
- Заполнение предварительных требований для удостоверения без заголовка
- Интегрируйте внеплатформенное приложение в Salesforce, используя один из указанных вариантов.
- Настройка параметров Experience Cloud для входа без пароля
Ниже указан пример сценария использования для потока входа без пароля. Вы работаете в туристической компании, которая управляет сведениями о клиентах в Salesforce, и вы уже внедряете вход без заголовка и регистрацию в внеплатформенное приложение. Во время процесса регистрации вы собираете электронный адрес пользователя. Чтобы упростить процесс входа, настройте вход без пароля с электронной почтой в качестве метода проверки. Теперь, когда пользователи посещают ваше приложение, они могут ввести свой электронный адрес и получить ОТП. После ввода ОТП в приложение и проверки подлинности Salesforce пользователь вошел в систему и получает доступ к защищенным данным Salesforce, например, журналу поездки.
По желанию, для большей гибкости работы с пользователями можно использовать средство Apex обнаружения без заголовка для извлечения пользователей. Разработайте средство обработки для поиска пользователей на основе их электронного адреса, номера телефона или любого другого идентификатора, который может быть связан с пользователем Salesforce. Например, предложите пользователям войти с помощью номера подтверждения поездки. Когда пользователь вводит номер подтверждения, Salesforce находит связанное имя пользователя и отправляет ОТП на электронный адрес пользователя. Дополнительные сведения о разработке средства обработки Apex см. в разделе Auth.HeadlessUserDiscoveryHandler в справочном руководстве Apex.
Для личного клиента, который может безопасно хранить секрет пользователя приложения в собственном интерфейсе, рекомендуем обезопасить поток, проверив подлинность вызовов API входа без пароля. Всегда включайте параметр «Требовать проверку подлинности для доступа к этому API» в параметрах Experience Cloud и добавляйте маркер доступа, выданный внутреннему пользователю интеграции, в исходный запрос конечной точки services/auth/headless/init/passwordless/login. Чтобы получить маркер доступа, используйте стандартный поток OAuth 2.0, например, поток пользователя-агента. Для приложения внешнего клиента или связанного приложения, используемого для стандартного процесса OAuth, добавьте область pwdless_login_api, чтобы она отображалась в маркере доступа.
По желанию, можно добавить дополнительный уровень безопасности, включив параметр «Требовать reCAPTCHA для доступа к этому API в Experience Cloud» и внедрив reCAPTCHA в приложение. Но проверенные вызовы API являются лучшей основной линией защиты для личного клиента.
Чтобы обеспечить дополнительную безопасность потока, мы всегда рекомендуем внедрить расширение ключа подтверждения OAuth 2.0 для обмена кодами (PKCE).
Чтобы расширить параметры шаблона эл. почты для электронного сообщения с одноразовым паролем (OTP), отправленного конечным пользователям во время потока, согласитесь на добавление шаблонов эл. почты в список разрешенных и создайте список разрешенных с настраиваемыми шаблонами. См. Использование нескольких шаблонов эл. почты для потоков без заголовка.
Ниже указан обзор потока входа без пароля для личного клиента.
- Конечный пользователь открывает приложение и видит форму входа, изначально отображаемую в приложении. Они вводят свой электронный адрес или номер телефона в соответствии с запросом формы входа (1).
- Если вы не используете средство обнаружения пользователей без заголовка, ваше приложение находит имя пользователя, связанное с номером телефона или адресом эл. почты пользователя (2).
- Ваше приложение отправляет запрос POST без заголовка в API входа без пароля (конечная точка
services/auth/headless/init/passwordless/loginна сайте Experience Cloud (3). - (Дополнительно) Если вы используете средство обработки обнаружения пользователя без заголовка, средство обработки находит имя пользователя, связанное с данными, переданными в параметре
login_hint, и проверяет подлинность электронного адреса или номера телефона, связанного с пользователем. - Salesforce возвращает сообщение об успешном выполнении в приложение. Он также отправляет идентификатор запроса, который используется позже в потоке (4a).
- В зависимости от метода проверки, Salesforce отправляет пользователю сообщение эл. почты или SMS-сообщение с OTP (4b).
- Ваше приложение нативно отображает форму проверки ОТП (5).
- Пользователь получает ОТП и вводит его в приложение (6).
- Если вы используете PKCE, что мы настоятельно рекомендуем, ваше приложение создает параметры PKCE (7).
- Ваше приложение запускает код авторизации и поток регистрационных данных посредством запроса POST или GET в конечной точке авторизации Salesforce (
services/oauth2/authorize). Запрос содержит код запроса и ОТП, а также другие параметры для идентификации приложения и указания типа запроса (8). - Salesforce проверяет код запроса и OTP и возвращает переадресацию 302 на готовый URL-адрес, содержащий код авторизации. Если поток выполняется в обозревателе, переадресация 302 обрабатывается в обозревателе, и ответ доставляется без заголовка в конечную точку серверного обратного вызова (9).
- Ваше серверное средство обработки обратного вызова извлекает код и другие параметры из переадресации 302 и инициирует обмен кода посредством запроса POST в конечную точку маркера (10).
- Salesforce проверяет запрос маркера и возвращает маркер доступа и состояние (11).
- Серверное средство обработки обратного вызова обрабатывает ответ маркера и возвращает состояние входа в приложение. Этот ответ может содержать сведения о сеансе, сведения о пользователе и, возможно, маркер доступа (12).
- Ваше приложение получает ответ маркера и создает сеанс пользователя (13).
- Пользователь вошел в систему и выполняет действие в вашем приложении, например, нажатие кнопки для просмотра журнала заказа (14).
- Ваше приложение отправляет проверенный запрос в защищенный Salesforce API (15).
- Пользователь теперь имеет доступ к данным Salesforce в вашем внеплатформенном приложении (16).
Как указано в шаге 10, для личного клиента создайте серверное средство обработки обратного вызова, которое может извлечь переадресацию 302 и вернуть код авторизации в приложение. Чтобы узнать, как создать это средство, см. Код авторизации и поток регистрационных данных для личных клиентов, содержащий пример средства обработки Apex, открытого в качестве ресурса REST.
Конечный пользователь вводит свой электронный адрес или номер телефона для входа
Поток запускается, когда конечный пользователь посещает ваше приложение. Ваше приложение нативно отображает форму входа, запрашивающую только электронный адрес или номер телефона пользователя. Или, если вы используете средство обработки обнаружения пользователей без заголовка, которое ищет пользователей на основе другого идентификатора, например, номера заказа, ваше приложение может отобразить форму входа, напоминающую пользователю об идентификаторе. Конечный пользователь вводит свои сведения и нажимает кнопку для входа.
Ваше приложение находит имя пользователя
Если вы не используете средство обнаружения пользователей без заголовка, приложение ищет электронный адрес или номер телефона пользователя и находит связанное имя пользователя.
Если вы используете средство обнаружения пользователей без заголовка, ваше приложение пропускает этот этап. Обработчик ищет пользователя после отправки исходного запроса.
Ваше приложение отправляет запрос в API входа без пароля
В обозревателе приложение отправляет запрос POST без заголовка в конечную точку входа без пароля (services/auth/headless/init/passwordless/login) на сайте Experience Cloud.
Добавьте заголовок для проверки подлинности запроса.
| Параметр | Обязательно? | Описание |
|---|---|---|
Authorization
|
Обязательно при включении параметра «Требовать проверку подлинности для доступа к этому API» в параметрах Experience Cloud, рекомендуемых для личных клиентов. | Заголовок носителя, содержащий маркер доступа, выданный внутреннему пользователю интеграции. Чтобы получить маркер доступа, используйте любой стандартный поток OAuth, поддерживаемый Salesforce. Убедитесь, что вы назначили область pwdless_login_api вашему приложению внешнего клиента или связанному приложению или передали ее в качестве параметра во время потока. |
Добавьте следующие параметры в текст запроса.
| Параметр | Обязательно? | Описание |
|---|---|---|
verificationmethod
|
Да. | Метод, используемый для проверки подлинности пользователя. Вы можете использовать email или sms. |
username
|
Обязательно, если вы не используете средство обнаружения пользователей без заголовка. | Имя пользователя, привязанное к электронному адресу или номеру телефона, отправленному пользователем. |
recaptcha
|
Обязательно, если к вам применяются следующие условия.
|
Зашифрованный маркер, выдаваемый Google reCAPTCHA API при выполнении пользователем задачи reCAPTCHA. |
recaptchaevent |
Обязательно, если к вам применяются следующие условия:
|
Объект JSON, содержащий данные подпараметры.
Дополнительную информацию см. в документации reCAPTCHA Google. |
emailtemplate
|
Обязательно указать несколько шаблонов эл. почты, если включено добавление шаблонов эл. почты в список разрешенных. Если вы не включили добавление шаблона эл. почты в список разрешенных, вы не сможете добавить этот параметр. Если вы не добавите этот параметр, Salesforce использует стандартный шаблон эл. почты, настроенный в параметрах Experience Cloud, вне зависимости от включения добавления в список разрешенных. Если шаблон не настроен, Salesforce использует стандартный шаблон эл. почты ОТП. Язык шаблона эл. почты для шаблонов по умолчанию определяется параметрами языка пользователя в 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 и находит связанного пользователя. Обработчик подтверждает, что электронный адрес или номер телефона пользователя проверен.
Пример средства обработки см. в разделе Auth.HeadlessUserDiscoveryHandler Справочного руководства Apex.
Salesforce возвращает идентификатор запроса в приложение
Если запрос успешен, Salesforce отправляет обратно сообщение об успешном выполнении, содержащее identifier запроса, что важно позже в потоке при обмене на маркер доступа. Ниже указан пример сообщения об успешном выполнении.
{
"status": "success",
"email": "jedwards@example.com",
"identifier": "0RXXXXXXXX"
}Salesforce отправляет ОТП пользователю
Сразу же после отправки Salesforce идентификатора запроса в приложение пользователь получает сообщение эл. почты или SMS-сообщение с OTP.
Ваше приложение отображает форму проверки
В вашем приложении вы нативно отображаете форму проверки, где пользователь может ввести свой ОТП.
Конечный пользователь вводит OTP
Конечный пользователь получает ОТП по электронной почте или посредством текстового сообщения и вводит его в форму проверки в вашем приложении.
Ваше приложение создает параметры для PKCE
Если вы используете расширение PKCE (что мы настоятельно рекомендуем), ваше приложение создает параметры code_verifier и code_challenge.
Спецификация PKCE, определенная в RFC 7636, также содержит дополнительный параметр code_challenge_method, который можно отправить в запрос авторизации. Salesforce игнорирует любое значение, отправленное в этом параметре, и по умолчанию использует значение SHA256.
Ваше приложение отправляет запрос в конечную точку авторизации
Как только пользователь проверяет подлинность, введя ОТП, приложение инициализирует код авторизации и поток регистрационных данных с запросом в конечную точку авторизации, где обменивает код запроса и ОТП на код авторизации.
Добавьте следующие заголовки в запрос авторизации.
| Заголовок | Обязательно? | Описание |
|---|---|---|
Auth-Request-Type
|
Да. | Указывает тип запроса, который должен быть отправлен в Salesforce. Для входа без пароля это значение должно быть установлено на passwordless-login. |
Auth-Verification-Type
|
Да. | Метод, используемый для проверки подлинности пользователя. Salesforce поддерживает два значения для метода проверки: email и sms. |
Authorization
|
Да. | Базовый заголовок, определяющий запрос входа без пароля, чтобы Salesforce мог связать его с сохраненными сведениями пользователя. Добавьте идентификатор запроса ( |
Uvid-Hint
|
Нет. Если вы внедряете поток пользователя-гостя в приложение, вы можете использовать этот заголовок для передачи в маркер доступа на основе веб-маркера JSON (JWT), содержащий уникальный код посетителя ( Вместо передачи маркера на основе JWT с |
Маркер доступа на основе JWT, содержащий значение UVID, являющийся универсальным уникальным идентификатором версии 4, созданным и управляемым полностью приложением. Чтобы получить маркер доступа с UVID, необходимо включить приложение внешнего клиента или связанное приложение для выпуска маркеров доступа на основе JWT и внедрения потока без заголовка гостя в вашем приложении. |
Добавьте следующие параметры в текст запроса.
| Параметр | Обязательно? | Описание |
|---|---|---|
response_type
|
Да. | Тип гранта OAuth 2.0, запрашиваемый приложением. Для кода авторизации и потока регистрационных данных это значение должно быть code_credentials. |
client_id
|
Да. | Ключ пользователя приложения внешнего клиента или связанного приложения. |
redirect_uri
|
Да. | URL-адрес, куда пользователи перенаправляются после успешной проверки подлинности. Для личных клиентов используйте |
code_challenge
|
Только при использовании PKCE. PKCE настоятельно рекомендуется. | Указывает хэш-значение SHA256 значения Если запрос на авторизацию содержит Если |
uvid_hint
|
Нет. Если вы внедряете поток пользователя-гостя в приложение, вы можете использовать этот параметр для передачи значения Вместо передачи |
Обычное значение UVID, то есть UUID версии 4, созданный и управляемый полностью приложением. Чтобы получить 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 проверяет идентификатор запроса и ОТП. 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 байтов случайных данных с высокой энтропией, чтобы затруднить угадывание значения кода. Установите этот параметр, чтобы предотвратить атаки перехвата кода авторизации. Значение должно быть зашифровано base64url, как определено в https://datatracker.ietf.org/doc/html/rfc4648#section-5. При наличии значения Если значение |
Ниже указан пример запроса маркера. Данный пример использует 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-адреса удостоверений». |
id_token
|
Нет. | Подписанная структура данных, содержащая проверенные атрибуты пользователя, включая уникальный идентификатор пользователя и отметку времени, указывающую время выпуска маркера. Он также определяет запрашивающее приложение. См. Спецификации OpenID Connect. |
instance_url
|
Да. | URL-адрес экземпляра организации пользователя. Например, https://yourInstance.salesforce.com/. |
issued_at
|
Да. | Отметка времени создания подписи, выраженная количеством миллисекунд с 1970-01-01T0:0:0Z UTC. |
refresh_token
|
Нет. | Маркер, полученный из процесса маркера веб-сервера, пользователя-агента или гибридного приложения. Это значение является секретом. Принять надлежащие меры для его защиты. Этот параметр возвращается только при настройке приложения внешнего клиента или связанного приложения с областью refresh_token. |
signature
|
Да. | Подпись HMAC-SHA256, зашифрованная в Base64, подписанная client_secret. Подпись может содержать конкатенированный код и значение issued_at, которые можно использовать для проверки того, что URL-адрес удостоверения не изменился после отправки сервером. |
sfdc_community_url
|
Да. | URL-адрес сайта Experience Cloud. |
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 в вашем приложении. Например, они могут просмотреть журнал заказа. С точки зрения пользователя, весь процесс от входа до доступа к данным происходил без необходимости выхода из приложения.

