Máquina a máquina: Autenticación con Logto
Esta guía asume que has creado una Aplicación del tipo "Machine-to-machine" en la Consola de Administración.
Introducción
Máquina a máquina (M2M) es una práctica común para autenticar cuando tienes una aplicación (no un usuario) que necesita comunicarse directamente con recursos (normalmente, usar una app M2M no requiere interacción de usuario, por lo que no tiene interfaz gráfica). Por ejemplo, un servicio de API que actualiza datos personalizados de usuarios en Logto, un servicio de estadísticas que extrae pedidos diarios, etc.
Dado que Logto utiliza el control de acceso basado en roles (RBAC) como su política de control de acceso, asignar roles M2M a las aplicaciones M2M es necesario para proteger tu API que necesita comunicación directa entre servicios.
Para conocer nuestro RBAC actual y la diferencia entre el rol de usuario y el rol M2M, consulta Configurar roles globales para más información.
Hay dos casos de uso comunes para utilizar aplicaciones máquina a máquina en Logto:
- Acceder a Logto Management API: En este caso, necesitas asignar un rol M2M que incluya el permiso
all
de la Logto Management API incorporada a tu app M2M. - Acceder a tu recurso de API: En este caso, necesitas asignar roles M2M que incluyan permisos de tus recursos de API a tu app M2M.
Durante el proceso de creación de una aplicación M2M, serás dirigido a una página donde puedes asignar roles M2M a tus aplicaciones:

O también puedes asignar estos roles en la página de detalles de la aplicación M2M cuando ya tienes una aplicación M2M creada:

Ahora, vamos a recorrer el proceso de principio a fin. Para mayor claridad, separaremos los pasos para acceder a Logto Management API y otros recursos de API. Y asumimos que ya has creado una app M2M en Logto.
Obtener un token de acceso
Conceptos básicos sobre la solicitud de token de acceso
La aplicación M2M realiza una solicitud POST
al endpoint de token para obtener un token de acceso añadiendo los siguientes parámetros utilizando el formato application/x-www-form-urlencoded
en el cuerpo de la entidad de la solicitud HTTP:
- grant_type: Debe establecerse en
client_credentials
- resource: El recurso al que deseas acceder
- scope: El alcance de la solicitud de acceso
También necesitas incluir las credenciales de tu aplicación M2M en el encabezado de la solicitud para que el endpoint de token autentique tu aplicación M2M.
Esto se logra incluyendo las credenciales de la aplicación en el formulario de autenticación básica en el encabezado de Authorization
de la solicitud, donde el nombre de usuario es el App ID y la contraseña es el App Secret.
Puedes encontrar el App ID y el App Secret en la página de detalles de tu aplicación M2M:

Un ejemplo de solicitud de token de acceso es:
POST /oidc/token HTTP/1.1
Host: your.logto.endpoint
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
&resource=https://shopping.api
&scope=read:products write:products
Solicitar un token de acceso
En la siguiente demostración, reemplaza https://your.logto.endpoint
con el endpoint de Logto que estás utilizando. Para Logto Cloud, será https://{your-tenant-id}.logto.app
.
- Para Logto Management API
- Para tu recurso de API
Logto proporciona un recurso incorporado "Logto Management API", es un recurso de solo lectura con el permiso all
para acceder a Logto Management API, puedes verlo en tu lista de recursos de API. El indicador de API del recurso sigue el patrón https://{your-tenant-id}.logto.app/api
, y este será tu valor de recurso utilizado en el cuerpo de la solicitud del token de acceso.

Antes de acceder a Logto Management API, asegúrate de que tu aplicación M2M haya sido asignada con roles M2M que incluyan el permiso all
de este recurso incorporado "Logto Management API".
Logto también proporciona un rol M2M preconfigurado "Logto Management API access" para los nuevos inquilinos creados, al cual ya se le ha asignado el permiso all
del recurso Logto Management API. Puedes usarlo directamente sin configurar manualmente los permisos. Este rol preconfigurado también puede ser editado y eliminado según sea necesario.
Ahora, compón todo lo que tenemos y envía la solicitud:
- Node.js
- cURL
const logtoEndpoint = 'https://your.logto.endpoint'; // Reemplaza con tu endpoint de Logto
const tokenEndpoint = `${logtoEndpoint}/oidc/token`;
const applicationId = 'your-application-id';
const applicationSecret = 'your-application-secret';
const tenantId = 'your-tenant-id';
const fetchAccessToken = async () => {
return await fetch(tokenEndpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
Authorization: `Basic ${Buffer.from(`${applicationId}:${applicationSecret}`).toString(
'base64'
)}`,
},
body: new URLSearchParams({
grant_type: 'client_credentials',
resource: `https://${tenantId}.logto.app/api`,
scope: 'all',
}).toString(),
});
};
curl --location \
--request POST 'https://your.logto.endpoint' \
--header 'Authorization: Basic ${your_auth_string}' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'resource=https://${tenantId}.logto.app/api' \
--data-urlencode 'scope=all'
Recuerda reemplazar los valores reales con los tuyos propios.
Para los usuarios de Logto Cloud: cuando interactúes con Logto Management API, no puedes usar un dominio personalizado, utiliza el endpoint predeterminado de Logto https://{your_tenant_id}.logto.app/oidc/token
para otorgar tokens de acceso.
En tu lista de Recursos de API, encuentra el identificador de API al que la app necesita acceder. Si no has añadido el Recurso de API en Logto o no sabes qué es un Recurso de API, consulta Autorización.

Supongamos que tenemos los permisos read:products
y write:products
bajo este recurso de API “Online Shopping”.
Antes de acceder a tu recurso de API, asegúrate de que tu app M2M tenga asignados roles M2M que incluyan permisos de tu recurso de API.
Ahora, reúne todo lo que tenemos y envía la solicitud:
- Node.js
- cURL
const logtoEndpoint = 'https://your.logto.endpoint';
const tokenEndpoint = `${logtoEndpoint}/oidc/token`;
const applicationId = 'your-application-id';
const applicationSecret = 'your-application-secret';
const fetchAccessToken = async () => {
return await fetch(tokenEndpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
Authorization: `Basic ${Buffer.from(`${applicationId}:${applicationSecret}`).toString(
'base64'
)}`,
},
body: new URLSearchParams({
grant_type: 'client_credentials',
resource: 'https://shopping.api',
scope: 'read:products write:products',
}).toString(),
});
};
curl --location \
--request POST 'https://your.logto.endpoint/oidc/token' \
--header 'Authorization: Basic ${your_auth_string}' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'resource=https://shopping.api' \
--data-urlencode 'scope=read:products write:products'
Respuesta del token de acceso
Un cuerpo de respuesta de acceso exitoso sería así:
{
"access_token": "eyJhbG...2g", // Usa este token para acceder a Logto Management API
"expires_in": 3600, // Expiración del token en segundos
"token_type": "Bearer", // Tipo de autenticación para tu solicitud al usar el token de acceso
"scope": "all" // alcance `all` para Logto Management API
}
Logto actualmente no admite que la aplicación M2M represente a un usuario. El sub
en la carga útil del token de acceso será el ID de la aplicación.
Acceder a recursos usando el token de acceso
Es posible que notes que la respuesta del token tiene un campo token_type
, que está fijado a Bearer
.
Por lo tanto, debes colocar el token de acceso en el campo Authorization
de los encabezados HTTP con el formato Bearer (Bearer YOUR_TOKEN
) cuando estés interactuando con tu servidor de recursos de API.
- Interactuar con Logto Management API
- Interactuar con tu recurso de API
Usando el token de acceso solicitado con el recurso de API de Logto Management incorporado https://[your-tenant-id].logto.app/api
para obtener todas las aplicaciones en Logto:
- Node.js
- cURL
const logtoEndpoint = 'https://your.logto.endpoint'; // Reemplaza con tu endpoint de Logto
const accessToken = 'eyJhb...2g'; // Token de acceso
const fetchLogtoApplications = async () => {
return await fetch(`${logtoEndpoint}/api/applications`, {
method: 'GET',
headers: {
Authorization: `Bearer ${accessToken}`,
},
});
};
curl --location \
--request GET 'https://your.logto.endpoint/api/applications' \
--header 'Authorization: Bearer eyJhbG...2g'
Recuerda reemplazar los valores reales con los tuyos propios. El valor después de Bearer
debe ser el token de acceso (JWT) que recibiste.
Usando el token de acceso solicitado con el recurso de API https://shopping.api
para obtener todos los productos en la API de compras:
- Node.js
- cURL
const apiEndpoint = 'https://your.api.endpoint';
const accessToken = 'eyJhb...2g'; // Token de acceso
const fetchProducts = async () => {
return await fetch(`${apiEndpoint}/products`, {
method: 'GET',
headers: {
Authorization: `Bearer ${accessToken}`,
},
});
};
curl --location \
--request GET 'https://your.api.endpoint/products' \
--header 'Authorization: Bearer eyJhbG...2 # Token de acceso
Autorización
Si estás protegiendo tus propios Recursos de API distintos de Logto Management API, necesitas implementar la lógica de autorización en tu servicio de API para verificar el token de acceso y comprobar si la app M2M tiene los permisos requeridos para acceder al recurso.
Para más detalles, consulta Autorización y Validar tokens de acceso.