Aller au contenu principal

Authentification

Toutes les API IDCloud (contrats Web & SDK et API) utilisent OAuth2 avec le type d'octroi JWT Bearer (RFC 7523). Vous générez une assertion JWT de courte durée sur votre back-end, l'échangez contre un jeton Bearer, et utilisez ce jeton dans chaque appel ultérieur.

Ne faites jamais cela côté client

L'assertion JWT doit être générée uniquement sur votre back-end. N'exposez jamais votre clé privée dans du code front-end, des applications mobiles, des dépôts ou des journaux.

Obtention des identifiants

Avant de pouvoir générer des jetons, vous avez besoin d'un compte de service provisionné par Unico. Contactez le support Unico en fournissant :

  • Nom du compte de service (max 12 caractères)
  • Nom, e-mail et téléphone du responsable (numéros du Brésil, des États-Unis ou du Mexique uniquement)

Vous recevrez :

  • Nom unique du compte
  • ID du tenant
  • Payload JWT de base
  • Fichier de clé privée (format .pem)
Un compte par environnement

Gardez des comptes de service distincts pour UAT et Production.

Construction de l'assertion JWT

L'assertion est un JWT au format JWS compact : {Base64url(Header)}.{Base64url(Payload)}.{Base64url(Signature)}.

En-tête
{
"alg": "RS256",
"typ": "JWT"
}
Payload
ClaimValeurNotes
iss<account_name>@<tenant_id>.iam.acesso.ioFourni avec vos identifiants
audhttps://identityhomolog.acesso.io (UAT) ou https://identity.acesso.io (Production)Doit correspondre à l'hôte du point de terminaison du jeton
scope*Accorde toutes les permissions
iatHorodatage Unix (secondes)Heure d'émission du JWT
expiat + max 3600Ne peut pas dépasser 1 heure à partir de iat
{
"aud": "https://identity.acesso.io",
"scope": "*",
"iat": 1738086000,
"exp": 1738089600
}
Signature

Signez l'en-tête + le payload en utilisant RS256 (RSA + SHA-256) avec la clé privée .pem fournie par Unico.

N'ajoutez pas de claims supplémentaires

Tout champ non listé ci-dessus (ex. sub, jti, nbf) provoquera une erreur 1.2.22. Utilisez uniquement les claims indiqués.

Demande du jeton

Le point de terminaison du jeton est identique pour les deux contrats :

EnvironnementPoint de terminaison
ProductionPOST https://identity.acesso.io/oauth2/token
UATPOST https://identityhomolog.acesso.io/oauth2/token
Requête
ParamètreValeur
Content-Typeapplication/x-www-form-urlencoded
grant_typeurn:ietf:params:oauth:grant-type:jwt-bearer
assertionVotre JWT signé
curl -X POST https://identity.acesso.io/oauth2/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \
-d "assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."
Réponse
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 3600
}
ChampTypeDescription
access_tokenstringJeton d'accès JWT. À utiliser dans Authorization: Bearer <token> sur tous les appels API.
expires_inintegerDurée d'expiration en secondes. Exemple : 3600.
token_typestringToujours Bearer.

Utilisation du jeton

Ajoutez le jeton à l'en-tête Authorization de chaque requête API. L'en-tête est identique pour les deux contrats — ce qui diffère, c'est l'hôte et le chemin de l'API que vous appelez :

ContratHôte de productionHôte UAT
Web & SDKhttps://api.idcloud.unico.apphttps://api.idcloud.uat.unico.app
APIhttps://api.id.unico.apphttps://api.id.uat.unico.app

Web & SDKAuthorization est le seul en-tête d'authentification requis :

curl -X POST https://api.idcloud.unico.app/client/v1/process \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{ ... }'

APIAuthorization est utilisé conjointement avec l'en-tête APIKEY :

curl -X POST https://api.id.unico.app/processes/v1 \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "APIKEY: $API_KEY" \
-H "Content-Type: application/json" \
-d '{ ... }'

Renouvellement du jeton

Les jetons expirent après 3600 secondes. Implémentez un renouvellement proactif dans votre back-end :

  • Suivez expires_in de la réponse du jeton et stockez l'horodatage d'expiration.
  • Demandez un nouveau jeton lorsqu'il reste 10 minutes ou moins avant l'expiration.
  • N'attendez jamais un 401 en production pour déclencher un renouvellement.

Référence API

La spécification OpenAPI complète pour le point de terminaison du jeton est disponible dans authentication.yaml.

MéthodeCheminDescription
POST/oauth2/tokenÉchangez une assertion JWT signée contre un jeton d'accès Bearer

Codes d'erreur

CodeDescriptionAction
1.0.1L'ID fourni dans la construction de iss est incorrectVérifiez que le champ iss correspond à l'ID du tenant fourni lors de la génération de la clé privée
1.0.14L'application n'est pas activeVérifiez auprès du chef de projet si l'application utilisée est active
1.1.1Le paramètre scope n'a pas été fourniAjoutez "scope": "*" à votre payload JWT
1.2.4Assertion JWT invalideL'assertion JWT n'est plus valide. Deux causes : (a) l'heure actuelle est postérieure à exp (JWT véritablement expiré — générez une nouvelle assertion pour chaque demande de jeton) ; ou (b) exp dépasse iat + 3600 (durée de vie trop longue — limitez exp à iat + 3600).
1.2.5La validation du JWT a échouéLe JWT ne peut pas être validé. Vérifiez les paramètres et assurez-vous qu'il a été signé avec RS256 et la bonne clé privée
1.2.6La clé privée n'est plus valideLa clé privée utilisée pour signer le JWT n'est plus acceptable. Demandez de nouveaux identifiants pour le compte
1.2.7JWT déjà utiliséLe JWT n'est plus acceptable car il a déjà été utilisé. Générez une nouvelle assertion pour chaque demande de jeton
1.2.11Le compte n'est pas actifLe compte utilisé n'est pas actif
1.2.14Le compte manque des permissions nécessairesLe compte utilisé ne dispose pas des permissions nécessaires
1.2.18Compte temporairement verrouilléLe compte a été temporairement verrouillé en raison du dépassement du nombre de tentatives d'authentification invalides
1.2.19Usurpation d'identité non autoriséeLe JWT contient un claim sub pointant vers un compte non autorisé pour l'usurpation d'identité. Supprimez le claim sub du payload.
1.2.20Échec du décodage du JWTImpossible de décoder le JWT. Vérifiez le format du jeton et qu'il a été signé avec RS256.
1.2.21Mauvaise clé privée / Authentification échouéeLa signature du JWT n'a pas pu être vérifiée avec aucune clé connue pour ce compte. Vérifiez que vous utilisez le bon fichier .pem de clé privée pour ce compte de service et cet environnement.
1.2.22Champs non autorisés dans le payloadLe JWT contient des champs de payload supplémentaires non autorisés. Supprimez tout claim non listé dans ce guide (ex. sub, jti, nbf). Remarque : si vous avez inclus un claim sub et reçu l'erreur 1.2.19, cette erreur a la priorité.
1.3.1Restriction d'accès par IPVotre IP ne figure pas dans la liste d'autorisation de ce compte
1.3.2Restriction d'accès basée sur le tempsLa requête se situe en dehors de la fenêtre temporelle autorisée pour ce compte

Étapes suivantes