Loading
Identificar sus usuarios y gestionar el acceso
Índice de materias
Seleccionar filtros

          No hay resultados
          No hay resultados
          Estas son algunas sugerencias de búsqueda

          Compruebe la ortografía de sus palabras clave.
          Utilice términos de búsqueda más generales.
          Seleccione menos filtros para ampliar su búsqueda.

          Buscar en toda la Ayuda de Salesforce
          API de identidad desatendida: Flujo Código de autorización y credenciales para clientes públicos

          API de identidad desatendida: Flujo Código de autorización y credenciales para clientes públicos

          Para clientes públicos, como aplicaciones de una sola página o aplicaciones móviles, puede configurar el inicio de sesión desatendido para clientes y socios utilizando el flujo Código de autorización y credenciales. Este flujo está construido sobre el tipo de otorgamiento Código de autorización de OAuth 2.0. 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 aplicaciones de una única página, utiliza un extremo de devolución de llamadas del lado del servidor para extraer el código de autorización y realiza el intercambio de códigos desde el navegador a través de JavaScript del lado del cliente.

          Ediciones necesarias

          Disponible en: Salesforce Classic y Lightning Experience
          Disponible en: Enterprise Edition, Unlimited Edition y Developer Edition
          Advertencia
          Advertencia Por seguridad, recomendamos encarecidamente que utilice en todo momento la variación de cliente-servidor de este flujo siempre que pueda. La variación de cliente-servidor le proporciona protección adicional para el secreto de consumidor durante el intercambio de códigos. Para obtener más información, consulte API de Identidad desatendida: Flujo Código de autorización y credenciales para clientes privados.
          Nota
          Nota Aquí, aplicación externa hace referencia a cualquier aplicación externa a Salesforce.

          Este contenido de ayuda describe cómo configurar el flujo y cómo funciona. Para configurar una implementación de ejemplo de extremo a extremo, consulte la Guía de implementación de Identidad desatendida.

          Antes de configurar este flujo, complete estos pasos.

          Debido a que gestiona Salesforce Customer Identity a través de sitios de Experience Cloud, puede configurar el flujo del "Código de autorización y credenciales" solo para clientes y socios que utilicen 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 la 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 de una sola página 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 en el que los usuarios especifiquen 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.

          Diagrama mostrando el flujo Código de autorización y credenciales para aplicaciones de una sola página
          • 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 la detección de usuarios desatendida, especifican un identificador como una dirección de email, un número de teléfono o un número de pedido, junto con la 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. Recomendamos encarecidamente que siempre utilice PKCE cuando implemente este flujo para aplicaciones de una única página.
          • Desde el navegador, su aplicación personalizada, a través de JavaScript, envía una 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 HTTP 302 a una URL preconfigurada que contiene el código de autorización. Salesforce envía automáticamente la respuesta de redireccionamiento a la URL de redireccionamiento, que apunta al controlador de devolución de llamadas del lado del servidor.
          • El controlador de devolución de llamadas del lado del servidor extrae el código de autorización desde el redireccionamiento 302 y lo devuelve a la aplicación.
          • El JavaScript del lado del cliente recibe los parámetros de URL de redireccionamiento e inicia el intercambio de códigos con una solicitud POST en el extremo del token.
          • La API de inicio de sesión desatendido de Salesforce valida la solicitud y devuelve una respuesta de token de acceso a la aplicación.
          • JavaScript del lado del cliente en la aplicación procesa el token de acceso 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 usuario 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 el código JavaScript del lado del cliente que envía la solicitud de autorización, realiza el intercambio de códigos y procesa el token de acceso. Este es un ejemplo de JavaScript que utiliza una aplicación conectada.

          var clientId = "<Connected App Client ID>";
          var baseURL = "<Experience Cloud Domain>";
          var redirectURL = "<Experience Cloud Domain>/services/apexrest/code/extraction"
                
          // Performs the code exchange
          function doCodeExchange(authorizeResponse) {
             //Perform Code Exchange
             //Get Access Token
             var client = new XMLHttpRequest();
             client.open("POST", authorizeResponse.sfdc_community_url + "/services/oauth2/token", true);
             client.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
             client.send("code=" + authorizeResponse.code + "&grant_type=authorization_code&client_id=" + clientId + "&redirect_uri=" + redirectURL);
             client.onreadystatechange = function() {
                 if(this.readyState == 3) {
                     response = JSON.parse(client.response);
                     getUserInfo(response.access_token, response.sfdc_community_url)
                 }
             }
          }
          
          // Gets User Info
          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";
                 }
             }
          }
          
          //Starts the Login Process
          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) {
                     response = JSON.parse(client.response);
                     doCodeExchange(response);
                 }
             }
             return false;
          }    
          

          Otro componente clave es el controlador de devolución de llamada del lado del servidor que extrae el código desde el redireccionamiento 302 y lo devuelve a la aplicación. En este ejemplo, el gestor es una clase de Apex expuesta como un extremo de REST público y está activado Uso compartido de recursos de origen cruzado (CORS) para ofrecer protección de secuencias de comandos de sitio cruzadas. Para simplificar el desarrollo, utilice el extremo de eco de OAuth 2.0 para obtener el código de autorización.

          @RestResource(urlMapping='/code/extraction')
          global class CodeExtractorAPI {
            
             @HttpGet
             global static CodeResponse doGet() {
                 RestRequest req = RestContext.request;
                 RestResponse res = RestContext.response;
                 try {
                     res.statusCode = 200;
                     return new CodeResponse(req.params.get('code'), req.params.get('sfdc_community_url'), req.params.get('sfdc_community_id'), req.params.get('state'));
                 } catch (Exception e) {
                     res.statusCode = 500;
                     return new CodeResponse('Could not parse auth code redirect URI');
                 }
                
             }
            
             // Response Wrapper
             global class CodeResponse {
                 String code;
                 String sfdc_community_url;
                 String sfdc_community_id;
                 String state;
                 Boolean success;
                 String errMsg;
                
                 public CodeResponse(String code, String sfdc_community_url, String sfdc_community_id, String state) {
                     this.code = code;
                     this.sfdc_community_url = sfdc_community_url;
                     this.sfdc_community_id = sfdc_community_id;
                     this.state = state;
                     this.success = true;
                 }
                
                  public CodeResponse(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 de 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.

          Su flujo incluye este paso solo si está utilizando la extensión Proof Key for Code Exchange (PKCE). 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, especialmente para aplicaciones de una sola página. 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 de la extensió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 no tendrá en cuenta cualquier valor que se envíe en este parámetro, y establecerá SHA256 de forma predeterminada.

          La aplicación externa realiza una solicitud desatendida de un código de autorización

          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. Si no está utilizando la detección de usuarios desatendida, utilice el método GET o POST para esta solicitud. Si está utilizando la detección de usuarios desatendida, solo se admiten solicitudes POST.

          En este fragmento de JavaScript en la parte del cliente, la solicitud de autorización se envía como parte de la función startLogin. Después de recuperar las credenciales del usuario, la función crea y envía una solicitud POST, incluyendo una dirección URL de redireccionamiento que apunta al controlador de devolución de llamada en la parte del servidor.

          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:

          Dependiendo del método que utilice y de su configuración de aplicación cliente externa o aplicación conectada, 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.MyExperienceCloudSite.my.site.com/services/apexrest/code/extraction&
          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 la detección de usuarios desatendida, 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.

          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 contenga un valor UVID, que es un identificador exclusivo universal (UUID) de versión 4 generado y completamente gestionado 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.

          Nota
          Nota Si tiene la configuración Requerir credenciales de usuario en el cuerpo POST para el flujo Código de autorización y credenciales activada en su aplicación cliente externa o aplicación conectada, puede enviar las credenciales de usuario solo en el cuerpo de solicitud. Con esta configuración activada, no puede utilizar el método GET para la solicitud del código de autorización. Solo puede utilizar el método POST.

          Para ambos métodos GET y POST, incluya estos parámetros obligatorios en el cuerpo de la solicitud de autorización.

          ParámetroDescripción
          client_id La clave de consumidor de la aplicación cliente externa o de 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 en la aplicación cliente externa o la aplicación conectada. De lo contrario, la aprobación falla.

          Para clientes públicos, el URI de redireccionamiento debe apuntar a un extremo que pueda procesar el redireccionamiento 302 desde Salesforce. Para simplificar el desarrollo, utilice el extremo de eco de OAuth, como https://MyExperienceCloudSite.my.site.com/services/oauth2/echo.

          Estos ejemplos utilizan un extremo de extracción de código REST Apex. Por ejemplo, <Experience Cloud Domain>/services/apexrest/code/extraction.

          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ámetroDescripción
          code_challenge

          Obligatorio si se utiliza la extensión PKCE. Especifica el valor de hash SHA256 del valor code_verifier en la solicitud de token. Establezca este parámetro para ayudar a evitar ataques de intercepción de códigos de autorización. El valor debe estar codificado en base64url, como se define en https://tools.ietf.org/html/rfc4648#section-5.

          Este parámetro es necesario si se especifica un verificador code_verifier en la solicitud de token.

          • Si se proporciona un valor del code_challenge en la solicitud de autorización y se proporciona un valor de code_verifier en la solicitud de token, Salesforce compara los code_challenge con el code_verifier. Si code_challenge no es válido o no coincide, el inicio de sesión fallará, con el código de error invalid_request.
          • Si en la solicitud de autorización se proporciona el valor de code_challenge, pero en la solicitud de token no se proporciona un valor de code_verifier, el inicio de sesión falla con el código de error invalid_grant.
          scope Los permisos que definen el tipo de recursos protegidos a los que la aplicación puede acceder. Cuando construye una aplicación cliente externa o aplicación conectada, le asigna ámbitos, 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 de UVID sin formato, que es un UUID de versión 4 generado y completamente gestionado por su aplicación. Para obtener un identificador 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. También puede utilizar este parámetro para pasar un valor de UVID vinculado a la identidad de un usuario invitado, trasladando información contextual desde una sesión de usuario invitado a una sesión de usuario con nombre indicado.

          En lugar de pasar el identificador UVID en el cuerpo de la solicitud, también puede lo pasar en un token basado en JWT con un UVID a través del encabezado UVID-Hint.

          login_hint Obligatorio si utiliza la detección de usuarios desatendida. 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. El valor login_hint se envía directamente a su controlador Apex.
          customdata

          Es obligatorio si está utilizando un controlador de detección de usuarios desatendida 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 los datos personalizados en el flujo Contraseña olvidada.

          Cadena JSON que contiene datos adicionales que su controlador de descubrimiento desatendido de Apex utiliza para buscar la cuenta de Salesforce del usuario. Por ejemplo, pase información sobre la configuración regional del usuario.

          (Opcional) El controlador de detección de usuarios desatendida encuentra el usuario

          Si está utilizando un controlador de detección de usuarios desatendida, el controlador acepta 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 al controlador de devolución de llamadas del lado del servidor

          La API de inicio de sesión desatendido de Salesforce recibe la solicitud de autorización. Valida las credenciales del usuario y devuelve un redireccionamiento HTTP 302 a una URL preconfigurada que contiene el código de autorización. Salesforce envía automáticamente la respuesta de redireccionamiento a la dirección URL de redireccionamiento, que apunta al controlador de devolución de llamadas en la parte del servidor, en el extremo /code/extraction en este ejemplo. Durante este proceso, el navegador no se redirige, todo sucede en segundo plano.

          El controlador de devolución de llamadas del lado del servidor extrae el código y lo devuelve a la aplicación

          El controlador de devolución de llamadas del lado del servidor extrae el código de autorización y otros datos. El controlador de devolución de llamadas de Apex de ejemplo utiliza el método doGet para extraer el código, la dirección URL del sitio de Experience Cloud, el Id. del sitio y el estado desde el redireccionamiento 302.

          @RestResource(urlMapping='/code/extraction')
          global class CodeExtractorAPI {
            
             @HttpGet
             global static CodeResponse doGet() {
                 RestRequest req = RestContext.request;
                 RestResponse res = RestContext.response;
                 try {
                     res.statusCode = 200;
                     return new CodeResponse(req.params.get('code'), req.params.get('sfdc_community_url'), req.params.get('sfdc_community_id'), req.params.get('state'));
                 } catch (Exception e) {
                     res.statusCode = 500;
                     return new CodeResponse('Could not parse auth code redirect URI');
                 }
                
             }
          The response wrapper sets the variables for the code response, including success and error indicators.
          // Response Wrapper
             global class CodeResponse {
                 String code;
                 String sfdc_community_url;
                 String sfdc_community_id;
                 String state;
                 Boolean success;
                 String errMsg;
                
                 public CodeResponse(String code, String sfdc_community_url, String sfdc_community_id, String state) {
                     this.code = code;
                     this.sfdc_community_url = sfdc_community_url;
                     this.sfdc_community_id = sfdc_community_id;
                     this.state = state;
                     this.success = true;
                 }
                
                  public CodeResponse(String errMsg) {
                     this.success = false;
                     this.errMsg = this.errMsg;
                 }       
             }
          

          Este es otro ejemplo de extracción de código utilizando PHP: Controlador previo de hipertexto (PHP)

          <?
          header('Access-Control-Allow-Headers: *');
          header('Access-Control-Allow-Origin: *');
          header('Content-Type: application/json; charset=utf-8');
          $out = [];
          foreach ($_GET as $name => $value) {
             $out[$name] = $value;
          }
          echo json_encode($out);
          ?>
          

          Después de extraer el código, el controlador de devolución de llamadas lo envía de nuevo al navegador.

          La aplicación recibe la respuesta del código y realiza el intercambio de códigos

          El navegador recibe la respuesta de código. 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/","sfdc_community_url":"https://MyExperienceCloudSite.my.site.com/vforcesite","sfdc_community_id":"0DBxxxxxxxxxxxx","errMsg":null,"code":"aPrxC1*******"}

          El navegador solicita desatendidamente que intercambie el código para un token de acceso. En el ejemplo de JavaScript en la parte del cliente, la función doCodeExchange envía el código en una solicitud POST al extremo de tokens de Experience Cloud.

          Para evitar exponer el secreto de consumidor al navegador, debe desactivar 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 esta configuración desactivada, no se requiere el secreto de consumidor en la solicitud de autorización. Si es posible, recomendamos que realice el intercambio de códigos utilizando un backend de servidor. Consulte las API de Identidad desatendida: Flujo Código de autorización y credenciales para clientes privados.

          var clientId = "<Connected App Client ID>";
          var baseURL = "<Experience Cloud Domain>";
          var redirectURL = "<Experience Cloud Domain>/services/apexrest/code/extraction"
                
          // Performs the code exchange
          function doCodeExchange(authorizeResponse) {
             //Perform Code Exchange
             //Get Access Token
             var client = new XMLHttpRequest();
             client.open("POST", authorizeResponse.sfdc_community_url + "/services/oauth2/token", true);
             client.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
             client.send("code=" + authorizeResponse.code + "&grant_type=authorization_code&client_id=" + clientId + "&redirect_uri=" + redirectURL);
             client.onreadystatechange = function() {
                 if(this.readyState == 3) {
                     response = JSON.parse(client.response);
                     getUserInfo(response.access_token, response.sfdc_community_url)
                 }
             }
          } 
          

          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ámetroDescripción
          client_id La clave de consumidor de la aplicación cliente externa o de la aplicación conectada.
          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. El URI de redireccionamiento debe coincidir con uno de los valores del campo URL de devolución de llamada en la aplicación cliente externa o la aplicación conectada. De lo contrario, la aprobación falla.

          Para clientes públicos, el URI de redireccionamiento debe apuntar a un extremo que pueda procesar el redireccionamiento 302 desde Salesforce. Para simplificar el desarrollo, utilice el extremo de eco de OAuth, como https://MyExperienceCloudSite.my.site.com/services/oauth2/echo.

          Estos ejemplos utilizan un extremo de extracción de código REST Apex. Por ejemplo, <Experience Cloud Domain>/services/apexrest/code/extraction.

          También puede incluir estos parámetros opcionales en la solicitud de token.

          ParámetroDescripción
          client_secret El secreto de consumidor de la aplicación cliente externa o la aplicación conectada.
          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 code. Establezca este parámetro para ayudar a evitar ataques de intercepción de códigos de autorización. El valor debe estar codificado en base64url, como se define en https://tools.ietf.org/html/rfc4648#section-5.

          • Si se proporciona el valor de code_verifier en la solicitud de token y se proporciona un valor de code_challenge en la solicitud de autorización, Salesforce compara code_verifier con code_challenge. Si code_verifier no es válido o no coincide, el inicio de sesión fallará, con el código de error invalid_grant.
          • Si se proporciona el valor de code_verifier en la solicitud de token pero no se proporciona un valor de code_challenge en la solicitud de autorización, el inicio de sesión fallará, con el código de error invalid_grant.
          format

          El formato esperado de la respuesta. Salesforce admite estos formatos.

          • urlencoded
          • json (predeterminado)
          • xml

          Salesforce otorga un token de acceso

          Después de validar las credenciales de la aplicación, la API de inicio de sesión desatendido de Salesforce devuelve un token de acceso al navegador. 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 una aplicación cliente externa o 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 dirección 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 dirección URL de identidad no ha cambiado desde que la envió el servidor.
          sfdc_community_url La dirección 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 incluyen 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.

          Si el parámetro scope incluye openid, se devuelve este parámetro.

          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 se devuelve únicamente 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 ya estaba en la cadena de consulta original.

          La aplicación procesa la respuesta del token y crea la sesión de usuario

          El navegador almacena la información de la respuesta del token y crea la sesión de usuario. En este punto, el usuario ha iniciado sesión y el JavaScript del lado del cliente llama al extremo de información de usuario de Salesforce para confirmar que el inicio de sesión se realizó correctamente, como se muestra en este fragmento.

          Nota
          Nota Asegúrese de completar una revisión de seguridad completa de el almacenamiento de su token de acceso. Nunca almacene el token de acceso en el almacenamiento local del navegador y evite almacenarlo en una cookie si es posible.
          // Gets User Info
          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.

          Nota
          Nota Cuando configura su aplicación cliente externa o aplicación conectada para el flujo Código de autorización y credenciales, establece la política Usuarios permitidos en Usuarios aprobados por el administrador se han autorizado previamente y configura qué perfiles o conjuntos de permisos pueden acceder a la aplicación. Con esta política, los usuarios acceden a la aplicación sin autorizarla, de modo que no obtienen una pantalla de autorización solicitándoles permitir a la aplicación acceder a sus datos.

          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.

           
          Cargando
          Salesforce Help | Article