Saltar al contenido principal

Máquina a máquina: Autenticación con Logto

nota

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 si tienes una aplicación (no un usuario) que necesita comunicarse directamente con recursos (generalmente, usar una aplicación M2M no necesita interacciones de usuario, por lo que no tiene interfaz de usuario). 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 aplicaciones M2M es necesario para proteger tu API que necesita comunicación directa de servicio.

info

Para conocer nuestro RBAC actual y la diferencia entre el rol de usuario y el rol M2M, consulta Configurar roles para obtener más información.

Hay dos casos de uso comunes para usar aplicaciones máquina a máquina en Logto:

  1. 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 aplicación M2M.
  2. Acceder a tu recurso de API: En este caso, necesitas asignar roles M2M que incluyan permisos de tus recursos de API a tu aplicación M2M.

Durante el proceso de creación de la aplicación M2M, serás dirigido a una página donde puedes asignar roles M2M a tus aplicaciones:

Asignar roles M2M modal

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

Asignar roles M2M página

Ahora, repasemos 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 aplicación 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:

App ID and App Secret

Un ejemplo de la 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

nota

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.

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.

Detalles de Logto Management API

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".

info

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:

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(),
});
};
precaución

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.

Respuesta del token de acceso

Un cuerpo de respuesta de acceso exitoso sería como:

{
"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
}
nota

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 al recurso 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.

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:

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}`,
},
});
};

Autenticación

Si estás protegiendo tus propios Recursos de API además de Logto Management API, recuerda implementar la autenticación para tu recurso. Consulta Protege tu API para más detalles.