Estamos experimentando un problema de autenticación OAuth2 con el conector estándar de Salesforce en n8n Cloud.
Entorno
n8n Cloud
Salesforce Sandbox
Credencial OAuth2 estándar de Salesforce
Aplicación conectada de n8n instalada
Se permite que los usuarios se autoricen a sí mismos
Las restricciones de IP se han relajado
Comportamiento
La autenticación con un usuario de Salesforce habilitado para SSO funciona correctamente.
La autenticación con usuarios de Salesforce que usan nombre de usuario/contraseña falla después de un inicio de sesión y autorización exitosos.
El historial de inicio de sesión de Salesforce muestra la autenticación como exitosa y el código de autorización se devuelve a n8n. El intercambio de token posterior falla con:
invalid_grant
authentication failure
Comportamiento esperado
Tanto los usuarios de Salesforce con SSO como los que usan nombre de usuario/contraseña deberían poder completar el flujo OAuth2.
¿Podrías verificar por qué el intercambio de token falla específicamente para usuarios que no usan SSO en una Salesforce Sandbox?
Si te autenticas a través de OAuth2 y experimentas fallos de conexión o autorización, los perfiles de usuario de Salesforce a menudo carecen de un permiso requerido
En Salesforce, navega a Setup > busca Profiles.
Selecciona el perfil de usuario que intenta conectarse.
En Administrative Permissions, habilita Approve Connected Apps for Non-Admins (o Approve apps connected not installed).
Guarda tus cambios.
Además, OAuth2 requiere crear una External Client App (o Connected App heredada) en Salesforce con los ámbitos Full access (full) y Perform requests at any time (refresh_token, offline_access)
Para Connected App, asegúrate de que las políticas de OAuth en Salesforce permitan el perfil del usuario en Manage Profiles o Manage Permission Sets
El usuario afectado tiene permisos de Administrador del Sistema de Salesforce. La Connected App de n8n está instalada, All users may self-authorize está habilitado y las restricciones de IP se han relajado.
La misma integración de Salesforce OAuth de n8n funciona con un usuario habilitado para SSO. Con un usuario de nombre de usuario/contraseña, la autenticación y autorización de Salesforce se completan exitosamente e el Historial de Inicio de Sesión de Salesforce muestra Remote Access Client: Success. Se devuelve un código de autorización a n8n.
El fallo ocurre solo durante el intercambio de token posterior: invalid_grant / authentication failure
Por lo tanto, esto no parece ser un problema de aprobación de Connected App o permisos de perfil. ¿Podría verificar el intercambio de token realizado por n8n y si hay alguna diferencia en la gestión de usuarios de Sandbox autenticados mediante nombre de usuario/contraseña frente a SSO?
El error probablemente se debe a una discrepancia de endpoint de entorno durante el protocolo de negociación OAuth. Aunque la fase de autorización tiene éxito porque las credenciales son válidas, el intercambio de token posterior falla con invalid_grant porque n8n probablemente intenta intercambiar el código de autorización en el endpoint incorrecto (por ejemplo, usando la URL de Producción login.salesforce.com para un código generado a través de la URL de Sandbox test.salesforce.com).
Esta discrepancia se manifiesta específicamente para usuarios de nombre de usuario/contraseña porque dependen de la URL base proporcionada por el cliente. En contraste, los usuarios de SSO se enrutan a través de un Proveedor de Identidad externo (IdP) que define explícitamente la ruta de autenticación, enmascarando efectivamente cualquier discrepancia entre los endpoints de autorización e intercambio.
Para resolver esto, verifica que la configuración “Environment” en las credenciales de Salesforce de n8n coincida exactamente con la organización destino (Producción vs. Sandbox). Si el problema persiste a pesar de la configuración correcta, comprueba las políticas de MyDomain restrictivas en Salesforce que pueden impedir que usuarios no SSO completen el intercambio de token a través de los endpoints genéricos de inicio de sesión de Salesforce.
Gracias, esto coincide con nuestras observaciones.
La credencial ya está configurada para Sandbox, y estamos utilizando la solución alternativa de dominio personalizado. Hemos verificado que la solicitud de autorización se enruta a través del endpoint correcto de Sandbox/MyDomain de Salesforce.
El flujo es:
Autorización de Sandbox/MyDomain → exitosa
Autenticación de usuario/contraseña → exitosa
Historial de inicio de sesión de Salesforce → Remote Access Client: Success
Código de autorización devuelto a n8n → exitoso
Intercambio de tokens → invalid_grant / authentication failure
¿Podrías verificar en el lado de n8n cuál es el endpoint de tokens que se utiliza realmente para el intercambio de códigos?
Específicamente, nos gustaría descartar que el código de autorización generado a través del endpoint de Sandbox/MyDomain se intercambie posteriormente contra login.salesforce.com u otro endpoint que no coincida.
Como el intercambio de tokens se realiza del lado del servidor por n8n Cloud, no podemos verificarlo desde nuestro lado.
¡Hola @mevaco_chris! ¡Bienvenido!
Para responder directamente sobre el endpoint: la credencial OAuth2 de Salesforce deriva la URL del token del tipo de entorno y nada más, por lo que con Sandbox seleccionado n8n publica el código en https://test.salesforce.com/services/oauth2/token cada vez. Es un campo oculto sin opción de anulación, por lo que un código emitido a través del inicio de sesión del dominio personalizado en tu host MyDomain no puede canjearse y regresa como invalid_grant.
Cambia el nodo de Salesforce a OAuth2 JWT y establece el campo My Domain URL en la credencial JWT a tu dominio sandbox: https://company--sandbox.sandbox.my.salesforce.com
Ese campo anula tanto la audiencia de aserción como el endpoint del token, por lo que el intercambio se realiza en el mismo host que emitió la concesión. También elimina el inicio de sesión interactivo por completo, por lo que los usuarios de SSO y nombre de usuario/contraseña terminan en la misma ruta. Necesitarás una aplicación cliente externa con JWT Bearer Flow habilitado y un certificado cargado.
Gracias por la aclaración. Esto explica el error invalid_grant.
Sin embargo, cambiar a JWT parece más un workaround que una solución al problema subyacente.
Si la credencial OAuth2 de Salesforce siempre utiliza test.salesforce.com como endpoint del token para entornos Sandbox, mientras que la autenticación a través de un Sandbox MyDomain es requerida/soportada, la credencial OAuth2 estándar actualmente no puede completar este flujo correctamente.
Pasar a JWT requeriría que introduzcamos y mantengamos una configuración de autenticación separada que incluya una aplicación cliente externa, certificado y ciclo de vida de clave privada solo para trabajar alrededor de esta limitación.
¿Se considera esta una limitación conocida/bug de la credencial OAuth2 de Salesforce? Si es así, ¿existe un issue existente o una corrección planeada para permitir que el endpoint del token también utilice el MyDomain configurado?
Nuestra preferencia sería utilizar la credencial OAuth2 de Salesforce estándar según lo previsto en lugar de cambiar la arquitectura de autenticación como workaround.
invalid_grant suena como un posible problema de alcance, lo cual es extraño ya que enviamos full y refresh_token. Por curiosidad, ¿tienes PKCE habilitado en tu aplicación de Salesforce?