Docs / AutenticaciΓ³n

AutenticaciΓ³n de la API

Todos los mΓ³dulos de la API de Webability β€” DNS, ImΓ‘genes, Mail, Marketing y Video β€” comparten exactamente el mismo esquema de autenticaciΓ³n. Esta pΓ‘gina es la referencia ΓΊnica: los manuales de cada mΓ³dulo enlazan aquΓ­ en vez de repetir el contenido.

IntroducciΓ³n

Cada cuenta tiene un par de credenciales: un Client ID (pΓΊblico, identifica la cuenta) y un Token (secreto, nunca viaja en el request). En vez de enviar el token directamente, cada peticiΓ³n se firma con un HMAC-SHA256 calculado sobre un mensaje canΓ³nico corto, usando el token como clave secreta. El servidor recalcula el mismo HMAC con el token que tiene almacenado y compara ambos resultados.

ΒΏPor quΓ© asΓ­?

  • β€’ El token nunca se transmite, ni siquiera cifrado
  • β€’ Cada request queda ligado a su mΓ©todo, ruta y momento exacto
  • β€’ Una peticiΓ³n capturada no puede reenviarse pasados 300 segundos

DΓ³nde obtener tus credenciales

  • β€’ Consola β†’ ConfiguraciΓ³n
  • β€’ Un Client ID y Token por cuenta, compartido por todos los mΓ³dulos
  • β€’ Puedes regenerar el Token en cualquier momento desde la consola

Headers requeridos

Toda peticiΓ³n autenticada debe incluir estos tres headers HTTP.

HeaderDescripciΓ³n
X-WA-ClientTu Client ID (pΓΊblico)
X-WA-TimestampTimestamp Unix actual (segundos). La peticiΓ³n expira en Β±300 s respecto al reloj del servidor.
X-WA-DigestHMAC-SHA256 del mensaje canΓ³nico (firmado con tu Token secreto), en hexadecimal.

Mensaje canΓ³nico

El digest se calcula sobre esta cadena, en este orden exacto, separada por |:

{METHOD}|{PATH}|{TIMESTAMP}|{CLIENTID}

Ejemplo para POST /v1/dns/zone: POST|/v1/dns/zone|1720000000|miclientid

METHOD es el verbo HTTP en mayΓΊsculas (GET, POST, PUT, DELETE). PATH es la ruta absoluta sin host ni query string (p. ej. /v1/dns/zone/42).

Tus credenciales

πŸ”‘ Inicia sesiΓ³n para ver tus credenciales aquΓ­ mismo β€” Iniciar sesiΓ³n Β· Crear cuenta gratis

El mismo Client ID y Token funcionan para todos los mΓ³dulos (DNS, ImΓ‘genes, Mail, Marketing, Video). No necesitas credenciales distintas por mΓ³dulo.

Ejemplos de firma por lenguaje

CΓ‘lculo del digest para GET /v1/dns/zone. El patrΓ³n es idΓ©ntico para cualquier mΓ³dulo β€” solo cambia PATH y METHOD.

Bash (curl + openssl)

CLIENTID="[IDCliente]"
TOKEN="[TokenCliente]"
TS=$(date +%s)
METHOD="GET"
PATH="/v1/dns/zone"
MSG="${METHOD}|${PATH}|${TS}|${CLIENTID}"
DIG=$(echo -n "$MSG" | openssl dgst -sha256 -hmac "$TOKEN" | awk '{print $2}')

curl -s https://api.webability.info${PATH} \
  -H "X-WA-Client: $CLIENTID" \
  -H "X-WA-Timestamp: $TS" \
  -H "X-WA-Digest: $DIG"

Go

import (
  "crypto/hmac"
  "crypto/sha256"
  "fmt"
  "time"
)

func sign(clientID, token, method, path string) (ts, digest string) {
  ts = fmt.Sprintf("%d", time.Now().Unix())
  msg := method + "|" + path + "|" + ts + "|" + clientID
  mac := hmac.New(sha256.New, []byte(token))
  mac.Write([]byte(msg))
  digest = fmt.Sprintf("%x", mac.Sum(nil))
  return
}

JavaScript (Node.js)

const crypto = require('crypto');

function sign(clientId, token, method, path) {
  const ts = Math.floor(Date.now() / 1000).toString();
  const msg = `${method}|${path}|${ts}|${clientId}`;
  const digest = crypto.createHmac('sha256', token).update(msg).digest('hex');
  return { ts, digest };
}

PHP

$clientId = '[IDCliente]';
$token = '[TokenCliente]';
$method = 'GET';
$path = '/v1/dns/zone';
$ts = (string) time();
$msg = "$method|$path|$ts|$clientId";
$digest = hash_hmac('sha256', $msg, $token);

Python

import hmac, hashlib, time

def sign(client_id, token, method, path):
    ts = str(int(time.time()))
    msg = f"{method}|{path}|{ts}|{client_id}"
    digest = hmac.new(token.encode(), msg.encode(), hashlib.sha256).hexdigest()
    return ts, digest

Rust

use hmac::{Hmac, Mac};
use sha2::Sha256;

type HmacSha256 = Hmac<Sha256>;

fn sign(client_id: &str, token: &str, method: &str, path: &str, ts: &str) -> String {
    let msg = format!("{method}|{path}|{ts}|{client_id}");
    let mut mac = HmacSha256::new_from_slice(token.as_bytes()).unwrap();
    mac.update(msg.as_bytes());
    hex::encode(mac.finalize().into_bytes())
}

C (OpenSSL)

unsigned char md[EVP_MAX_MD_SIZE];
unsigned int md_len;
HMAC(EVP_sha256(),
     token, (int)strlen(token),
     (const unsigned char *)msg, strlen(msg),
     md, &md_len);
/* convierte md[0..md_len) a hex para X-WA-Digest */

Usa un SDK oficial

Los SDKs oficiales firman cada peticiΓ³n automΓ‘ticamente β€” no necesitas implementar HMAC-SHA256 a mano. Solo inicializas el cliente con tu Client ID y Token, y cada llamada queda firmada por debajo.

Errores comunes de autenticaciΓ³n

El cΓ³digo numΓ©rico exacto varΓ­a segΓΊn el mΓ³dulo (cada uno tiene su propia tabla de errores en su manual), pero las tres causas posibles son siempre las mismas:

HTTPCausaSoluciΓ³n
401Faltan uno o mΓ‘s de los headers X-WA-Client / X-WA-Timestamp / X-WA-DigestVerifica que los tres headers se envΓ­en en cada request
401Firma HMAC invΓ‘lida, o el timestamp estΓ‘ fuera de la ventana de Β±300 sRevisa el mensaje canΓ³nico (orden y valores exactos) y que el reloj de tu servidor estΓ© sincronizado (NTP)
401El Token no corresponde a ninguna cuentaConfirma el Token vigente en Consola β†’ ConfiguraciΓ³n β€” pudo haberse regenerado

Buenas prΓ‘cticas

  • β€’ Nunca coloques el Token en cΓ³digo de frontend/JavaScript de navegador β€” fΓ­rmalo siempre desde tu backend.
  • β€’ Guarda el Token como variable de entorno o secreto, no en el repositorio.
  • β€’ Sincroniza el reloj de tus servidores (NTP) para evitar rechazos por timestamp fuera de rango.
  • β€’ Si sospechas que tu Token se filtrΓ³, regΓ©nΓ©ralo de inmediato desde la consola β€” invalida el anterior al instante.

Β© 2025 WebAbility S.A.S. Β· DocumentaciΓ³n Β· Soporte