Вы находитесь здесь:
Headless Identity API: Поток регистрации без заголовка для общедоступных клиентов
В приложениях, которые не могут хранить конфиденциальную информацию, например, приложения на одной странице, можно настроить регистрацию без заголовка для клиентов и партнеров посредством потока регистрации без заголовка. Поток регистрации без заголовка расширяет код авторизации и поток регистрационных данных, созданный на основе типа предоставления кода авторизации OAuth 2.0. С помощью этого потока вы управляете интерфейсом регистрации фронтального пользователя в стороннем приложении. Вы вызываете Salesforce Headless Registration API посредством сайта Experience Cloud, чтобы создать пользователей, войти в систему и предоставить им доступ к ресурсам Salesforce. Разделив эти два процесса, пользователи могут зарегистрироваться в вашем приложении и получить доступ к данным Salesforce, не выходя из приложения.
Требуемые версии
| Доступно в версиях: Salesforce Classic (недоступно во всех организациях) и Lightning Experience. |
| Доступно в версиях: Enterprise Edition, Unlimited Edition и Developer Edition |
Это содержимое справки описывает, как настроить поток и как он работает. Чтобы настроить комплексный пример внедрения, см. Руководство по внедрению без заголовка.
Ниже указан пример сценария использования для потока регистрации без заголовка. Вы работаете в туристической компании, которая управляет сведениями о клиентах в Salesforce. Важно иметь полный контроль над взаимодействием пользователя в приложении. Вы также хотите сохранить больше клиентов, поощряя их к регистрации в вашем приложении, что требует служб удостоверений. Поскольку ваша компания уже использует Salesforce, Headless Identity - это путь. Вы создаете одностраничное веб-приложение и настраиваете поток регистрации без заголовка. Когда новые пользователи регистрируются в вашем приложении, они приветствуют настроенное взаимодействие регистрации. Они регистрируются, проверяют подлинность и получают доступ к данным Salesforce без прямого взаимодействия с Salesforce.
В целях безопасности настоятельно рекомендуем внедрить расширение «Ключ подтверждения для обмена кодами (PKCE)» для этого потока.
Чтобы расширить параметры шаблона эл. почты для электронного сообщения с одноразовым паролем (OTP), отправленного конечным пользователям во время потока, согласитесь на добавление шаблонов эл. почты в список разрешенных и создайте список разрешенных с настраиваемыми шаблонами. См. Использование нескольких шаблонов эл. почты для потоков без заголовка.
Прежде чем настраивать этот поток, настройте необходимые параметры и политики доступа в связанном приложении или приложении внешнего клиента. См. «Настройка связанного приложения для кода авторизации и потока регистрационных данных» или «Настройка приложения внешнего клиента для кода авторизации и потока регистрационных данных».
Ниже указан обзор потока. 
- Пользователь открывает приложение и нажимает кнопку «Зарегистрировать». (1)
- В приложении нативно отображается форма регистрации для сбора данных пользователей. Вы создаете форму и настраиваете сведения, которые хотите собрать. (2)
- Пользователь вводит свои сведения в приложение. Например, они вводят новое имя пользователя, пароль и личное имя. (3)
- Ваше приложение отправляет сведения о пользователе в конечную точку Headless Registration API /services/auth/headless/init/registration на сайте Experience Cloud. (4)
- Salesforce получает сведения о пользователе и ставит их в очередь для последующей обработки. Salesforce возвращает сообщение об успешном выполнении, содержащее код запроса на регистрацию в приложении. (5a)
- Salesforce потом отправляет пользователю сообщение эл. почты или SMS-сообщение, содержащее одноразовый пароль (OTP). (5b)
- В приложении вы нативно отображаете форму проверки ОТП. Опять же, вам нужно, как будет выглядеть эта форма. (6)
- Пользователь получает ОТП и вводит его в форму проверки. (7)
- Ваше приложение потом инициализирует код авторизации и поток регистрационных данных посредством запроса кода авторизации. Запрос содержит ОТП и код запроса, а также другие параметры. (8)
- Salesforce проверяет код запроса и ОТП. Он извлекает данные пользователя очереди, сохраненные ранее, и вызывает средство обработки регистрации без заголовка. Средство обработки регистрации без заголовка создает пользователя в Salesforce. (9)
- Salesforce возвращает переадресацию 302 на готовый URL-адрес, содержащий код авторизации. Если поток выполняется в обозревателе, переадресация 302 обрабатывается в обозревателе, и ответ доставляется без заголовка в конечную точку обратного вызова. (1)
- Конечная точка обратного вызова извлекает код и другие параметры из переадресации 302. Данная информация возвращается в приложение. (11)
- Ваше приложение инициирует обмен кодами посредством запроса POST в конечную точку маркера. (12)
- Из конечной точки маркера Salesforce возвращает ответ маркера доступа в приложение. (13)
- Ваше приложение обрабатывает ответ маркера и создает сеанс пользователя. (14)
- Пользователь зарегистрирован и вошедший в систему. Он выполняет в вашем настраиваемом приложении действие, инициирующее отправку запроса на данные Salesforce. Например, они нажимают кнопку для доступа к журналу бронирования путешествий, который хранится на сайте Salesforce Experience Cloud. (15)
- Ваше настраиваемое приложение отправляет проверенный запрос в защищенную конечную точку Salesforce, например, Salesforce API. (16)
- Клиент теперь имеет доступ к защищенным данным в настраиваемом приложении. Например, они могут просмотреть журнал бронирования. (17)
Этот поток требует серверной конечной точки, которая может обработать переадресацию 302 и вернуть код авторизации и другие параметры в приложение. Для реализаций, где вы выполняете обмен кодами в обозревателе, можно использовать конечную точку /services/oauth2/echo. Эта конечная точка автоматически анализирует переадресацию 302, извлекает параметры и возвращает их в приложение в формате JSON. Мы используем /services/oauth2/echo в примерах кода для этого процесса. Дополнительную информацию см. в разделе Конечная точка протокола OAuth 2.0.
Пользователь открывает стороннее приложение и нажимает кнопку «Зарегистрировать»
Пользователь открывает приложение и нажимает на ссылку на регистрацию, либо он нажимает на ссылку для доступа к ресурсу, требующему регистрации.
Ваше приложение отображает форму регистрации
В приложении нативно отображается форма регистрации для сбора данных пользователей. Вы управляете всем, что касается этой формы, включая ее внешний вид, внешний вид и сведения о пользователе, которые хотите собрать.
Ниже перечислены некоторые рекомендации по сбору сведений от пользователей. Когда приложение отправляет сведения о пользователе в Headless Registration API, Salesforce проверяет электронный адрес, имя пользователя, фамилию и пароль. Эти сведения можно собрать у пользователей или создать автоматически, но они должны быть добавлены в запрос POST. Принимая решение о добавлении сведений, обязательно соберите электронный адрес или номер телефона, чтобы пользователь мог проверить подлинность.
Пользователь вводит свои сведения
В приложении пользователь вводит свои сведения в форму регистрации.
Ваше приложение отправляет сведения о пользователе в Headless Registration API
В обозревателе приложение отправляет запрос POST без заголовка в конечную точку регистрации без заголовка (/services/auth/headless/init/registration) на сайте Experience Cloud посредством асинхронного Java и XML (AJAX).
Этот заголовок можно добавить в запрос на регистрацию.
| Заголовок | Обязательно? | Описание |
|---|---|---|
Content-Type
|
Нет. Если вы используете Postman для создания и тестирования потока, он иногда добавляет этот заголовок. Проверьте корректность, проверив скрытые заголовки. | Данный параметр определяет формат запроса (например, application/json). |
Добавьте следующие параметры в текст запроса.
| Параметр | Обязательно? | Описание |
|---|---|---|
password
|
Да. | Пароль пользователя. Пароль подчиняется политикам пароля, настроенным для профиля или организации. |
userdata
|
Да. Даже если вы не соберете эту информацию у пользователя, необходимо автоматически создать ее и передать в параметре userdata. |
Содержит все обязательные сведения о пользователе. Как минимум, Salesforce требует эту информацию в параметре
|
recaptcha
|
Обязательно, если к вам применяются следующие условия.
|
Зашифрованный маркер, выдаваемый Google reCAPTCHA API при выполнении пользователем задачи reCAPTCHA. |
recaptchaevent
|
Обязательно, если к вам применяются следующие условия:
|
Объект JSON, содержащий данные подпараметры.
Дополнительную информацию см. в документации reCAPTCHA Google. |
verificationmethod
|
Нет. Если вы не добавите этот параметр, Salesforce по умолчанию проверит подлинность пользователя посредством электронной почты. Если вы добавляете этот параметр, добавьте заголовок |
Метод, используемый для проверки подлинности пользователя. Salesforce поддерживает два значения для метода проверки: email и sms. |
customdata
|
Нет. | Объект JSON, содержащий любые собираемые настраиваемые сведения о пользователе. Например, можно добавить адрес улицы пользователя. Вы определяете структуру этого объекта. Он доставляется в средство обработки регистрации в виде строки JSON, которую можно десериализировать в любую нужную структуру класса Apex. |
emailtemplate
|
Обязательно указать несколько шаблонов эл. почты, если включено добавление шаблонов эл. почты в список разрешенных. Если вы не включили добавление шаблона эл. почты в список разрешенных, вы не сможете добавить этот параметр. Если вы не добавите этот параметр, Salesforce использует стандартный шаблон эл. почты, настроенный в параметрах Experience Cloud, вне зависимости от включения добавления в список разрешенных. Если шаблон не настроен, Salesforce использует стандартный шаблон эл. почты ОТП. |
Имя разработчика настраиваемого шаблона эл. почты. Данный параметр может содержать только шаблон эл. почты из списка разрешенных. |
Ниже указан пример запроса POST.
POST /services/auth/headless/init/registration? HTTP 1.1
Host: MyExperienceCloudSiteName.my.site.com
Content-Type: application/json
{
“userdata”: {
“firstName”: “Janice”
“lastName”: “Edwards”
“email”: “janice.edwards@example.com”
“username”: “jedwards@myapp.com”
}
“customdata”: {
{”mobilePhone”=”<mobile phone number>”
}
“password”: “*******”
“recaptcha”:”***********”
“verificationmethod”: “email”
“emailtemplate”: “unfiled$public/SalesNewCustomerEmail”
}Salesforce получает сведения и возвращает идентификатор запроса
Salesforce получает сведения о пользователе. Поскольку Salesforce еще не подтвердил подлинность пользователя, он еще ничего не делает со сведениями о пользователе. Вместо этого Salesforce ставит эти сведения в очередь для последующей обработки.
Если информация в запросе POST действительна, Salesforce возвращает сообщение об успешном выполнении в приложение. Это сообщение содержит идентификатор запроса на регистрацию, который важен позже в потоке. Ниже указан пример сообщения об успешном выполнении.
{
"status": "success",
"email": “jedwards@myapp.com”
"identifier": “0RXXXXXXXX”
}Salesforce отправляет одноразовый пароль пользователю
Сразу после получения данных пользователя и отправки сообщения об успешном выполнении Salesforce отправляет одноразовый пароль (OTP) по электронной почте или SMS-сообщению, в зависимости от метода проверки пользователя.
Ваше приложение нативно отображает форму проверки
При получении сообщения об успешном выполнении вы нативно отображаете форму проверки ОТП в приложении. Опять же, внешний вид и ощущения проверочного взаимодействия зависят только от вас.
Пользователь вводит ОТП в форму проверки
Пользователь получает ОТП по электронной почте или SMS-сообщением и вводит его в форму проверки.
Ваше приложение инициализирует код авторизации и поток регистрационных данных
Когда пользователь подтверждает свою личность, приложение немедленно инициализирует код авторизации и поток регистрационных данных с запросом Headless Login API.
Добавьте следующие заголовки в запрос авторизации.
| Заголовок | Обязательно? | Описание |
|---|---|---|
Auth-Request-Type
|
Да. | Указывает тип запроса, который должен быть отправлен в Salesforce. Для регистрации без заголовка это значение должно быть установлено на user-registration. |
Authorization
|
Да. | Базовый заголовок, который определяет запрос на регистрацию, чтобы Salesforce мог связать запрос с сохраненными данными пользователя. Необходимо добавить идентификатор запроса, предоставленный Salesforce, и ОТП, используемый для проверки подлинности пользователя. Добавьте эти значения друг к другу в формате |
Auth-Verification-Type
|
Обязательно, если вы указали метод проверки подлинности в первичном запросе на регистрацию. Значение этого заголовка должно соответствовать значению в параметре текста verificationmethod от запроса до конечной точки /services/auth/headless/init/registration. |
Метод, используемый для проверки подлинности пользователя. Salesforce поддерживает два значения для метода проверки: email и sms. |
Uvid-Hint
|
Нет. Если вы внедряете поток пользователя-гостя в приложение, вы можете по желанию использовать этот заголовок для передачи в маркер доступа на основе веб-маркера JSON (JWT), содержащий уникальный код посетителя (UVID), привязанный к удостоверению пользователя-гостя. Передавая UVID-файл в поток именованного пользователя, можно перенести контекстную информацию из сеанса пользователя-гостя, например, параметры cookie-файлов пользователя, в сеанс именованного пользователя. Вместо передачи маркера на основе JWT с UVID в верхнем колонтитуле можно также передать обычное значение UVID в тексте запроса. |
Маркер доступа на основе JWT, содержащий значение UVID, являющийся универсальным уникальным идентификатором (UUID) версии 4, созданным и управляемым полностью приложением. Чтобы получить маркер доступа с UVID, необходимо включить связанное приложение или приложение внешнего клиента для выдачи маркеров доступа на основе JWT и внедрения потока пользователей-гостей без заголовка в вашем приложении. |
Content-Type
|
Нет. Если вы используете Postman для создания и тестирования потока, он иногда добавляет этот заголовок. Проверьте корректность, проверив скрытые заголовки. | Данный параметр определяет формат запроса (например, application/x-www-form-urlencoded). |
Добавьте следующие параметры в текст запроса.
| Параметр | Обязательно? | Описание |
|---|---|---|
client_id
|
Да. | |
response_type
|
Да. | Тип предоставления OAuth 2.0, запрашиваемый связанным приложением или приложением внешнего клиента. Для кода авторизации и потока регистрационных данных значение должно code_credentials. |
redirect_uri
|
Да. | URL-адрес, куда пользователи перенаправляются после успешной проверки подлинности. URI-адрес переадресации должен соответствовать одному из значений в поле URL-адреса обратного вызова связанного приложения или приложения внешнего клиента. В противном случае утверждение не выполняется. Это значение должно быть зашифровано как URL-адрес. Для этого процесса можно использовать конечную точку эха https://MyExperienceCloudSite.my.site.com/services/oauth2/echo в качестве конечной точки обратного вызова. |
uvid_hint
|
Нет. Если вы внедряете поток пользователя-гостя в приложение, вы можете по желанию использовать этот параметр для передачи значения UVID, привязанного к личности пользователя-гостя, перенося контекстную информацию из сеанса пользователя-гостя в сеанс названного пользователя. Вместо передачи UVID в тексте запроса можно также передать его в маркере на основе JWT с UVID посредством заголовка |
Обычное значение UVID, являющееся UUID версии 4, созданным и управляемым полностью приложением. Чтобы получить UVID, необходимо включить связанное приложение или приложение внешнего клиента для выдачи маркеров доступа на основе JWT и внедрения потока пользователей-гостей без заголовка в вашем приложении. |
code_challenge
|
Только при использовании PKCE. Рекомендуется использовать PKCE, особенно для одностраничных приложений. | Обязательно при использовании расширения PKCE. Указывает хэш-значение SHA256 значения Этот параметр обязателен, если в запросе маркера указан
|
Ниже указан пример запроса к конечной точке авторизации. Данный пример включает PKCE.
POST /services/oauth2/authorize? HTTP 1.1
Host: MyExperienceCloudSiteName.my.site.com
Auth-Request-Type: user-registration
Auth-Verification-Type: email
Authorization: Basic <base64-encoded request ID:OTP>
reponse_type=code_credentials&
client_id=******&
redirect_uri=https://www.MyExperienceCloudSite.my.site.com/services/oauth2/echon&
code_challenge=Y29kZ*******
Salesforce проверяет запрос, извлекает данные пользователя и создает пользователя
Salesforce получает запрос авторизации и проверяет код запроса и ОТП. Salesforce использует эту информацию для извлечения данных пользователя в очереди и вызова средства обработки регистрации без заголовка, настроенного на сайте Experience Cloud. Обработчик Apex создает пользователя в Salesforce и связывает его с организацией.
Salesforce проверяет регистрационные данные и возвращает переадресацию 302 в конечную точку обратного вызова
Salesforce возвращает переадресацию HTTP 302 на готовый URL-адрес, содержащий код авторизации. Если поток происходит в обозревателе, переадресация 302 обрабатывается в обозревателе. Salesforce потом автоматически отправляет ответ переадресации на URL-адрес переадресации, который указывает на конечную точку обратного вызова /services/oauth2/echo в примерах кода ниже. Во время этого процесса обозреватель не перенаправляется - все происходит фоном.
Ниже указан пример URL-адреса, получаемого конечной точкой обратного эхо-вызова.
https://MyExperienceCloudSite.my.site.com/services/oauth2/echo?code=aPrxr*******%3D%3D&state=mystate&sfdc_community_url=https%3A%2F%2FMyExperienceCloudSite.my.site.com%&sfdc_community_id=0DBRXXXXXXXXXКонечная точка обратного вызова извлекает код и возвращает его в приложение
Конечная точка обратного вызова извлекает код авторизации и другие данные и отправляет эти сведения обратно в приложение. Ниже указан пример ответа JSON из конечной точки эха.
{"code":"aPrxr*******",
"sfdc_community_url":"https://MyExperienceCloudSite.my.site.com",
"sfdc_community_id":"0DBRXXXXXXXXX",
"state":"mystate"}Приложение получает ответ кода и выполняет обмен кодом
Обозреватель получает ответ кода. Ниже указан пример успешного ответа в журнале консоли обозревателя.
{"success":true,"state":"https://MyExperienceCloudSite.my.site.com/","sfdc_community_url":"https://MyExperienceCloudSite.my.site.com/vforcesite","sfdc_community_id":"0DBxxxxxxxxxxxx","errMsg":null,"code":"aPrxC1*******"}Обозреватель без заголовка запрашивает обмен кода на маркер доступа.
Во избежание открытия секрета пользователя обозревателю, необходимо отключить параметры «Требовать секрет для процесса веб-сервера» и «Требовать секрет для процесса проверки подлинности маркера обновления» в связанном приложении или приложении внешнего клиента. Если эти параметры отключены, секрет пользователя не обязателен в запросе на авторизацию. При возможности рекомендуем выполнить обмен кодами посредством серверного сервера. См. Headless Identity API: Код авторизации и поток регистрационных данных для частных клиентов.
Для запроса маркера доступа можно использовать только запрос POST — запросы GET не поддерживаются. Обязательных заголовков для этого запроса нет, но вы можете добавить заголовок Content-Type.
| Заголовок | Обязательно? | Описание |
|---|---|---|
Content-Type
|
Нет. Если вы используете Postman для создания и тестирования потока, он иногда добавляет этот заголовок. Проверьте корректность, проверив скрытые заголовки. | Данный параметр определяет формат запроса (например, application/x-www-form-urlencoded). |
Добавьте следующие параметры в текст запроса.
| Параметр | Обязательно? | Описание |
|---|---|---|
client_id
|
Да. | Ключ пользователя связанного приложения или приложения внешнего клиента. |
client_secret
|
Нет. | Секрет пользователя связанного приложения или приложения внешнего клиента. |
code
|
Да. | Сервер авторизации создает код авторизации, являющийся кратковременным маркером, и передает его клиенту после успешной проверки подлинности. Клиент отправляет код авторизации на сервер авторизации для получения маркера доступа и, по желанию, маркера обновления. |
code_verifier
|
Только при использовании PKCE. Рекомендуем всегда использовать PKCE при использовании этого потока для приложения на одной странице. | Указывает 128 байтов случайных данных с высокой энтропией, чтобы затруднить угадывание значения
|
format
|
Нет. | Ожидаемый формат ответа. Salesforce поддерживает следующие форматы.
|
grant_type
|
Да. | Тип проверки, которую может предоставить связанное приложение или приложение внешнего клиента для подтверждения безопасности посетителя. Для кода авторизации и потока регистрационных данных значение должно быть authorization_code. |
redirect_uri
|
Да. | URL-адрес, куда пользователи перенаправляются после успешной проверки подлинности. URI-адрес переадресации должен соответствовать одному из значений в поле URL-адреса обратного вызова связанного приложения или приложения внешнего клиента. В противном случае утверждение не выполняется. Для этого процесса можно использовать конечную точку эха https://MyExperienceCloudSite.my.site.com/services/oauth2/echo в качестве конечной точки обратного вызова. |
Ниже указан пример запроса маркера.
POST /services/oauth2/token? HTTP 1.1
Host: MyExperienceCloudSiteName.my.site.com
grant_type=authorization_code&
code=aPrxC1*******&
client_id=******&
redirect_uri=https://www.MyExperienceCloudSite.my.site.com//services/oauth2/echo&
code_verifier=Y29kZ*******
Salesforce предоставляет маркер доступа
После проверки регистрационных данных приложения Salesforce возвращает маркер доступа в обозреватель. Ниже указан пример ответа на маркер доступа в формате JSON.
{
"access_token":"*******************",
"sfdc_community_url":"https://MyExperienceCloudSiteName.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
|
Нет. | |
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 value, которые можно использовать для проверки того, что URL-адрес удостоверения не изменился с момента отправки сервером. |
sfdc_community_url
|
Да. | URL-адрес сайта Experience Cloud. |
sfdc_community_id
|
Да. | Код сайта Experience Cloud пользователя. |
state
|
Нет. | Состояние, запрошенное клиентом. Это значение добавляется только при добавлении параметра state в исходную строку запроса. |
token_type
|
Да. | Тип маркера Bearer, используемый для всех ответов, содержащих маркер доступа. |
Приложение обрабатывает ответ маркера и создает сеанс пользователя
Обозреватель сохраняет сведения из ответа маркера и создает сеанс пользователя. На этом этапе пользователь входит в систему, и ваше приложение вызывает конечную точку сведений о пользователе Salesforce для подтверждения успешного входа.
Пользователь зарегистрирован и выполняет действие в приложении
Пользователь теперь полностью зарегистрирован и вошедший. Он выполняет в вашем приложении действие, требующее доступа к данным Salesforce. Например, они нажимают кнопку для просмотра журнала бронирования, хранящегося в Salesforce.
Приложение выполняет проверенный вызов конечной точки Salesforce
Чтобы получить доступ к данным Salesforce пользователя, приложение использует маркер доступа для осуществления проверенного вызова защищенной конечной точки Salesforce, например, Salesforce API.
Доступ пользователя к данным Salesforce
Пользователь теперь имеет доступ к защищенным данным Salesforce в вашем приложении. Например, они могут просмотреть журнал бронирования. С точки зрения пользователя, весь процесс от входа до доступа к данным происходил без необходимости выхода из приложения.

