Machine-to-machine : Auth avec Logto
Ce guide suppose que vous avez créé une Application de type "Machine-to-machine" dans la Console d'administration.
Introduction
Machine-to-machine (M2M) est une pratique courante pour s'authentifier si vous avez une application (pas un utilisateur) qui doit communiquer directement avec des ressources (généralement, l'utilisation d'une application M2M ne nécessite pas d'interactions utilisateur, donc elle n'a pas d'interface utilisateur). Par exemple, un service API qui met à jour les données personnalisées des utilisateurs dans Logto, un service statistique qui récupère les commandes quotidiennes, etc.
Étant donné que Logto utilise le contrôle d’accès basé sur les rôles (RBAC) comme sa politique de contrôle d'accès, l'attribution de rôles M2M aux applications M2M est nécessaire pour protéger votre API qui nécessite une communication directe avec le service.
Pour en savoir plus sur notre RBAC actuel et la différence entre le rôle utilisateur et le rôle M2M, consultez Configurer les rôles pour en savoir plus.
Il existe deux cas d'utilisation courants des applications machine-to-machine dans Logto :
- Accéder à Logto Management API : Dans ce cas, vous devez attribuer un rôle M2M qui inclut la
permission all
de la Logto Management API intégrée à votre application M2M. - Accéder à votre ressource API : Dans ce cas, vous devez attribuer des rôles M2M qui incluent des permissions de vos ressources API à votre application M2M.
Pendant le processus de création de l'application M2M, vous serez dirigé vers une page où vous pouvez attribuer des Rôles M2M à vos applications :
Ou vous pouvez également attribuer ces rôles sur la page de détails de l'application M2M lorsque vous avez déjà créé une application M2M :
Maintenant, parcourons le processus de bout en bout. Pour plus de clarté, nous séparerons les étapes pour accéder à Logto Management API et à d'autres ressources API. Et nous supposons que vous avez déjà créé une application M2M dans Logto.
Récupérer un jeton d’accès
Notions de base sur la requête de jeton d’accès
L'application M2M effectue une requête POST
vers le point de terminaison de jeton pour récupérer un jeton d’accès (Access token) en ajoutant les paramètres suivants en utilisant le format application/x-www-form-urlencoded
dans le corps de l'entité de la requête HTTP :
- grant_type : Doit être défini sur
client_credentials
- resource : La ressource à laquelle vous souhaitez accéder
- scope : La portée de la requête d’accès
Vous devez également inclure les informations d'identification de votre application M2M dans l'en-tête de la requête pour que le point de terminaison de jeton puisse authentifier votre application M2M.
Cela est réalisé en incluant les informations d'identification de l'application dans le formulaire d' Authentification (Basic authentication) dans l'en-tête de la requête Authorization
, où le nom d'utilisateur est l'ID de l'application et le mot de passe est le secret de l'application.
Vous pouvez trouver l'ID de l'application et le secret de l'application sur la page des détails de votre application M2M :
Un exemple de requête de jeton d’accès est :
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
Demander un jeton d’accès
Dans la démonstration suivante, remplacez https://your.logto.endpoint
par le point de terminaison Logto que vous ciblez. Pour Logto Cloud, ce sera https://{your-tenant-id}.logto.app
.
- Pour Logto Management API
- Pour votre ressource API
Logto fournit une ressource intégrée "Logto Management API", c'est une ressource en lecture seule avec la permission all
pour accéder à Logto Management API, vous pouvez la voir dans votre liste de ressources API. L'indicateur de ressource API suit le modèle https://{your-tenant-id}.logto.app/api
, et cela sera votre valeur de ressource utilisée dans le corps de la requête de jeton d’accès.
Avant d'accéder à Logto Management API, assurez-vous que votre application M2M a été assignée avec des rôles M2M qui incluent la permission all
de cette ressource intégrée "Logto Management API".
Logto fournit également un rôle M2M préconfiguré "Logto Management API access" pour les nouveaux locataires créés, auquel la permission all
de la ressource Logto Management API a déjà été assignée. Vous pouvez l'utiliser directement sans configurer manuellement les permissions. Ce rôle préconfiguré peut également être modifié et supprimé selon les besoins.
Maintenant, composez tout ce que nous avons et envoyez la requête :
- Node.js
- cURL
const logtoEndpoint = 'https://your.logto.endpoint'; // Remplacez par votre point de terminaison 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'
N'oubliez pas de remplacer les valeurs réelles par les vôtres.
Pour les utilisateurs de Logto Cloud : lorsque vous interagissez avec Logto Management API, vous ne pouvez pas utiliser de domaine personnalisé, utilisez le point de terminaison Logto par défaut https://{your_tenant_id}.logto.app/oidc/token
pour obtenir des jetons d’accès.
Dans votre liste de ressources API, trouvez l'identifiant API que l'application doit accéder. Si vous n'avez pas ajouté la ressource API dans Logto ou ne savez pas ce qu'est une ressource API, consultez Ressource API.
Supposons que nous ayons les permissions read:products
et write:products
sous cette ressource API "Online Shopping".
Avant d'accéder à votre ressource API, assurez-vous que votre application M2M a été attribuée avec des rôles M2M qui incluent des permissions de votre ressource API.
Maintenant, composez tout ce que nous avons et envoyez la requête :
- 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'
Réponse du jeton d’accès
Un corps de réponse d'accès réussi serait comme :
{
"access_token": "eyJhbG...2g", // Utilisez ce jeton pour accéder à Logto Management API
"expires_in": 3600, // Expiration du jeton en secondes
"token_type": "Bearer", // Type d'authentification pour votre requête lors de l'utilisation du jeton d’accès
"scope": "all" // portée `all` pour Logto Management API
}
Logto ne prend pas actuellement en charge l'application M2M pour représenter un utilisateur. Le sub
dans la charge utile du jeton d’accès sera l'ID de l'application.
Accéder à la ressource en utilisant le jeton d’accès
Vous pouvez remarquer que la réponse du jeton a un champ token_type
, qui est fixé à Bearer
.
Ainsi, vous devez placer le jeton d’accès dans le champ Authorization
des en-têtes HTTP avec le format Bearer (Bearer YOUR_TOKEN
) lorsque vous interagissez avec votre serveur de ressource API.
- Interagir avec Logto Management API
- Interagir avec votre ressource API
Utilisation du jeton d’accès (Jeton d’accès) demandé avec la ressource API de gestion intégrée de Logto https://[your-tenant-id].logto.app/api
pour obtenir toutes les applications dans Logto :
- Node.js
- cURL
const logtoEndpoint = 'https://your.logto.endpoint'; // Remplacez par votre point de terminaison Logto
const accessToken = 'eyJhb...2g'; // Jeton d’accès
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'
N'oubliez pas de remplacer les valeurs réelles par les vôtres. La valeur après Bearer
doit être le jeton d’accès (JWT) que vous avez reçu.
En utilisant le jeton d’accès demandé avec la ressource API https://shopping.api
pour obtenir tous les produits dans l'API de shopping :
- Node.js
- cURL
const apiEndpoint = 'https://your.api.endpoint';
const accessToken = 'eyJhb...2g'; // Jeton d’accès
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 # Jeton d’accès
Authentification
Si vous protégez vos propres ressources API autres que Logto Management API, n'oubliez pas de mettre en œuvre l'authentification pour votre ressource. Consultez Protéger votre API pour plus de détails.