OAuth 2.0 para aplicaciones de primera parte: Flujo de nombre de usuario-contraseƱa desatendido para clientes privados
Para configurar el inicio de sesión de nombre de usuario-contraseƱa para una aplicación sin plataforma desarrollada por su compaƱĆa, utilice este flujo de inicio de sesión de nombre de usuario-contraseƱa desatendido, que implementa el protocolo estĆ”ndar borrador de OAuth 2.0 para aplicaciones de primera parte. Con este flujo, puede controlar completamente la experiencia de inicio de sesión de front-end en su aplicación de primera parte mientras Salesforce controla el trabajo de backend de autenticación de usuarios y otorgamiento de acceso a recursos protegidos. Este flujo solo es compatible con clientes privados, como aplicaciones cliente-servidor, y solo es compatible con usuarios externos
Ediciones necesarias
| Disponible en: Salesforce Classic y Lightning Experience |
| Disponible en: Enterprise Edition, Unlimited Edition y Developer Edition |
Para configurar el inicio de sesión de nombre de usuario-contraseña desatendido para un cliente privado, también puede utilizar esta versión del flujo Código de autorización y credenciales, que implementa las API de identidad desatendida. Ambos flujos realizan el mismo caso de uso: inicio de sesión de nombre de usuario-contraseña desatendido para una aplicación fuera de Salesforce Platform. Pero hay algunas diferencias clave a tener en cuenta.
| OAuth para aplicaciones propias | API de identidad desatendida |
|---|---|
| Admitido solo para clientes privados. | Admitido para clientes pĆŗblicos y privados. |
| Se ajusta al proyecto de protocolo de OAuth 2.0 para aplicaciones de primera parte. | Flujo de Salesforce patentado que estƔ construido sobre el estƔndar de OAuth 2.0. |
| Solo se admite para el marco de trabajo de la aplicación cliente externa Salesforce. Del mismo modo, la única forma de configurar parÔmetros de aplicación cliente externa para este flujo es a través de la API de metadatos. | Compatible con la aplicación cliente externa Salesforce y los marcos de trabajo de aplicaciones conectadas. |
| Por seguridad, este flujo siempre requiere un JWT de certificado de cliente. Salesforce utiliza el JWT de certificado de cliente para validar que la aplicación fue desarrollada por su compaƱĆa. | Por seguridad, requiere autenticación o reCAPTCHA, pero no un JWT de certificado de cliente. |
Antes de configurar este flujo, complete estos pasos.
- Complete los requisitos previos para Identidad desatendida.
- Generar un JWT de certificación de cliente.
- Configure una aplicación cliente externa de Salesforce.
- Configure ajustes de Experience Cloud.
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 muestra una descripción general del funcionamiento del flujo.
- Paso 1: Un usuario final va a su aplicación de primera parte e inicia sesión a través de 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.
- Paso 2: Su aplicación de primera parte acuña un JWT de certificado de cliente y genera parÔmetros para la extensión Proof Key for Code Exchange (PKCE).
- Paso 3: Para obtener un código de autorización, su aplicación de primera parte envĆa una solicitud POST desatendida al extremo services/oauth2/v1/authorization_challenge en su sitio de Experience Cloud. La solicitud incluye un JWT de certificado de cliente junto con las credenciales del usuario.
- Paso 4: Para confirmar que su aplicación externa envió la solicitud, Salesforce valida el JWT de certificado de cliente y luego valida los otros parÔmetros.
- (Opcional) 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.
- Paso 5: Si la solicitud se realiza correctamente, Salesforce devuelve un código de autorización.
- Paso 6: Para intercambiar el código por un token de acceso, su aplicación de primera parte envĆa una solicitud al extremo /services/oauth2/token.
- Paso 7: Salesforce devuelve una respuesta de token que contiene el token de acceso.
- Paso 8: Su aplicación de primera parte procesa el token de acceso y crea la sesión del usuario.
- Paso 9: El usuario final ahora inició sesión y realiza una acción en su aplicación que requiere acceso a un recurso de Salesforce protegido.
- Paso 10: Su aplicación de primera parte realiza una llamada autenticada a una API de Salesforce.
- Paso 11: El usuario ahora puede acceder a sus datos de Salesforce en su aplicación de primera parte.
Paso 1: El usuario final abre la aplicación de primera parte e inicia sesión
Un usuario final abre su aplicación de primera parte con la intención de 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.
Paso 2: La aplicación de primera parte acuña un JWT de certificado de cliente y genera valores de code_verifier y code_challenge
La aplicación acuña un JWT de certificado de cliente.
La aplicación también genera valores para los parÔmetros PKCE utilizados para verificar el código de autorización.
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.
Paso 3: La aplicación de primera parte solicita desatendidamente un código de autorización
Desde el navegador, su aplicación envĆa las credenciales del usuario, junto con otros parĆ”metros, al extremo services/oauth2/v1/authorization_challenge en su sitio de Experience Cloud a travĆ©s de una solicitud POST desatendida.
No hay encabezados obligatorios para esta solicitud. Opcionalmente, para conectar este flujo con el flujo de invitados desatendido, puede incluir un encabezado Uvid-Hint con un token de acceso basado en JWT que contiene un valor de Id. de visitante exclusivo (UVID).
| Encabezado | ¿Obligatorio? | Descripción |
|---|---|---|
Uvid-Hint
|
No. 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 JWT que contenga un UVID vinculado a la identidad de un usuario invitado. Al pasar el En lugar de pasar un token basado en JWT 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 su aplicación genera y gestiona completamente. Para obtener un token de acceso con 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. |
Incluya estos parƔmetros en el cuerpo de la solicitud.
| ParÔmetro | ¿Obligatorio? | Descripción |
|---|---|---|
code_challenge
|
Obligatorio si requerĆa PKCE para su aplicación cliente externa. Para que las funciones de seguridad de este flujo funcionen correctamente, recomendamos encarecidamente que siempre requiera PKCE. | Especifica el valor de hash SHA256 del valor Si se proporciona Si |
username
|
SĆ. | El nombre de usuario que el usuario envió a su formulario de inicio de sesión. |
client_id
|
SĆ. | La clave de consumidor de la aplicación cliente externa. |
password
|
SĆ. | La contraseƱa que el usuario envió a su formulario de inicio de sesión. |
client_assertion
|
SĆ. | El JWT de certificado de cliente que generó, firmado por el certificado configurado para su aplicación cliente externa. |
recaptcha
|
Obligatorio si se le aplican estas condiciones:
|
Un token cifrado emitido por la API de reCAPTCHA de Google cuando un usuario completa un reto de reCAPTCHA. |
recaptchaevent
|
Obligatorio si se le aplican estas condiciones:
|
Un objeto JSON que contiene estos subparƔmetros.
Para obtener mÔs información, consulte la documentación de reCAPTCHA de Google. |
scope
|
No. | Permisos que definen el tipo de recursos protegidos a los que puede acceder la aplicación cliente externa. Usted asigna Ômbitos a la aplicación cliente externa cuando la construye, y se incluyen con los tokens de OAuth durante el flujo de autorización. Utilice este parÔmetro para solicitar un subconjunto de los Ômbitos asignados a su aplicación cliente externa. Si no incluye este parÔmetro, se solicitan todos los Ômbitos asignados a la aplicación. |
uvid_hint
|
No. Si implementa el flujo de usuario invitado en su aplicación, puede utilizar opcionalmente este parÔmetro para pasar en un valor En lugar de pasar el |
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 estÔ utilizando un controlador de Apex de descubrimiento de usuarios 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. De lo contrario, es opcional pero puede ser útil para ayudar a su gestor a encontrar el usuario. |
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. |
A continuación se incluye un ejemplo de solicitud al extremo de reto de autorización.
POST /services/oauth2/v1/authorization_challenge? HTTP 1.1
Host: MyExperienceCloudSite.my.site.com
username=janice.edwards@example.com&
password=*****&
client_assertion=******&
recaptcha=********&
scope=profile&
code_challenge=********
Paso 4: Salesforce valida la solicitud
Salesforce intenta primero validar el JWT de certificado de cliente validando que la firma pasada en el parÔmetro client_asssertion coincide con la firma para el certificado configurado para la aplicación cliente externa.
Si el JWT de certificado de cliente no es vÔlido, Salesforce devuelve un error invalid_attestation y debe volver a enviar la solicitud con todos los parÔmetros que envió originalmente. A continuación se incluye un ejemplo de respuesta de error.
HTTP/1.1 403 Forbidden
Content-Type: application/json
Cache-Control: no-store
{
"error": "invalid_attestation",
"error_code": "client_attestation_failed"
}
Si el JWT del certificado de cliente es vĆ”lido, pero hay otros problemas con la solicitud, Salesforce devuelve una respuesta de error especificando quĆ© falla con la solicitud. A continuación se muestra un ejemplo de respuesta que se devuelve si el usuario envĆa un nombre de usuario o una contraseƱa incorrectos.
HTTP/1.1 403 Forbidden
Content-Type: application/json
Cache-Control: no-store
{
"error": "authorization_required",
"auth_session": "uY29tL2F1d*****",
"error_code": "invalid_credentials"
}La respuesta incluye un parÔmetro auth_session que permanece vÔlido durante 5 minutos después de su emisión. Durante el periodo de tiempo en el que auth_session es vÔlida, puede utilizarla para volver a enviar la solicitud. En las versiones corregidas que vuelva a enviar, incluya solo los valores corregidos para los parÔmetros que provocaron el fallo de la solicitud. También debe volver a enviar password con cada solicitud porque Salesforce no la almacena. Pero para otros parÔmetros, si no provocaron el fallo de la solicitud, puede dejarlos fuera. Salesforce ya sabe que envió estos parÔmetros porque estÔn vinculados a auth_session.
auth_session, pero puede volver a enviar la solicitud sin ellos a no ser que hayan causado el fallo de la solicitud.Estos son algunos ejemplos de escenarios de error comunes. Esta lista no es exhaustiva.
- El usuario envió el nombre de usuario o la contraseña incorrectos. Vuelva a enviar la solicitud solo con
username,passwordyauth_session. - El token de reCAPTCHA era incorrecto. Vuelva a enviar la solicitud solo con el token de reCAPTCHA,
password,yauth_session.
Transcurridos 5 minutos desde que se emitió la sesión de autenticación, ya no funciona y obtiene un error auth_session_invalid. En ese caso, vuelva a enviar la solicitud completa con todos los parÔmetros que incluyó originalmente.
(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.
Paso 5: Salesforce devuelve un código de autorización
Cuando su solicitud al extremo de reto de autorización se realiza correctamente (ya sea en el primer intento o después de varios reintentos con auth_session), Salesforce devuelve un código de autorización. Este es un ejemplo de una respuesta correcta del código de autorización.
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
{
"authorization_code": "uY29tL2F1d******"
}Paso 6: Su aplicación intercambia el código de autorización por un token de acceso
DespuĆ©s de obtener el código de autorización, su aplicación envĆa una solicitud al extremo services/oauth2/token.
Esta solicitud no tiene encabezados. Incluya estos parƔmetros en el cuerpo de la solicitud.
| ParÔmetro | ¿Obligatorio? | Descripción |
|---|---|---|
code
|
SĆ. | 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. |
client_id
|
SĆ. | La clave de consumidor de la aplicación cliente externa. |
client_secret
|
SĆ. | El secreto de consumidor de la aplicación cliente externa. En este flujo, actĆŗa como una contraseƱa que la aplicación utiliza para acceder a Salesforce. |
redirect_uri
|
SĆ. | 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 la aplicación cliente externa. De lo contrario, la aprobación falla. Este valor debe tener codificación de URL. |
grant_type
|
SĆ. | El tipo de validación que la aplicación puede proporcionar para probar que es un visitante seguro. Para este flujo, el valor debe ser authorization_code. |
code_verifier
|
Obligatorio si requerĆa PKCE para su aplicación cliente externa. Para que las funciones de seguridad de este flujo funcionen correctamente, recomendamos encarecidamente que siempre requiera PKCE. | Especifica 128 bytes de datos aleatorios con alta entropĆa para hacer que intentar determinar el valor del código sea difĆcil. Establezca este parĆ”metro para ayudar a evitar ataques de intercepción de códigos de autorización. El valor debe estar codificado con base64url como se define en https://datatracker.ietf.org/doc/html/rfc4648#section-5. Si existe un valor Si el valor |
A continuación se incluye una solicitud de token de ejemplo.
POST services/oauth2/token? HTTP 1.1
Host: MyExperienceCloudSite.my.site.com
code=********&
client_id=**********&
client_secret=*********&
redirect_uri=<callback_URL>&
grant_type=authorization_code&
code_verifier=*******Paso 7: Salesforce otorga un token de acceso
Después de validar las credenciales de la aplicación. Salesforce devuelve un token de acceso. 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.
| ParÔmetro | ¿Obligatorio? | Descripción |
|---|---|---|
access_token
|
SĆ. | Token de OAuth que una aplicación cliente externa 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
|
SĆ. | 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. |
id_token
|
No. | 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 solicitante. Consulte Especificaciones de OpenID Connect. |
instance_url
|
SĆ. | Una URL que indica la instancia de la organización del usuario. Por ejemplo, https://yourInstance.salesforce.com/. |
issued_at
|
SĆ. | Una marca de hora de la creación de la firma, expresada como el nĆŗmero de milisegundos desde 1970-01-01T0:0:0Z UTC. |
refresh_token
|
No. | 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. |
signature
|
SĆ. | Firma HMAC-SHA256 con codificación Base64 firmada con client_secret. La firma puede incluir el Id. concatenado y el valor issued_at, que puede utilizar para verificar que la URL de identidad no cambió desde que la envió el servidor. |
sfdc_community_url
|
SĆ. | La URL del sitio de Experience Cloud. |
sfdc_community_id
|
SĆ. | El Id. de sitio de Experience Cloud del usuario. |
state
|
No. | El estado solicitado por el cliente. Este valor solo se incluye si el parƔmetro state estƔ incluido en la cadena de consulta original. |
token_type
|
SĆ. | Un tipo de token Bearer, que se utiliza para todas las respuestas que influyen un token de acceso. |
Paso 8: La aplicación crea la sesión del usuario
La aplicación recibe la respuesta del token de acceso y crea la sesión del usuario.
Paso 9: El usuario inicia sesión y realiza una acción en la aplicación
El usuario final ahora tiene su sesión iniciada y 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 pedidos, que se almacena en Salesforce.
Paso 10: La aplicación 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.
Paso 11: El usuario 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 pedidos. Desde la perspectiva del usuario, 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.

