Ir al contenido

Autenticación

La autenticación para el embebido requiere dos pasos: generar un JWT y crear una firma RSA del request.

Crea un JSON Web Token con los datos del usuario autenticado en tu plataforma.

CampoTipoRequeridoDescripción
substringTu hostId
emailstringEmail del usuario
namestringNombre del usuario
paternalLastNamestringApellido paterno
maternalLastNamestringNoApellido materno
issstringTu clientId
CampoValor
algHS256
kidTu clientId
import jwt from "jsonwebtoken";

const jwtPayload = {
  sub: process.env.CM_HOST_ID,
  email: user.email,
  name: user.firstName,
  paternalLastName: user.lastName.split(" ")[0],
  ...(user.lastName.split(" ")[1] && {
    maternalLastName: user.lastName.split(" ")[1],
  }),
  iss: process.env.CM_CLIENT_ID,
};

const token = jwt.sign(jwtPayload, process.env.CM_JWT_SECRET, {
  algorithm: "HS256",
  expiresIn: "5m",
  header: {
    kid: process.env.CM_CLIENT_ID,
    alg: "HS256",
  },
});

Cada solicitud al API debe incluir una firma digital creada con tu llave privada RSA.

El payload de firma se construye concatenando los siguientes valores separados por \n:

{method}\n{url}\n{timestamp}\n{body}\n{headers}
ParteDescripciónEjemplo
methodMétodo HTTPGET
urlPath del endpoint/hosts/{hostId}/authorize-user
timestampDate.now().toString()1710000000000
bodyBody serializado (vacío si GET)""
headersHeaders ordenados, formato key:valueVer abajo
const headersToSign = {
  "content-type": "application/json",
  "x-cm-host-id": hostId,
  "x-cm-client-id": clientId,
  authorization: `Bearer ${token}`,
};

Los headers se ordenan alfabéticamente y se unen con \n en formato key:value.

import { createSign } from "crypto";
import { readFileSync } from "fs";

async function signRequest(clientId, method, url, body, hostId, token) {
  const privateKey = readFileSync("./keys/private.pem", "utf8");
  const timestamp = Date.now().toString();

  const headersToSign = {
    "content-type": "application/json",
    "x-cm-host-id": hostId,
    "x-cm-client-id": clientId,
    authorization: `Bearer ${token}`,
  };

  const headerLines = Object.entries(headersToSign)
    .map(([k, v]) => `${k}:${v}`)
    .join("\n");

  const bodyStr = body ? JSON.stringify(body) : "";
  const payload = `${method}\n${url}\n${timestamp}\n${bodyStr}\n${headerLines}`;

  const signer = createSign("RSA-SHA256");
  signer.update(payload);
  signer.end();

  const signature = signer.sign(privateKey).toString("base64");

  return { signature, timestamp };
}

Con el JWT y la firma listos, procede a Obtener el Token.