<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: javier nicolás adan</title>
    <description>The latest articles on DEV Community by javier nicolás adan (@javiernicolasadan).</description>
    <link>https://dev.to/javiernicolasadan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2583570%2Fe3b012c6-93fb-4169-9ab2-87aaeabcb892.png</url>
      <title>DEV Community: javier nicolás adan</title>
      <link>https://dev.to/javiernicolasadan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/javiernicolasadan"/>
    <language>en</language>
    <item>
      <title>Integración de Salesforce, Node.js y React: Una Guía Paso a Paso</title>
      <dc:creator>javier nicolás adan</dc:creator>
      <pubDate>Mon, 20 Jan 2025 10:44:05 +0000</pubDate>
      <link>https://dev.to/javiernicolasadan/integracion-de-salesforce-nodejs-y-react-una-guia-paso-a-paso-nl7</link>
      <guid>https://dev.to/javiernicolasadan/integracion-de-salesforce-nodejs-y-react-una-guia-paso-a-paso-nl7</guid>
      <description>&lt;p&gt;En este artículo, te guiaré paso a paso para conectar un backend construido con &lt;strong&gt;Node.js&lt;/strong&gt; a &lt;strong&gt;Salesforce&lt;/strong&gt; usando &lt;strong&gt;OAuth 2.0&lt;/strong&gt;, e integrarlo con un frontend, en este caso, &lt;strong&gt;React&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Esta solución utiliza una &lt;strong&gt;Connected App&lt;/strong&gt; en Salesforce y los paquetes &lt;strong&gt;sf-jwt-token&lt;/strong&gt; y &lt;strong&gt;jsforce&lt;/strong&gt; en el backend.&lt;br&gt;&lt;br&gt;
Explicaré cómo hacerlo en tu máquina local y en un entorno de prueba utilizando Ngrok.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;1. Configuración en Salesforce&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Para habilitar una comunicación segura entre Salesforce y nuestra aplicación, primero necesitamos configurar una Connected App en la interfaz de usuario (UI) de Salesforce.&lt;br&gt;&lt;br&gt;
Así que, antes de empezar a programar, necesitamos configurar Salesforce para permitir la integración con nuestra aplicación.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Pasos en la UI de Salesforce:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Crear una Connected App&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ve a Setup → App Manager → Create a Connected App.&lt;/li&gt;
&lt;li&gt;Habilita el acceso a la API seleccionando &lt;strong&gt;Enable OAuth Settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;En &lt;strong&gt;Selected OAuth Scopes&lt;/strong&gt;, selecciona:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Perform request at any time (refresh_token, offline_access)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Manage user data via APIs (api)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Full access (full)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configurar las políticas de OAuth&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dentro de la nueva aplicación, navega a &lt;strong&gt;Manage → Edit Policies&lt;/strong&gt; y configura:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Permitted Users&lt;/strong&gt;: Admin approved users are pre-authorized.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;También necesitamos asignar el perfil que queremos usar en &lt;strong&gt;Manage Profiles&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consumer Key y Secret&lt;/strong&gt;:&lt;br&gt;
En la sección &lt;strong&gt;API (Enable OAuth Settings)&lt;/strong&gt;, haz clic en &lt;strong&gt;Manage Consumer Details&lt;/strong&gt; y guarda el &lt;strong&gt;Consumer Key (Consumer_Id)&lt;/strong&gt; y el &lt;strong&gt;Consumer Secret (Consumer_Secret)&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Estos valores se usarán más adelante en el archivo &lt;code&gt;.env&lt;/code&gt; para la configuración del backend.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Restablecer tu token de seguridad&lt;/strong&gt;:&lt;br&gt;
Restablece tu token de seguridad, si es necesario, navegando a tus configuraciones personales en Salesforce.&lt;br&gt;&lt;br&gt;
Este token también se agregará a las variables de entorno (explicado más abajo).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;2. Configurar el servidor en Node.js&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A continuación, configuraremos un backend en &lt;strong&gt;Express&lt;/strong&gt; y las herramientas necesarias para interactuar con Salesforce.&lt;/p&gt;

&lt;p&gt;Puedes usar este repositorio ya preparado para este propósito:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/javiernicolasadan/Backend_Node_SF/" rel="noopener noreferrer"&gt;Backend Node&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Instalar dependencias:&lt;/strong&gt;
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;express jsforce sf-jwt-token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Nota&lt;/strong&gt;:
&lt;/h3&gt;

&lt;p&gt;Escribo este artículo en diciembre de 2024, y creo que hay dos características interesantes recientes de Node.js que deberías conocer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Si usas Node.js v21.7.0 (abril de 2024) o posterior: Ya no necesitas &lt;strong&gt;dotenv&lt;/strong&gt; para las variables de entorno, puedes usar &lt;code&gt;process.loadEnvFile()&lt;/code&gt; al inicio de tu aplicación. Después de esto, tendrás tu archivo &lt;code&gt;.env&lt;/code&gt; como de costumbre en la raíz del proyecto, y podrás llamar tus variables desde cualquier parte del código usando &lt;code&gt;process.env.TU_VARIABLE&lt;/code&gt;.
&lt;a href="https://webdeveloper.beehiiv.com/p/ditch-dotenv-node-js-now-natively-supports-env-file-loading" rel="noopener noreferrer"&gt;Web Developer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Además, desde Node.js v22 (Soporte a Largo Plazo desde octubre de 2024), puedes usar &lt;code&gt;node --watch &amp;lt;tu archivo&amp;gt;&lt;/code&gt; en lugar del paquete &lt;strong&gt;nodemon&lt;/strong&gt; para reinicios automáticos del servidor.
&lt;a href="https://blog.logrocket.com/exploring-native-file-watching-node-js-v22/" rel="noopener noreferrer"&gt;Logrocket&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Así que, dos paquetes menos para instalar.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Variables de entorno&lt;/strong&gt;:
&lt;/h3&gt;

&lt;p&gt;Crea un archivo &lt;code&gt;.env&lt;/code&gt; y define lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CONSUMER_ID=tu_consumer_id
SF_USERNAME=tu_usuario_de_salesforce
LOGIN_URL=https://login.salesforce.com OR https://test.salesforce.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;¿Probando localmente? Usa Ngrok&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Ngrok se utiliza para exponer tu servidor local a internet, permitiendo que Salesforce envíe callbacks a tu aplicación durante el proceso de autenticación (necesario principalmente en la primera llamada):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Instala y ejecuta &lt;strong&gt;Ngrok&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Ejecuta tu servidor.&lt;/li&gt;
&lt;li&gt;Apunta Ngrok al puerto donde se ejecuta tu backend escribiendo &lt;code&gt;ngrok.exe http &amp;lt;tu_puerto&amp;gt;&lt;/code&gt; en tu terminal.&lt;/li&gt;
&lt;li&gt;Copia la URL generada por Ngrok y configúrala como &lt;strong&gt;Callback URL&lt;/strong&gt; en tu Connected App en la sección &lt;strong&gt;API (Enable OAuth Settings)&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;3. Clave privada y certificado&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Genera una clave privada y un certificado con el siguiente comando en la terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;openssl req  &lt;span class="nt"&gt;-nodes&lt;/span&gt; &lt;span class="nt"&gt;-new&lt;/span&gt; &lt;span class="nt"&gt;-x509&lt;/span&gt;  &lt;span class="nt"&gt;-keyout&lt;/span&gt; private.pem &lt;span class="nt"&gt;-out&lt;/span&gt; server.cert
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Subir la firma digital a Salesforce&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Ahora que los dos archivos están en tu proyecto, habilita la opción &lt;strong&gt;Use digital signatures&lt;/strong&gt; en tu Connected App y sube el certificado generado en:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Setup → Certificates and Key Management&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  Ahora, ejecuta la ruta del token en tu navegador:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000/token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Si todo salió bien, obtendrás tu &lt;code&gt;access_token&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"access_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api full"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"instance_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En esta solución, opté por solicitar un nuevo token de Salesforce para cada llamada a la API. Salesforce puede devolver el mismo token o emitir uno nuevo, ya que los tokens se actualizan periódicamente.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;4. Usando JSforce&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Con el token, puedes comenzar a interactuar con Salesforce desde tu servidor Node.js. Aquí hay un ejemplo simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jsforce&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jsforce&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;jsforce&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Connection&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;instanceUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://tu-instancia.salesforce.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;accessToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tu_access_token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SELECT Id, Name FROM Account&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Cuentas:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;records&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;5. Integración con React&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Finalmente, usa React para crear un frontend que consuma datos del backend y los muestre de forma interactiva. Por ejemplo, podrías construir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un formulario para crear registros en Salesforce.&lt;/li&gt;
&lt;li&gt;Una tabla para mostrar los datos de cuentas recuperados desde el backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En mi caso de uso, necesitaba una forma en que los empleados de una empresa pudieran registrar datos de desplazamiento y hacer registros en Salesforce, específicamente en &lt;strong&gt;Net Zero Cloud&lt;/strong&gt;. Para este ejercicio, creé el objeto necesario y desarrollé la solución con un &lt;strong&gt;Developer Org gratuito&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;También puedes usar este repositorio de frontend en React para este propósito:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/javiernicolasadan/Frontend_React_SF" rel="noopener noreferrer"&gt;Frontend React&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusión&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Integrar Salesforce, Node.js y React es una forma sencilla de experimentar con herramientas y hacer que todo funcione.&lt;br&gt;&lt;br&gt;
Espero que este artículo te ayude a empezar con tu propia solución de integración.&lt;/p&gt;

&lt;p&gt;¿Tienes preguntas o ideas para mejorar este flujo de trabajo? Déjalas en los comentarios.&lt;/p&gt;

</description>
      <category>salesforce</category>
      <category>react</category>
      <category>tutorial</category>
      <category>node</category>
    </item>
    <item>
      <title>Integration of Salesforce, Node.js, and React: A Step-by-Step Guide</title>
      <dc:creator>javier nicolás adan</dc:creator>
      <pubDate>Sat, 28 Dec 2024 00:00:13 +0000</pubDate>
      <link>https://dev.to/javiernicolasadan/integration-of-salesforce-nodejs-and-react-a-step-by-step-guide-5d25</link>
      <guid>https://dev.to/javiernicolasadan/integration-of-salesforce-nodejs-and-react-a-step-by-step-guide-5d25</guid>
      <description>&lt;p&gt;In this article, I’ll walk you through how to connect a backend built with &lt;strong&gt;Node.js&lt;/strong&gt; to &lt;strong&gt;Salesforce&lt;/strong&gt; using &lt;strong&gt;OAuth 2.0&lt;/strong&gt;, and then integrate it with a frontend, in this case, &lt;strong&gt;React&lt;/strong&gt;. &lt;br&gt;
This solution is with &lt;strong&gt;Connected app&lt;/strong&gt; in Salesforce, and  &lt;strong&gt;sf-jwt-token&lt;/strong&gt; &amp;amp; &lt;strong&gt;jsforce&lt;/strong&gt; packages in the backend.&lt;br&gt;
I’ll explain how to do this on your local machine, and in test environment, using Ngrok.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;1. Salesforce Configuration&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To enable secure communication between Salesforce and our application, we first need to configure a Connected App at the User Interface (UI) in Salesforce.&lt;br&gt;
So before start coding, we need to configure Salesforce to allow integration with our application.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;To do in UI Salesforce:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a Connected App&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to Setup → App Manager → Create a Connected App.&lt;/li&gt;
&lt;li&gt;Enable API access by selecting Enable OAuth Settings.&lt;/li&gt;
&lt;li&gt;In Selected OAuth Scopes, choose:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Perform request at any time (refresh_token, offline_access)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Manage user data via APIs (api)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Full access (full)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set OAuth Policies&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inside our new App, navigate to Manage → Edit Policies
and set:

&lt;ul&gt;
&lt;li&gt;Permitted Users: Admin approved users are pre-authorized.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Also we need to assign the profile we want to use in &lt;strong&gt;Manage Profiles&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consumer Key and Secret&lt;/strong&gt;:&lt;br&gt;
In the API(Enable OAuth Settings) section, click on Manage Consumer Details and save &lt;strong&gt;Consumer Key (Consumer_Id)&lt;/strong&gt; and &lt;strong&gt;Consumer Secret (Consumer_Secret)&lt;/strong&gt;. These values will be used later int the .env file fot the backend configuration.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;4 &lt;strong&gt;Reset Your Security Token&lt;/strong&gt;:&lt;br&gt;
Reset your security token if needed by navigating to your personal settings in Salesforce. This token will also be added to your environment variables (explained below).&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;2. Setting Up the Node.js Server&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Next, we’ll set up an &lt;strong&gt;Express&lt;/strong&gt; backend and the required tools to interact with Salesforce.&lt;/p&gt;

&lt;p&gt;You can use this repo already prepared for that purpose:&lt;br&gt;
&lt;a href="https://github.com/javiernicolasadan/Backend_Node_SF/" rel="noopener noreferrer"&gt;Backend Node&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Install Dependencies:&lt;/strong&gt;
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;express jsforce sf-jwt-token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Note&lt;/strong&gt;:
&lt;/h3&gt;

&lt;p&gt;Im writing this post december '24, and these might not be the newest tools, but there are two recent nice to know node's features. So i just let you know about them, just in case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you're using Node.js v21.7.0 (April 2024) or later: You don’t need &lt;strong&gt;dotenv&lt;/strong&gt; for environment variables anymore, you can use &lt;code&gt;process.loadEnvFile()&lt;/code&gt; at the beginning of your aplication instead. After this, you will have your .env like normally in the root of your project with your variables, and now you can call your variables from everywhere in your code with process.env.YOUR_VARIABLE_NAME.
&lt;a href="https://webdeveloper.beehiiv.com/p/ditch-dotenv-node-js-now-natively-supports-env-file-loading" rel="noopener noreferrer"&gt;Web Developer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Also, from Node.js V22 (Long-Term Support from October 24), you can use &lt;code&gt;node --watch &amp;lt;your file&amp;gt;&lt;/code&gt; instead of &lt;strong&gt;nodemon&lt;/strong&gt; package for automatic restarts of the server. &lt;a href="https://blog.logrocket.com/exploring-native-file-watching-node-js-v22/" rel="noopener noreferrer"&gt;logrocket&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, two less packages for installing.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Environment Variables&lt;/strong&gt;:
&lt;/h3&gt;

&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; file and define the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CONSUMER_ID=your_consumer_id
SF_USERNAME=your_salesforce_username
LOGIN_URL=https://login.salesforce.com OR https://test.salesforce.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Testing Locally? Use Ngrok&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Ngrok is used to expose your local server to the internet, allowing Salesforce to send callbacks to your application during the authentication process (needed mainly in first call):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install and run &lt;strong&gt;ngrok&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Run your server.&lt;/li&gt;
&lt;li&gt;Point ngrok to the port your backend is running on, typing &lt;code&gt;ngrok.exe http &amp;lt;you port&amp;gt;&lt;/code&gt; in your terminal.&lt;/li&gt;
&lt;li&gt;Copy the ngrok-generated URL and set it as the &lt;strong&gt;Callback URL&lt;/strong&gt; in your Salesforce Connected App in the API(Enable OAuth Settings) section.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3. Private Key and Certificate&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Generate a private key and certificate with the following terminal command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ openssl req  -nodes -new -x509  -keyout private.pem -out server.cert
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Upload digital signature to SF&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Now the two files are in your project. Time to Enable the option  Use digital signatures in your Connected App, and Upload the generated certificate in &lt;strong&gt;Setup → Certificates and Key Management&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Now, run the token route in your brower
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000/token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything went well, now you will get your access_token.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  access_token: '',
  scope: 'api full',
  instance_url: '',
  id: '',
  token_type: 'Bearer'
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this solution, I chose to request a new token from Salesforce for every API call. Salesforce may return the same token or issue a new one, as tokens are refreshed periodically.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;5. Using JSforce&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;With the token, you can start interacting with Salesforce from your Node.js server. Here’s a simple example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jsforce&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jsforce&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;jsforce&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Connection&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;instanceUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://your-instance.salesforce.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;accessToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your_access_token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SELECT Id, Name FROM Account&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Accounts:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;records&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;6. Integrating with React&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Finally, use React to create a frontend that consumes data from the backend and displays it interactively. For instance, you could build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A form to create records in Salesforce.&lt;/li&gt;
&lt;li&gt;A table to display account data retrieved from the backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In my use case, I needed a way in which a company's workers were able to put the commuting data in, and make registers in SF, concrete in Net Zero Cloud, but for this exercise I just created the object needed and build the solution with a demo developer free org.&lt;/p&gt;

&lt;p&gt;You can use also this React Frontend form repo for this purpose.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/javiernicolasadan/Frontend_React_SF" rel="noopener noreferrer"&gt;React Frontend&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Integrating Salesforce, Node.js, and React in a easy way, just to play around with tools and make things workings.&lt;br&gt;
I hope this article helps you get started with your own integration solution.&lt;/p&gt;

&lt;p&gt;Got questions or ideas to improve this workflow? Drop them in the comments.&lt;/p&gt;

</description>
      <category>salesforce</category>
      <category>jwt</category>
      <category>node</category>
    </item>
  </channel>
</rss>
