API de identidad desatendida: Flujo Código de autorización y credenciales para clientes privados
Para clientes privados, como aplicaciones web cliente-servidor, puede configurar el inicio de sesión desatendido para clientes y socios utilizando el flujo Código de autorización y credenciales, que se crea en el tipo de otorgamiento Código de autorización OAuth 2.0.
Ediciones necesarias
| Disponible en: Salesforce Classic y Lightning Experience |
| Disponible en: Enterprise Edition, Unlimited Edition y Developer Edition |
Con el flujo Código de autorización credenciales, usted controla la experiencia de inicio de sesión de cara al público en una aplicación externa. Llama a las API de Salesforce Headless Login de Salesforce a través de su sitio de Experience Cloud para controlar el trabajo de back-end de autenticación de usuarios y otorgar acceso a recursos de Salesforce protegidos. Con procesos de front-end y back-end separados, sus usuarios pueden iniciar sesión y acceder a datos de Salesforce sin salir de su aplicación. Para clientes privados, inicia el flujo en el navegador y completa el intercambio de códigos utilizando un controlador de devolución de llamada del lado del servidor para extraer el código de autorización e intercambiarlo por un token de acceso.
Antes de configurar este flujo, complete estos pasos.
- Complete los requisitos previos para Identidad desatendida.
- Integre su aplicación fuera de la plataforma con Salesforce utilizando una de estas opciones.
Debido a que gestiona Salesforce Customer Identity a través de sitios de Experience Cloud, puede configurar el flujo Código de autorización y credenciales solo para clientes y socios que utilizan un subdominio de sitio de Experience Cloud, como https://MyExperienceCloudSite.my.site.com. No puede configurar este flujo para empleados que acceden a la plataforma Salesforce con login.salesforce.com o una URL de inicio de sesión de Mi dominio específica de su organización, o para empleados que acceden a sitios de Experience Cloud.
Este es un caso de uso de ejemplo para el flujo Código de autorización y credenciales. Usted trabaja para una compañía de viajes que almacena datos de clientes en Salesforce. Creó una aplicación personalizada con una arquitectura cliente-servidor y desea que los usuarios tengan acceso a sus reservas de viajes pasadas desde su aplicación. También desea tener un control completo sobre la experiencia de inicio de sesión de modo que pueda alinearse con la marca de su compañía. De modo que configura su aplicación personalizada como una aplicación cliente externa o aplicación conectada y configura el flujo Código de autorización y credenciales.
De forma predeterminada, los usuarios ingresan su nombre de usuario para iniciar sesión. Para proporcionar a los usuarios más opciones, configure el descubrimiento de usuarios desatendidos. Por ejemplo, desarrolle un flujo donde los usuarios ingresen su dirección de email, número de teléfono o incluso un número de pedido. Consulte Inicio de sesión desatendido sin un nombre de usuario.
A continuación se ofrece una descripción general simplificada del flujo en acción.
- Su usuario final va a su aplicación personalizada, donde su formulario de inicio de sesión se muestra de forma nativa en la aplicación e ingresa su nombre de usuario y contraseña. O bien, si está utilizando el descubrimiento de usuarios desatendidos, ingresan un identificador como una dirección de email, un número de teléfono o un número de pedido, junto con su contraseña.
- Si está utilizando la extensión Proof Key for Code Exchange (PKCE), la aplicación genera valores utilizados para verificar el código de autorización. Si no está utilizando PKCE, su flujo omite este paso.
- Desde el navegador, su aplicación personalizada, a través de JavaScript, envía una código solicitud de autorización desatendida al extremo de autorización de la API de inicio de sesión desatendido de Salesforce en su sitio de Experience Cloud.
- Si está utilizando descubrimiento de usuarios desatendidos, su controlador Apex encuentra al usuario basándose en el identificador que utilizó para iniciar sesión. Si las credenciales de usuario son válidas y el usuario tiene una dirección de email o un número de teléfono verificados, el inicio de sesión continúa.
- La API de inicio de sesión desatendido de Salesforce valida las credenciales del usuario y devuelve un redireccionamiento 302 a una URL preconfigurada que contiene el código de autorización. El redireccionamiento 302 se procesa dentro del navegador, y la respuesta se entrega de forma desatendida a su controlador de devolución de llamadas preconfigurado en su servidor.
- El controlador de devolución de llamadas del lado del servidor extrae el código de autorización y otros parámetros de la respuesta de redireccionamiento 302. A continuación inicia el intercambio de códigos a través de una solicitud POST del lado del servidor al extremo de tokens del sitio de Experience Cloud.
- Desde el extremo de tokens, la API de inicio de sesión desatendido de Salesforce devuelve una respuesta de token de acceso al controlador de devolución de llamadas del lado del servidor.
- El controlador de devolución de llamadas del lado del servidor procesa la respuesta del token y devuelve el estado de inicio de sesión a la aplicación. Esta respuesta puede incluir detalles de sesión, información de usuario y posiblemente el token de acceso, dependiendo del diseño y el estado de seguridad de su aplicación.
- El navegador recibe la respuesta iniciada y crea la sesión del usuario.
- El usuario ahora inició sesión y realiza una acción en su aplicación personalizada que inicia una solicitud de datos de Salesforce. Por ejemplo, hace clic en un botón para acceder a su historial de reserva de viajes, que se almacena en el sitio de Experience Cloud de Salesforce.
- Su aplicación personalizada realiza una solicitud autenticada a un extremo de Salesforce protegido, como una API de Salesforce.
- El cliente ahora puede acceder a sus datos protegidos en su aplicación personalizada. Por ejemplo, puede ver su historial de reserva de viajes.
Un componente clave de este flujo es JavaScript del lado del cliente que solicita autorización y recibe la respuesta del token de acceso. Este ejemplo utiliza una aplicación conectada.
var clientId = '<Connected App Client ID>';
var baseURL = '<Experience Cloud Domain>';
var redirectURL = '<Experience Cloud Domain>/services/apexrest/code/exchange';
function getUserInfo(accessToken, userInfoBaseURL) {
var client = new XMLHttpRequest();
client.open("GET", userInfoBaseURL + "/services/oauth2/userinfo", true);
client.setRequestHeader("Content-Type", "application/json");
client.setRequestHeader("Authorization", "Bearer " + accessToken);
client.send();
client.onreadystatechange = function() {
if(this.readyState == 3) {
response = JSON.parse(client.response);
response.access_token = accessToken;
document.getElementById("json").textContent = JSON.stringify(response, undefined, 2);
document.getElementById("results").style.display="block";
}
}
}
function startLogin() {
var username = document.getElementById('user_name').value;
var password = document.getElementById('password').value;
var encodedUNP = btoa(username + ':' + password);
var client = new XMLHttpRequest();
client.open("POST", baseURL + "/services/oauth2/authorize", true);
client.setRequestHeader("Auth-Request-Type", "Named-User");
client.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
client.setRequestHeader("Authorization", "Basic " + encodedUNP);
client.send("response_type=code_credentials&client_id=" + clientId + "&redirect_uri=" + redirectURL);
client.onreadystatechange = function() {
if(this.readyState == 3) {
console.log("here");
console.log(client.response);
response = JSON.parse(client.response);
if (response.success) {
getUserInfo(response.access_token, baseURL);
}
}
}
return false;
}
Otro componente clave es el controlador de devolución de llamada del lado del servidor, que extrae el código y lo intercambia por un token de acceso. Este es un ejemplo de controlador de devolución de llamada utilizando una clase de Apex expuesta como un recurso de REST.
@RestResource(urlMapping='/code/exchange')
global class CodeExchangeAPI {
@HttpGet
global static ExchangeResponse doGet() {
RestRequest req = RestContext.request;
RestResponse res = RestContext.response;
try {
res.statusCode = 200;
String accessToken = doCodeExchange(req.params.get('code'), req.params.get('sfdc_community_url'));
if (accessToken != null) {
return new ExchangeResponse(accessToken, req.params.get('state'));
} else {
return new ExchangeResponse('Could not parse auth code redirect URI');
}
} catch (Exception e) {
res.statusCode = 500;
return new ExchangeResponse('Could not parse auth code redirect URI');
}
}
global static String doCodeExchange(String code, String communityURL) {
String clientId = 'Connected App Client ID';
String redirectURL = '<Experience Cloud Domain>/services/apexrest/code/exchange';
String clientSecret = null;
Http h = new Http();
HttpRequest req = new HttpRequest();
req.setMethod('POST');
//Create Code Exchange URL
String url = communityURL + '/services/oauth2/token';
req.setEndpoint(url);
//Post Body
String body = 'grant_type=authorization_code';
body = body + '&client_id=' + clientId;
body = body + '&code=' + code;
if (clientSecret != null) {
body = body + '&client_secret=' + clientSecret;
}
body = body + '&redirect_uri=' + redirectURL;
//URL encode Post Body
String encodedBody = EncodingUtil.urlEncode(body, 'UTF-8');
// Set request body
req.setBody(body);
//Add Headers
req.setHeader('Content-Type','application/x-www-form-urlencoded');
//Send Token Request
HttpResponse res = h.send(req);
if (res.getStatusCode() == 200) {
//Extract Token from Response
Map<String,Object> tokenResponseMap = (Map<String, Object>) JSON.deserializeUntyped(res.getBody());
return (String)tokenResponseMap.get('access_token');
} else {
return null;
}
}
// Response Wrapper
global class ExchangeResponse {
String access_token;
String state;
String errMsg;
Boolean success;
public ExchangeResponse(String access_token, String state) {
this.access_token = access_token;
this.state = state;
this.success = true;
}
public ExchangeResponse(String errMsg) {
this.success = false;
this.errMsg = this.errMsg;
}
}
}
Este es un desglose detallado de este flujo.
El usuario final abre la aplicación externa e inicia sesión
Su usuario abre su aplicación externa para iniciar sesión. En su aplicación, su formulario de inicio de sesión aparece mostrando campos de nombre de usuario y contraseña y un botón de inicio de sesión. Salesforce no proporciona este formulario de inicio de sesión. Su aspecto y comportamiento dependen de usted. Su usuario ingresa su nombre de usuario y contraseña y hace clic en el botón de inicio de sesión.
La aplicación externa genera valores code_verifier y code_challenge (opcional)
Si está utilizando la extensión Proof Key for Code Exchange (PKCE), la aplicación genera valores utilizados para verificar el código de autorización.
Como mejor práctica de seguridad, recomendamos encarecidamente el uso de la extensión PKCE cuando implemente el flujo Código de autorización y credenciales. Para obtener más información sobre PKCE, consulte la especificación RFC 7636: Clave de prueba para el intercambio de códigos por clientes públicos de OAuth proporcionado por Internet Engineering Task Force (IETF).
La especificación PKCE definida en RFC 7636 también incluye un parámetro code_challenge_method opcional que puede enviar en la solicitud de autorización. Salesforce ignora cualquier valor que envíe en este parámetro y establece de forma predeterminada SHA256.
Cuando implemente este flujo empleando un controlador de devolución de llamadas del lado del servidor, active los parámetros Requerir secreto para flujo de servidor web y Requerir secreto para flujo de token de actualización en su aplicación cliente externa o aplicación conectada. Con estos parámetros activados, asegúrese de que su controlador de devolución de llamada mantiene el secreto de consumidor seguro.
La aplicación externa realiza una solicitud desatendida de un código de autorización
Desde el navegador, la aplicación externa envía una solicitud de autorización desatendida al extremo de autorización de la API de inicio de sesión desatendido en su sitio de Experience Cloud utilizando Java asíncrono y XML (AJAX). Si no está utilizando descubrimiento de usuarios desatendidos, puede utilizar el método GET o POST para esta solicitud. Si está utilizando descubrimiento de usuarios desatendidos, solo se admiten solicitudes POST.
En este ejemplo de JavaScript del lado del cliente, la función startLogin envía de forma desatendida una solicitud POST al extremo de autorización.
function startLogin() {
var username = document.getElementById('user_name').value;
var password = document.getElementById('password').value;
var encodedUNP = btoa(username + ':' + password);
var client = new XMLHttpRequest();
client.open("POST", baseURL + "/services/oauth2/authorize", true);
client.setRequestHeader("Auth-Request-Type", "Named-User");
client.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
client.setRequestHeader("Authorization", "Basic " + encodedUNP);
client.send("response_type=code_credentials&client_id=" + clientId + "&redirect_uri=" + redirectURL);
client.onreadystatechange = function() {
if(this.readyState == 3) {
console.log("here");
console.log(client.response);
response = JSON.parse(client.response);
if (response.success) {
getUserInfo(response.access_token, baseURL);
}
}
}
return false;
} Para solicitudes GET y POST, debe incluir el encabezado Auth-Request-Type: Named-User:
Opcionalmente, para conectar este flujo al flujo de invitados desatendido, puede incluir un encabezado Uvid-Hint con un token de acceso basado en JWT que contiene un valor UVID, que es un identificador exclusivo universal (UUID) de versión 4 que genera y gestiona completamente por su aplicación. Para obtener un token de acceso con un UVID, debe activar su aplicación cliente externa o aplicación conectada para emitir tokens de acceso basados en JWT e implementar el flujo de invitados desatendido en su aplicación.
Si implementa el flujo de usuarios invitados en su aplicación, puede opcionalmente utilizar este encabezado para pasar en un token de acceso basado en Token web de JSON (JWT) que contenga un Id. de visitante exclusivo (UVID) vinculado a la identidad de un usuario invitado. Al pasar el UVID a un flujo de usuario nombrado, puede llevar información contextual desde una sesión de usuario invitado, como las preferencias de cookies del usuario, a una sesión de usuario nombrada.
También puede incluir el valor UVID sin formato en el cuerpo de la solicitud.
Dependiendo del método que utilice y de su configuración, a veces se requiere incluir un encabezado de autorización de tipo Básico con las credenciales del usuario. Si está utilizando una solicitud GET, debe enviar las credenciales del usuario (su nombre de usuario y contraseña, adjuntadas entre sí y con codificación Base64) en un encabezado de autorización. A continuación se incluye un ejemplo de solicitud.
GET /services/oauth2/authorize? HTTP 1.1
Host: MyDomainName.my.site.com
Auth-Request-Type: Named-User
Authorization: Basic <encoded username:password>
response_type=code_credentials&
redirect_uri=https://www.MyDomainName.my.site.com/services/apexrest/code/exchange&
client_id=******&
code_challenge=Y29kZ*******Si está utilizando una solicitud POST, puede incluir las credenciales de usuario con codificación Base64 en un encabezado de autorización o puede ponerlas en el cuerpo de la solicitud.
Si está utilizando descubrimiento de usuarios desatendidos, no envía un nombre de usuario y una contraseña. En su lugar, envía un identificador en el parámetro login_hint, datos personalizados opcionales y una contraseña. Incluya el identificador, los datos personalizados y la contraseña en el cuerpo de una solicitud POST. No utilice una solicitud GET.
Para los métodos GET y POST, incluya estos parámetros obligatorios en el cuerpo de la solicitud de autorización.
| Parámetro | Descripción |
|---|---|
client_id |
La clave de consumidor de la aplicación cliente externa o la aplicación conectada. |
redirect_uri |
La URL donde se redirige a los usuarios después de una autenticación satisfactoria. El URI de redireccionamiento debe coincidir con uno de los valores del campo URL de devolución de llamada de la aplicación conectada o la aplicación cliente externa. De lo contrario, la aprobación falla. Para clientes privados, utilice |
response_type |
El tipo de otorgamiento de OAuth 2.0 que solicita la aplicación. Para el flujo Código de autorización y credenciales, el valor debe ser code_credentials. |
También puede incluir estos parámetros opcionales en la solicitud de autorización.
| Parámetro | Descripción |
|---|---|
code_challenge |
Obligatorio si se utiliza la extensión PKCE. Especifica el valor de hash SHA256 del valor Este parámetro se requiere si se especifica
|
scope |
Los permisos que definen el tipo de recursos protegidos a los que la aplicación conectada o la aplicación cliente externa puede acceder. Usted asigna ámbitos a una aplicación conectada cuando la construye, y se incluyen con los tokens de OAuth durante el flujo de autorización. Si no incluye este parámetro, se solicitan todos los ámbitos asignados a la aplicación. Para restringir aún más los ámbitos, pase un subconjunto de los ámbitos asignados en este parámetro. Para consultar los parámetros válidos, vea Ámbitos de OAuth. |
state |
Cualquier estado que solicite el servicio web externo a la URL de devolución de llamadas. Este valor debe tener codificación de URL. |
uvid_hint |
Un valor En lugar de pasar el UVID en el cuerpo de la solicitud, también puede pasarla en un token basado en JWT con un UVID a través del encabezado |
login_hint |
Obligatorio si utiliza descubrimiento de usuario desatendido. Un identificador que su controlador de Apex utiliza para buscar la cuenta de Salesforce de un usuario. Por ejemplo, recopile el número de pedido de un usuario en su aplicación y páselo en el parámetro login_hint. Enviamos el valor login_hint directamente a su controlador de Apex. |
customdata |
Obligatorio si está utilizando un controlador de descubrimiento de usuarios desatendido que gestiona datos personalizados. Por ejemplo, si también está utilizando el controlador con un flujo de inicio de sesión que gestiona datos personalizados, debe pasar datos personalizados en el flujo de contraseña olvidada. Cadena JSON que contiene datos adicionales que su controlador de descubrimiento desatendido de Apex utiliza para buscar la cuenta de Salesforce de un usuario. Por ejemplo, pase información acerca de la configuración regional del usuario. |
(Opcional) El controlador de descubrimiento de usuarios desatendido encuentra el usuario
Si está utilizando un controlador de descubrimiento de usuarios desatendido, el controlador toma los parámetros login_hint y customdata y encuentra el usuario asociado. El controlador confirma que la dirección de email o el número de teléfono del usuario está verificado.
Para obtener un controlador de ejemplo, consulte Auth.HeadlessUserDiscoveryHandler.
Salesforce valida las credenciales y devuelve un redireccionamiento 302
La API de inicio de sesión desatendido de Salesforce valida las credenciales del usuario y la aplicación y devuelve un redireccionamiento HTTP 302 a una URL preconfigurada que contiene el código de autorización. El redireccionamiento 302 se procesa dentro del navegador, y la respuesta se entrega de forma desatendida a la URL de redireccionamiento, que es un extremo de devolución de llamada preconfigurado en su servidor. Esta es una URL de ejemplo.
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
El controlador de devolución de llamadas extrae el código y realiza el intercambio de códigos
El controlador de devolución de llamadas del lado del servidor extrae el código de autorización y otros parámetros de la de redireccionamiento 302. A continuación inicia el intercambio de códigos enviando una solicitud POST sin encabezado al extremo del token.
En el controlador de devolución de llamadas REST de Apex de ejemplo, el método doGet extrae el código.
@RestResource(urlMapping='/code/exchange')
global class CodeExchangeAPI {
@HttpGet
global static ExchangeResponse doGet() {
RestRequest req = RestContext.request;
RestResponse res = RestContext.response;
try {
res.statusCode = 200;
String accessToken = doCodeExchange(req.params.get('code'), req.params.get('sfdc_community_url'));
if (accessToken != null) {
return new ExchangeResponse(accessToken, req.params.get('state'));
} else {
return new ExchangeResponse('Could not parse auth code redirect URI');
}
} catch (Exception e) {
res.statusCode = 500;
return new ExchangeResponse('Could not parse auth code redirect URI');
}
}
A continuación, el método doCodeExchange envía la solicitud de token.
global static String doCodeExchange(String code, String communityURL) {
String clientId = 'Connected App Client ID';
String redirectURL = '<Experience Cloud Domain>/services/apexrest/code/exchange';
String clientSecret = '<ConnecedApp Secret>';
Http h = new Http();
HttpRequest req = new HttpRequest();
req.setMethod('POST');
//Create Code Exchange URL
String url = communityURL + '/services/oauth2/token';
req.setEndpoint(url);
//Post Body
String body = 'grant_type=authorization_code';
body = body + '&client_id=' + clientId;
body = body + '&code=' + code;
if (clientSecret != null) {
body = body + '&client_secret=' + clientSecret;
}
body = body + '&redirect_uri=' + redirectURL;
//URL encode Post Body
String encodedBody = EncodingUtil.urlEncode(body, 'UTF-8');
// Set request body
req.setBody(body);
//Add Headers
req.setHeader('Content-Type','application/x-www-form-urlencoded');
//Send Token Request
HttpResponse res = h.send(req);
if (res.getStatusCode() == 200) {
//Extract Token from Response
Map<String,Object> tokenResponseMap = (Map<String, Object>) JSON.deserializeUntyped(res.getBody());
return (String)tokenResponseMap.get('access_token');
} else {
return null;
}
}
Para la solicitud de token de acceso, solo puede utilizar una solicitud POST: no se admiten las solicitudes GET. Debe incluir un encabezado Content-Type. Incluya estos parámetros obligatorios en el cuerpo de la solicitud.
| Parámetro | Descripción |
|---|---|
client_id |
La clave de consumidor de la aplicación cliente externa o la aplicación conectada. |
client_secret |
El secreto de consumidor de la aplicación cliente externa o la aplicación cliente externa. |
code |
El servidor de autorización crea un código de autorización, que es un token efímero que pasa al cliente después de una autenticación correcta. El cliente envía el código de autorización al servidor de autorización para obtener un token de acceso y, opcionalmente, un token de actualización. |
grant_type |
El tipo de validación que la aplicación puede proporcionar para probar que es un visitante seguro. Para el flujo Código de autorización y credenciales, el valor debe ser authorization_code. |
redirect_uri |
La URL donde se redirige a los usuarios después de una autenticación satisfactoria. redirect_URI debe coincidir con uno de los valores del campo URL de devolución de llamada. De lo contrario, la aprobación falla. Este valor debe tener codificación de URL. Para clientes privados, utilice |
También puede incluir estos parámetros opcionales en la solicitud de token.
| Parámetro | Descripción |
|---|---|
code_verifier |
Obligatorio si se utiliza la extensión PKCE. Especifica 128 bytes de datos aleatorios con alta entropía para hacer que sea difícil adivinar el valor de
|
format |
El formato esperado de la respuesta. Salesforce admite estos formatos.
|
En el código de Apex, el paquete de respuesta establece las variables que se envían de nuevo a la aplicación, incluyendo indicadores de éxito y error.
// Response Wrapper
global class ExchangeResponse {
String access_token;
String state;
String errMsg;
Boolean success;
public ExchangeResponse(String access_token, String state) {
this.access_token = access_token;
this.state = state;
this.success = true;
}
public ExchangeResponse(String errMsg) {
this.success = false;
this.errMsg = this.errMsg;
}
}Salesforce otorga un token de acceso
La API de inicio de sesión desatendido de Salesforce recibe la solicitud de token y devuelve una respuesta de token de acceso al controlador de devolución de llamadas del lado del servidor. A continuación se incluye un ejemplo de respuesta de token de acceso en formato 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"
}La respuesta del token de acceso contiene estos parámetros obligatorios.
| Parámetro | Descripción |
|---|---|
access_token
|
Token de OAuth que la aplicación cliente externa o la aplicación conectada utiliza para solicitar el acceso a un recurso protegido en nombre de la aplicación cliente. Pueden acompañar permisos adicionales en la forma de ámbitos al token de acceso. |
id
|
Una URL de identidad que se puede utilizar para identificar al usuario y para consultar con el fin de obtener más información acerca del usuario. Consulte URL de identidad. |
instance_url
|
Una URL que indica la instancia de la organización del usuario. Por ejemplo: https://yourInstance.salesforce.com/. |
issued_at
|
Marca de hora de la creación de la firma, expresada como el número de milisegundos desde 1970-01-01T0:0:0Z UTC. |
signature
|
Firma HMAC-SHA256 con codificación Base64 firmada con client_secret. La firma puede incluir el Id. concatenado y issued_at value, que puede utilizar para verificar que la URL de identidad no cambió desde que la envió el servidor. |
sfdc_community_url
|
La URL del sitio de Experience Cloud. |
sfdc_community_id
|
El Id. de sitio de Experience Cloud del usuario. |
token_type
|
Un tipo de token Bearer, que se utiliza para todas las respuestas que influyen un token de acceso. |
La respuesta del token de acceso también puede incluir estos parámetros.
| Parámetro | Descripción |
|---|---|
id_token
|
Una estructura de datos firmada que contiene atributos de usuario autenticados, incluyendo un identificador único para el usuario y una marca de tiempo que indica el momento en que se emite el token. También identifica la aplicación del cliente solicitante. Consulte Especificaciones de OpenID Connect. Este parámetro se devuelve si el parámetro scope incluye |
refresh_token
|
Token obtenido del servidor web, usuario-agente o flujo de token de aplicación híbrida. Se trata de un valor secreto. Tome las medidas apropiadas para protegerlo. Este parámetro solo se devuelve si su aplicación cliente externa o aplicación conectada se configura con un ámbito refresh_token. |
state
|
El estado solicitado por el cliente. Este valor solo se incluye si el parámetro state está incluido en la cadena de consulta original. |
El controlador de devolución de llamadas procesa la respuesta de tokens y devuelve parámetros a la aplicación
El controlador de devolución de llamadas del lado del servidor obtiene el token de acceso desde la respuesta. En el ejemplo de código Apex del lado del servidor, este proceso se realiza en el método doCodeExchange como parte del envío de la solicitud de token.
//Send Token Request
HttpResponse res = h.send(req);
if (res.getStatusCode() == 200) {
//Extract Token from Response
Map<String,Object> tokenResponseMap = (Map<String, Object>) JSON.deserializeUntyped(res.getBody());
return (String)tokenResponseMap.get('access_token');
} else {
return null;
}
El controlador de devolución de llamadas del lado del servidor devuelve el token de acceso y el estado al navegador, junto con datos de usuario, tokens y datos de sesión. En nuestro ejemplo, el contenedor de respuesta devuelve el token de acceso a la aplicación. Como mejor práctica, recomendamos que configure su servidor para almacenar el token de acceso, cree una sesión para la aplicación y devuelva la sesión a la aplicación, en vez de devolver el token de acceso. Como desarrollador, está al completo del control de la creación de la sesión, el almacenamiento del token de acceso y la gestión del estado de inicio de sesión, de modo que su implementación específica depende de usted.
A continuación se incluye un ejemplo de una respuesta satisfactoria en el registro de la consola del navegador.
{"success":true,"state":"https://MyExperienceCloudSite.my.site.com/","errMsg":null,"access_token":"00*******"}La aplicación procesa la respuesta del token y crea la sesión de usuario
La aplicación recibe la respuesta del token, la procesa y crea la sesión de usuario. En el ejemplo de JavaScript del lado del cliente, la respuesta se procesa a través de la función getUserInfo.
function getUserInfo(accessToken, userInfoBaseURL) {
var client = new XMLHttpRequest();
client.open("GET", userInfoBaseURL + "/services/oauth2/userinfo", true);
client.setRequestHeader("Content-Type", "application/json");
client.setRequestHeader("Authorization", "Bearer " + accessToken);
client.send();
client.onreadystatechange = function() {
if(this.readyState == 3) {
response = JSON.parse(client.response);
response.access_token = accessToken;
document.getElementById("json").textContent = JSON.stringify(response, undefined, 2);
document.getElementById("results").style.display="block";
}
}
}
El usuario final inicia sesión y realiza una acción en la aplicación
El usuario final ahora inició sesión. Realiza una acción en su aplicación que requiere acceso a datos de Salesforce. Por ejemplo, hace clic en un botón para ver su historial de reserva de viajes, que se almacena en Salesforce.
La aplicación externa realiza una llamada autenticada a un extremo de Salesforce
Para acceder a los datos de Salesforce del usuario, su aplicación utiliza el token de acceso para realizar una llamada autenticada a un extremo de Salesforce protegido, como una API de Salesforce.
El usuario final puede acceder a datos de Salesforce
El usuario puede ahora acceder a datos de Salesforce protegidos en su aplicación. Por ejemplo, puede ver su historial de reserva de viajes. Desde la perspectiva del usuario final, el proceso completo desde el inicio de sesión hasta el acceso a sus datos se produjo sin requerir nunca salir de la aplicación.

