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.
| Header | DescripciΓ³n |
|---|---|
| X-WA-Client | Tu Client ID (pΓΊblico) |
| X-WA-Timestamp | Timestamp Unix actual (segundos). La peticiΓ³n expira en Β±300 s respecto al reloj del servidor. |
| X-WA-Digest | HMAC-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:
| HTTP | Causa | SoluciΓ³n |
|---|---|---|
| 401 | Faltan uno o mΓ‘s de los headers X-WA-Client / X-WA-Timestamp / X-WA-Digest | Verifica que los tres headers se envΓen en cada request |
| 401 | Firma HMAC invΓ‘lida, o el timestamp estΓ‘ fuera de la ventana de Β±300 s | Revisa el mensaje canΓ³nico (orden y valores exactos) y que el reloj de tu servidor estΓ© sincronizado (NTP) |
| 401 | El Token no corresponde a ninguna cuenta | Confirma 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