Solución a credenciales estáticas o expuestas en n8n para requests a jsonrpc de odoo

Problema de credenciales expuestas en n8n con odoo y su api jsonrpc

Solución a credenciales estáticas o expuestas en n8n para requests a jsonrpc de odoo

Objetivo:
Ocultar las credenciales de odoo en flujos de trabajo de n8n y al mismo tiempo poder hacer requests dinámicos.

Contexto:
Hace unos años que me dedico a dessarrollar e implementar odoo de manera profesional. Me ascendieron a lider técnico en automatización de procesos con IA y administro y sigo los proyectos. Actualmente estoy automatizando y creando agentes con n8n, pero me tope con el problema de que no hay nodos suficientes para odoo, y si quería hacer requests personalizados, las credenciales debían quedar en el nodo http, o tenía que armar una credencial custom auth para cada tipo de request a odoo.

Lo que intentaba hacer:
Mi problema era que quería personalizar los request en n8n utilizando las credenciales custom e insertarla en el body del nodo http para comunicarme a cualquier modelo en odoo. Después de horas que quebrarme la cabeza probando e investigando sin resultado alguno, se me ocurrió insertar valores dinámicos a las credenciales custom auth y hacer el request con el body formateado para jsonrpc.

El resultado:
Pude ocultar las credenciales para mantener la seguridad en los flujos de trabajo y a la vez pude hacer requests dinámicos.

Dejo capturas de como se ve una credencial con el flujo:

Credencial Custom auth:

{
  "body":{
    "jsonrpc": "{{ $('params_jsonrpc3').item.json.jsonrpc }}",
    "method": "call",
    "id": "{{ $('params_jsonrpc3').item.json.id }}",
    "params": {
      "service": "{{ $('params_jsonrpc3').item.json.service }}",
      "method": "{{ $('params_jsonrpc3').item.json.method }}",
      "args": [
      "-------DB_NAME-------",
      -------RES_USER_ID-------,
      "-------API_KEY-------",
        "{{ $('params_jsonrpc3').item.json.model }}",
        "{{ $('params_jsonrpc3').item.json.crud_type }}",
        {{ $('params_jsonrpc3').item.json.record_ids.toJsonString() }},
      {
        "context": {{ $json.context.toJsonString() }}
      }  
      ]
    }
  }
}

Flujo de trabajo:

1 Like

Hey Francisco, buena pregunta - yeah, this is a pretty common pain point when working with Odoo’s JSON-RPC API in n8n.

The thing is, you dont really need custom credentials for each request type. Here’s what actually works:

**Store credentials in n8n’s built-in secrets, then reference them in HTTP requests:**

1. Go to Settings → Credentials and create a “Generic credential type” (or just use Environment variables)

2. Store your Odoo credentials there:

```json

{

“odoo_url”: “https://your-instance.odoo.com”,

“odoo_db”: “your_database”,

“odoo_username”: “[email protected]”,

“odoo_password”: “your_password”

}

```

3. In your HTTP node, reference them with `{{ $credentials.credential_name.field_name }}`

For Odoo JSON-RPC specifically, your HTTP node setup would look like:

**POST request:**

```

URL: {{ $credentials.odoo.odoo_url }}/jsonrpc

```

**Body (JSON):**

```json

{

“jsonrpc”: “2.0”,

“method”: “call”,

“params”: {

"service": "common",

"method": "authenticate",

"args": \[

  "{{ $credentials.odoo.odoo_db }}",

  "{{ $credentials.odoo.odoo_username }}",

  "{{ $credentials.odoo.odoo_password }}"

\]

},

“id”: 1

}

```

This way your creds stay secure (n8n encrypts them) and you can make dynamic requests without hardcoding anything.

The key thing - you just use ONE generic credential and inject it into whatever request structure you need. Way cleaner than custom creds for each request type.

what’s your specific use case with the requests? if youre doing something more complex i can help with the auth flow

1 Like

hola achamm, gracias por tu respuesta.
Debido a que n8n 2.3.4 no permite acceder a credenciales como si fuesen variables, armé este post para ayudar a otras personas. Antes había probado tu solución y en mi caso no funciona.
Otro punto sobre sobre tu respuesta, es que uso n8n autohospedado y no permite trabajar con variables de entorno dentro del programa.

Gracias por ofrecer tu ayuda, pero soy usuario avanzado de n8n y programador senior, será en otra ocasión :grin:

ah my bad - didnt catch you were on 2.3.4, that version doesnt support credential access like that. older builds are way more locked down

and yeah self-hosted with no env vars inside the app makes sense, security thing

sounds like you already got it sorted with your approach tho. appreciate you posting it for others on older versions :+1:

1 Like

Hi @Francisco_Fiorentino

The approach using Custom Auth with a JSON-RPC body that mixes static secrets and dynamic expressions is valid and supported in n8n. Based on the available documentation, Custom Auth itself isn’t a known cause of HTTP Request failures when correctly configured; issues in this area are more commonly related to invalid URLs, incorrectly resolved parameters, or credential permission/configuration problems, depending on the specific error message.

In this case, based on the screenshots, it appears likely that the HTTP Request URL is resolving to undefined, which would be consistent with the fact that credentials can’t be accessed via expressions in n8n.

Because of that, the URL should be defined directly in the HTTP Request node. Custom Auth is intended to inject headers, body, or query data, but not to provide the request URL itself.

Reference:

No estoy enviando la url en la solicitud.