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 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.
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:
- 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. - 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:
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:
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:
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
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 aplicación necesita acceder. Si no has agregado el Recurso de API en Logto o no sabes qué es un Recurso de API, consulta Recurso de API.
Supongamos que tenemos permisos read:products
y write:products
bajo este recurso de API "Compras en línea".
Antes de acceder a tu recurso de API, asegúrate de que tu aplicación M2M haya sido asignada con roles M2M que incluyan permisos de tu recurso de API.
Ahora, compón 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 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
}
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.
- 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
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.