Autenticación
Los tres métodos de autenticación de la API de TunoCommerce
La API de TunoCommerce usa tres métodos de autenticación distintos según el tipo de consumidor:
| Método | Header | Para quién |
|---|---|---|
API Token (pk_*) | Authorization: Bearer pk_... | Integraciones servidor-a-servidor, ERPs, dashboards propios |
| JWT de comprador | X-Buyer-Token: eyJ... | Portal de comprador, apps móviles, frontends B2B |
Token de storefront (sf_*) | Authorization: Bearer sf_... + X-Storefront-Slug | Frontends de tienda pública, catálogos headless |
Método 1: API Token (pk_*)
Los API tokens son credenciales de larga duración para integraciones server-side. Son la opción más simple cuando tu consumidor es un sistema backend, no un usuario final.
Crear un token
Desde el dashboard administrativo:
- Ve a Mi Empresa → API Tokens
- Haz clic en Crear token
- Copia el token — solo se muestra una vez
Usar el token
Incluye el token en el header Authorization en cada solicitud:
curl https://tu-instancia.com/api/v1/products \
-H "Authorization: Bearer pk_a1b2c3d4..."Permisos
Los tokens tienen acceso completo al API v1 de su empresa y sus subsidiarias.
Rotación de tokens
Crea el nuevo token antes de eliminar el anterior para evitar interrupciones:
# 1. Crear token nuevo
curl -X POST https://tu-instancia.com/api/v1/api-tokens \
-H "Authorization: Bearer pk_token_viejo..." \
-H "Content-Type: application/json" \
-d '{"name": "Integración ERP v2"}'
# 2. Actualizar tu sistema con el nuevo token
# 3. Eliminar el token anterior
curl -X DELETE https://tu-instancia.com/api/v1/api-tokens/{tokenId} \
-H "Authorization: Bearer pk_token_nuevo..."Método 2: JWT de comprador
Los compradores (customers) se autentican con un flujo que usa cifrado asimétrico para proteger las credenciales en tránsito. El resultado es un access token JWT (15 minutos) y un refresh token (30 días).
Paso 1: Obtener el challenge
El challenge genera un par de claves RSA-2048 temporal para cifrar la contraseña:
curl -X POST https://tu-instancia.com/api/v1/customers/auth/challenge \
-H "X-Storefront-Slug: acme-b2c" \
-H "Authorization: Bearer sf_dev_seed_acme_b2c_token" \
-H "Content-Type: application/json" \
-d '{"email": "cmendoza@textilesnorte.mx"}'Respuesta:
{
"data": {
"challengeId": "uuid-...",
"publicKey": "-----BEGIN PUBLIC KEY-----\nMIIBI...\n-----END PUBLIC KEY-----",
"expiresAt": "2024-01-15T10:32:00Z"
}
}El challenge es válido por 2 minutos.
Paso 2: Cifrar la contraseña
Cifra la contraseña con la clave pública usando RSA-OAEP con SHA-256:
// Node.js
import { publicEncrypt, constants } from 'crypto';
const encrypted = publicEncrypt(
{
key: publicKey,
padding: constants.RSA_PKCS1_OAEP_PADDING,
oaepHash: 'sha256',
},
Buffer.from(password)
).toString('base64');Paso 3: Autenticarse
curl -X POST https://tu-instancia.com/api/v1/customers/auth/signin \
-H "X-Storefront-Slug: acme-b2c" \
-H "Authorization: Bearer sf_dev_seed_acme_b2c_token" \
-H "Content-Type: application/json" \
-d '{
"email": "cmendoza@textilesnorte.mx",
"encryptedPassword": "base64...",
"challengeId": "uuid-..."
}'Respuesta exitosa:
{
"data": {
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "64_hex_chars...",
"expiresIn": 900,
"customer": {
"id": "clx...",
"email": "cmendoza@textilesnorte.mx",
"firstName": "Carlos",
"lastName": "Mendoza"
}
}
}Usar el JWT en solicitudes de comprador
Los endpoints del portal de comprador (/api/v1/buyer/*) requieren tres headers:
curl https://tu-instancia.com/api/v1/buyer/quotes \
-H "X-Storefront-Slug: acme-b2c" \
-H "Authorization: Bearer sf_dev_seed_acme_b2c_token" \
-H "X-Buyer-Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."Paso 4: Renovar el access token
El access token expira a los 15 minutos. Usa el refresh token para obtener uno nuevo:
curl -X POST https://tu-instancia.com/api/v1/customers/auth/refresh \
-H "X-Storefront-Slug: acme-b2c" \
-H "Authorization: Bearer sf_dev_seed_acme_b2c_token" \
-H "Content-Type: application/json" \
-d '{"refreshToken": "64_hex_chars..."}'El refresh token anterior se invalida automáticamente (rotación). La respuesta incluye un nuevo par accessToken + refreshToken.
Paso 5: Cerrar sesión
curl -X POST https://tu-instancia.com/api/v1/customers/auth/logout \
-H "X-Storefront-Slug: acme-b2c" \
-H "Authorization: Bearer sf_dev_seed_acme_b2c_token" \
-H "X-Buyer-Token: eyJ..."Perfil del comprador autenticado
curl https://tu-instancia.com/api/v1/customers/me \
-H "X-Storefront-Slug: acme-b2c" \
-H "Authorization: Bearer sf_dev_seed_acme_b2c_token" \
-H "X-Buyer-Token: eyJ..."Método 3: Token de storefront (sf_*)
Los tokens de storefront autorizan acceso a la API pública de catálogo. Son de solo lectura y están limitados a los datos visibles para la empresa del storefront.
Crear un token de storefront
Desde el dashboard administrativo:
- Ve a Tiendas → selecciona la tienda
- Ve a la pestaña Tokens
- Crea un nuevo token con un nombre descriptivo
Usar el token
Todos los endpoints del storefront requieren dos headers:
curl https://tu-instancia.com/api/v1/storefront/catalog/products \
-H "X-Storefront-Slug: acme-b2c" \
-H "Authorization: Bearer sf_dev_seed_acme_b2c_token"El slug debe corresponder exactamente a la tienda del token. Si no coinciden, recibirás 401 STOREFRONT_UNAUTHORIZED.
Credenciales para desarrollo local
Con pnpm db:seed ejecutado, estos tokens están disponibles de inmediato:
| Tipo | Token | Uso |
|---|---|---|
| API Token | pk_dev_seed_catalog_token | Admin API v1 completa |
| Storefront | sf_dev_seed_acme_b2c_token | Tienda acme-b2c |
| Storefront | sf_dev_seed_acme_wholesale_token | Tienda acme-wholesale |
Compradores disponibles (contraseña: Customer123$):
| Nombre | |
|---|---|
cmendoza@textilesnorte.mx | Carlos Mendoza |
lgonzalez@unicorp.mx | Laura González |
dmorales@safetek.com.mx | Diana Morales |