Présentation
Advanza est une plateforme SaaS marketing multi-tenant qui prend en charge OpenID Connect (OIDC) et OAuth 2.0 pour l'authentification sécurisée et l'authentification unique (SSO). Ce guide couvre les flux pris en charge, les points de terminaison, les scopes et les bonnes pratiques pour intégrer l'authentification Advanza dans vos applications.
Protocole: OpenID Connect 1.0 (basé sur l'Authorization Code Grant d'OAuth 2.0)
Fournisseur: Advanza (via OpenIddict 5.x)
Multi-tenant: Prise en charge complète – chaque organisation est un tenant distinct
Sécurité: HTTPS obligatoire, PKCE recommandé pour les SPA, certificats pour les clients confidentiels
Flux d'authentification pris en charge
Authorization Code Flow (recommandé)
Le flux OAuth 2.0 Authorization Code est le flux recommandé et le plus sécurisé pour la plupart des applications, y compris les applications web et les applications monopages (SPA). Il utilise PKCE (Proof Key for Code Exchange) pour les clients publics afin de prévenir les attaques par interception du code d'autorisation.
Idéal pour : Applications web, SPA, applications mobiles, intégrations tierces
Refresh Token Flow
Utilisez les refresh tokens pour obtenir de nouveaux access tokens sans exiger une nouvelle connexion de l'utilisateur. Les refresh tokens sont valables 14 jours et peuvent être renouvelés pour maintenir la sécurité.
Idéal pour : Sessions longue durée, services en arrière-plan, accès hors connexion
Client Credentials Flow (hérité)
Le flux OAuth 2.0 Resource Owner Password Credentials est pris en charge pour la compatibilité ascendante avec les intégrations existantes. Les nouvelles intégrations doivent utiliser l'Authorization Code Flow à la place.
Idéal pour : Applications existantes, outils internes (déconseillé pour les nouveaux développements)
Points de terminaison de l'API
Tous les points de terminaison sont hébergés à l'adresse https://api.advanza.ai
Point de terminaison d'autorisation
GET /connect/authorize
Lance le flux d'autorisation OAuth. Redirige l'utilisateur pour qu'il se connecte via son fournisseur d'identité (Microsoft, Google, ou email/mot de passe).
Paramètres de requête :
client_id(obligatoire): L'identifiant de votre applicationredirect_uri(obligatoire): URL de redirection après authentificationresponse_type(obligatoire): Doit être 'code'scope(obligatoire): Liste de scopes séparés par des espaces (openid, email, profile, offline_access, roles)code_challenge(obligatoire pour les SPA): Code challenge PKCEcode_challenge_method(obligatoire avec code_challenge): 'S256'state(recommandé): Chaîne aléatoire pour prévenir les attaques CSRFtenant_id(facultatif): Tenant spécifique dans lequel s'authentifier
Point de terminaison de token
POST /connect/token
Échange un code d'autorisation contre des access tokens, un ID token, et un refresh token facultatif.
Format de la requête : application/x-www-form-urlencoded
Paramètres :
grant_type(obligatoire): 'authorization_code', 'refresh_token', ou 'password'code(obligatoire pour le flux authorization code): Code d'autorisation obtenu via /authorizeclient_id(obligatoire): L'identifiant de votre applicationclient_secret(obligatoire): Le secret de votre application (à garder confidentiel)redirect_uri(obligatoire): Doit correspondre à la requête /authorizecode_verifier(obligatoire pour les SPA): Code verifier PKCErefresh_token(pour le flux de rafraîchissement): Le refresh token à échangerusername & password(pour le flux password): Identifiants de l'utilisateur
Point de terminaison d'introspection de token
POST /connect/introspect
Valide et inspecte le contenu d'un access token ou d'un refresh token.
Configuration OpenID
GET /.well-known/openid-configuration
Point de terminaison de métadonnées OIDC standard. Retourne les informations de découverte, notamment les points de terminaison, les clés publiques, les scopes pris en charge et les grant types.
Scopes
Demandez des scopes via le paramètre scope de la requête d'autorisation :
openid (obligatoire)
Demande un ID token contenant les informations d'identité de l'utilisateur (subject claim, nom, ID de tenant, etc.)
Demande l'adresse email de l'utilisateur et le statut de vérification de l'email
profile
Demande les informations de profil de l'utilisateur : name, given_name, family_name
offline_access
Demande un refresh token pour prolonger l'accès sans nécessiter de nouvelle authentification
roles
Demande les rôles/permissions de l'utilisateur (par exemple « Owner », « Editor », « Viewer »)
Scope minimum pour la connexion : openid email profile
Exemple : Authorization Code Flow avec PKCE
Cet exemple illustre le flux recommandé pour les applications monopages (SPA) et les applications mobiles.
Étape 1 : générer le challenge PKCE
Créez un code verifier et un code challenge côté client :
// 1. Generate random code verifier (43-128 characters)
const codeVerifier = generateRandomString(128);
// 2. Create code challenge via SHA256 hash
const codeChallenge = await crypto.subtle.digest('SHA-256',
new TextEncoder().encode(codeVerifier)
);
// 3. Base64-URL encode the challenge
const codeChallengeB64 = base64UrlEncode(codeChallenge);
// Store codeVerifier in sessionStorage for Step 3
sessionStorage.setItem('pkce_verifier', codeVerifier);Étape 2 : rediriger vers le point de terminaison d'autorisation
Dirigez l'utilisateur vers la connexion :
GET /connect/authorize?
client_id={your_app_id}
&redirect_uri=https://your-app.com/callback
&response_type=code
&scope=openid email profile
&code_challenge={pkce_challenge}
&state={random_state}L'utilisateur sera redirigé vers son fournisseur d'identité (Microsoft, Google, ou email/mot de passe), procédera à l'authentification, puis sera redirigé vers votre redirect_uri avec un code d'autorisation.
Étape 3 : échanger le code contre des tokens
Depuis votre backend, échangez le code d'autorisation :
POST /connect/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&code={auth_code}
&client_id={your_app_id}
&client_secret={your_app_secret}
&redirect_uri=https://your-app.com/callback
&code_verifier={pkce_verifier}Étape 4 : réponse du token
En cas de succès, vous recevez :
{
"access_token": "eyJhbGciOiJSUzI1NiIs...",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "DefxA1234567890...",
"id_token": "eyJhbGciOiJSUzI1NiIs..."
}Étape 5 : vérifier l'ID token
Validez la signature de l'ID token à l'aide de la clé publique issue de /.well-known/openid-configuration, vérifiez les claims issuer et audience, puis extrayez les informations de l'utilisateur.
Claims des tokens
Claims de l'ID token
L'ID token (JWT) contient les informations d'identité de l'utilisateur :
{
"sub": "550e8400-e29b-41d4-a716-446655440000",
"email": "user@company.com",
"email_verified": true,
"name": "John Doe",
"given_name": "John",
"family_name": "Doe",
"tenant_id": "12345678-1234-1234-1234-123456789012",
"iss": "https://api.advanza.ai",
"aud": "your_app_id",
"iat": 1234567890,
"exp": 1234571490
}Claims principaux :
sub: Identifiant unique de l'utilisateur (Guid)email: Adresse email de l'utilisateuremail_verified: Indique si l'email est vérifiéname, given_name, family_name: Nom de l'utilisateurtenant_id: Tenant/organisation actif de l'utilisateuriss: Émetteur du token (toujours https://api.advanza.ai)aud: Audience visée (l'identifiant de votre application)iat: Date d'émission du token (timestamp Unix)exp: Expiration du token (timestamp Unix)
Claims de l'access token
L'access token (JWT) contient les informations d'autorisation :
{
"sub": "550e8400-e29b-41d4-a716-446655440000",
"email": "user@company.com",
"name": "John Doe",
"tenant_id": "12345678-1234-1234-1234-123456789012",
"roles": ["Owner"],
"scope": "openid email profile offline_access roles",
"iss": "https://api.advanza.ai",
"aud": "your_app_id",
"iat": 1234567890,
"exp": 1234571490
}Claims principaux :
sub: ID de l'utilisateuremail, name: Informations de l'utilisateurtenant_id: Tenant actif (à utiliser pour le routage multi-tenant)roles: Rôles de l'utilisateur au sein du tenantscope: Scopes accordésexp: Expiration (généralement 1 heure)
Utiliser l'access token pour : À inclure dans l'en-tête Authorization (Authorization: Bearer {access_token}) lors des appels aux API Advanza ou à votre backend.
Multi-tenant
Advanza est une plateforme multi-tenant. Chaque utilisateur peut appartenir à plusieurs organisations (tenants). Le claim tenant_id présent dans l'ID token et l'access token indique le contexte de tenant actif de l'utilisateur.
Tenant par défaut
Lors de la première connexion, l'utilisateur se voit attribuer un tenant par défaut. Le claim tenant_id sera renseigné avec l'ID de ce tenant.
Changer de tenant
Les utilisateurs membres de plusieurs tenants peuvent en changer en transmettant le paramètre tenant_id souhaité au point de terminaison d'autorisation :
GET /connect/authorize?
client_id={your_app_id}
&redirect_uri=https://your-app.com/callback
&response_type=code
&scope=openid email profile
&tenant_id=12345678-1234-1234-1234-123456789012
&code_challenge={pkce_challenge}Routage par tenant
Utilisez le claim tenant_id pour router les requêtes vers le bon contexte de tenant dans votre backend :
// Extract tenant from token claims
const tenantId = tokenClaims.tenant_id;
// Route request to tenant context
const tenantContext = getTenantContext(tenantId);
const result = await performAction(tenantContext, action);Bonnes pratiques de sécurité
Utiliser HTTPS en production
Toutes les requêtes OAuth doivent utiliser HTTPS pour protéger les identifiants et les tokens.
PKCE pour les SPA et applications mobiles
Utilisez toujours PKCE (Proof Key for Code Exchange) pour les clients publics. Cela prévient les attaques par interception du code d'autorisation.
Garder le client secret confidentiel
N'exposez jamais votre client secret dans du code côté client, dans des logs, ou dans un système de gestion de versions. Utilisez-le uniquement dans des communications backend-à-backend sécurisées.
Valider le paramètre state
Générez et validez toujours le paramètre state pour prévenir les attaques CSRF.
Vérifier les signatures des tokens
Validez toujours les signatures de l'ID token et de l'access token à l'aide de la clé publique issue du point de terminaison de configuration OIDC avant de faire confiance à leur contenu.
Stocker les refresh tokens de façon sécurisée
Stockez les refresh tokens de façon sécurisée (cookies HttpOnly ou stockage sécurisé, jamais localStorage). Définissez des durées d'expiration appropriées.
Gérer l'expiration des tokens
Les access tokens expirent au bout de 60 minutes. Mettez en place une logique de rafraîchissement de token pour maintenir un accès ininterrompu.
Assistance
Pour toute question, tout problème, ou toute aide à l'intégration, contactez notre équipe support :
Email : support@advanza.ai
Documentation : https://advanza.ai/docs
Statut : https://status.advanza.ai