La mayoría de los proyectos de Salesforce requieren Callouts para integrarse e invocar servicios en sistemas externos. Habitualmente estos Callouts, requieren de código Apex, el cual, puede volverse costoso, voluminoso y engorroso de mantener si desconocemos las Named Credentials.
Retos en el uso de Callouts
Pero la codificación de una llamada a un Web Service, supone ciertos retos:
- Si el servicio requiere autenticación, ¿Cómo evitamos divulgar las credenciales a un equipo desarrollo que puede cambiar regularmente? (Esto supone un reto y quizás un problema legal cuando estas credenciales permiten el acceso a datos sensibles)
- Si el sistema destino, el que ofrece el servicio, tiene distintos endpoints en función del entorno (DES, INT,…): ¿Cómo podemos invocar el servicio en varios entornos sin duplicar/modificar el código ni provocar retrabajos?
- Si cada usuario debe utilizar unas credenciales distintas, ¿Debo almacenar estas credenciales y añadir código Apex para su utilización?
- Además será necesario almacenar todas las credenciales en el mismo lugar para que sean accesibles, con lo que seguramente acabaré haciendo públicas unas credenciales que quiero mantener privadas (punto anterior).
- Si el servicio destino utiliza diferentes mecanismos de autenticación, o cambian a lo largo de la vida de nuestro proyecto, por ejemplo de Basic Authentication a oAuth2:
- ¿Debemos modificar nuestro código y provocar retrabajo?
- Si el servicio destino ofrece autenticación oAuth2:
- ¿No existe un mecanismo para evitar, el gestionar todo el diálogo y los tokens entre los sistemas?
La respuesta a estos retos es Named Credentials, una funcionalidad nativa en Salesforce, disponible a partir de Spring ’15.

Ventajas asociadas a las Named Credentials
- Permite que el código Apex para los Callouts contenga las direcciones de los endpoints, evitando su hardcoding, y además, no requiere de uso de otros mecanismos como global settings, etc.
- Esto comporta que la gestión de los endpoints en diferentes ubicaciones del sistema destino (DES, INT, PRE, PRO, etc.) se realice sin ningún cambio en nuestro código Apex
- Análogamente sucede con las credenciales, ya que nos permite la gestión de credenciales, fuera de nuestro código Apex, sin necesidad de usar otros mecanismos, tanto si la autenticación es Basic Authentication ó OAuth2.
- Permite limitar que usuarios pueden invocar estos servicios, y además, podemos indicar credenciales únicas para cada usuario. Esto comporta por ejemplo, que el sistema destino ofrezca diferentes niveles de servicio (costes) según el usuario/perfil.
- Permite el uso de un certificado, para que el tráfico entre Salesforce y el sistema destino sea cifrado, definido también por configuración en nuestra ORG.
Por tanto: el uso de Named Credentials, reduce el volumen de código Apex necesario y el impacto en nuestros despliegues, permitiendo la gestión de los parámetros que pueden cambiar, en elementos de configuración y de manera externa al código, que permanece inmutable independientemente de la autenticación usada.
Ejemplos reales de Named Credentials de menos a más
Veamos varios ejemplos de uso de Named Credentials, partiendo del caso más simple al más complejo. Para ello, utilizamos una aplicación Java (Spring Boot) desplegada en Heroku, que ofrece 2 endpoints:
- https://echowebservice.herokuapp.com/HolaConAuth: endpoint configurado para Basic Auth (username/password)
- https://echowebservice.herokuapp.com/HolaSinAuth: no requiere autenticación
Ambos servicios, retornan las cabeceras HTTP recibidas en las peticiones (las generadas por Salesforce para invocar el servicio). De esta manera podemos evaluar, que invocaciones realiza Salesforce.
Todo el código está disponible en este repo de Bitbucket (https://bitbucket.org/estevegraells/forcegraells-namedcredentials). Gracias a Spring Boot, en pocas líneas de código conseguimos exponer estos servicios.
En Salesforce he creado 3 objetos:
- Visualforce para la invocación de los servicios
- Un Controller para gestionar las peticiones de la VF
- Una clase tipo helper donde se realizan las llamadas a los servicios
1: Uso de Named Credentials sin autenticación
Este es el ejemplo más simple, pero ya podemos observar varias ventajas de las Named Credentials.
A continuación se muestra la configuración, donde los campos son auto-explicativos.

La parte de código Apex relevante es la siguiente, donde se observa que:
- el código no hace referencia a un endpoint concreto
- si el endpoint cambiara, el código seguiría siendo el mismo

En el resultado obtenido, que son las cabeceras HTTP generadas por Salesforce no hay autenticación, dado que así lo hemos configurado y solo aparecen cabeceras de información de la petición:

2: Uso de Named Credentials con autenticación
Cuando el endpoint a invocar requiere autenticación, las Named Credentials, ofrecen 2 opciones:
- Named Principal: implica que las credenciales de autenticación serán las mismas para todas las invocaciones a realizar
- Per user: implica que cada usuario tendrá sus propias credenciales de autenticación, bajo su Profile de Salesforce

2.1: Uso de Named Credentials con autenticación Named Principal
Cuando seleccionamos Named Principal, decidimos que todas las invocaciones se realizarán con las mismas credenciales, ya sea mediante Username/Password o mediante oAuth2:
La configuración para el caso de autenticación con Username y Password es muy simple:

Las 3 últimas opciones, indican a Salesforce:
- Que genere la cabecera estándar de Basic Authorization (ahorrándonos así el tener que calcular el B64, crear la cabecera e incluirla)
- Permitir el uso de los campos Username, Password, etc., en las cabeceras HTTP,por parte del código Apex
- Análogamente para el Body del mensaje
Las 2 últimas opciones permiten construir Headers y Body ad-hoc, para aquellos endpoints que no implementan Basic Auth estándar sino con adaptaciones.
Además podemos usar un certificado, habiéndolo definido previamente, para el cifrado de las comunicaciones.
El código Apex requerido es idéntico al anterior, aunque esta vez, la petición se realizará mediante autenticación Basic Auth (username y password):

El resultado es:

2.2: Uso de Named Credentials con autenticación por Usuario
Si la invocación del servicio debe diferenciarse por usuario, es decir, cuando se realice la invocación al servicio, serán las credenciales definidas para ese usuario las que usará Salesforce para autenticarse, deben seguirse los siguientes pasos de configuración:
- Al definir la Named Credential, indicar la opción Per User
- Introducir en ese apartado unos valores cualesquiera para Username y Password, ya que no se utilizan en la invocación
- Crear un Permission Set o modificar el Profile para asignar la capacidad de usar esa Named Credential
- Realizar un Assigment de ese Permission Set a los usuarios
- Para cada uno de los usuarios, acceder a sus Settings, y definir en el apartado Authentication Settings for External Systems, las credenciales que usará ese usuario, cuando se use la Named Credential creada
Las siguientes capturas de pantalla, clarifican la configuración de los pasos importantes:


El código Apex de invocación vuelve a ser idéntico:

Cuyo resultado es:

3: Uso de Named Credentials con oAuth
El caso más complejo y donde las Named Credentials vuelven a simplificar nuestros desarrollos y mantenimiento es en el caso de uso que los servicios requieran autenticación oAuth.
El diálogo para la autenticación mediante oAuth no es simple, dado que se requiere la gestión de tokens, la intervención de un servidor tercero:
Usando Named Credentials nuestro código queda aislado de todas estas llamadas de «infraestructura», y únicamente con la configuración del oAuth Provider en Salesforce, conseguiremos el uso de este mecanismo de autenticación.
Conclusiones
Resumiendo las Named Credentials:
- aportan un nivel de abstracción sobre el uso de los Callouts (aislando el código de los cambios de los endpoints)
- permiten una gestión por configuración tanto de los endpoints como de las credenciales
- evitan la divulgación de credenciales
- permite autenticación «global» ó granular por usuario, sin modificaciones sobre el código
- podemos cambiar o combinar diferentes métodos de autenticación, por ejemplo en entornos distintos, sin modificar el código
Por su simplicidad, es una característica muy a tener en cuenta en el uso de Callouts.
Enlaces interesantes
- Documentación oficial de Named Credentials: https://developer.salesforce.com/docs/atlas.en-us.210.0.apexcode.meta/apexcode/apex_callouts_named_credentials.htm
- Artículos interesantes:
- Definición del Permission Set para Named Credential: https://help.salesforce.com/articleView?id=named_credentials_permsets_profiles.htm&type=0
- Entrada en StackExchange donde se describe el uso de las credenciales en los Settings del usuario en lugar de las que se utilizan en la definición de la Named Credential: https://salesforce.stackexchange.com/questions/102484/use-of-named-credentials-seem-to-be-tied-to-external-data-source
- Repo en Bitbucket con todo el código: https://bitbucket.org/estevegraells/forcegraells-namedcredentials