Legal

OAuth 2.0 et SSO OpenID Connect

Guide complet pour intégrer l'authentification unique OpenID Connect avec Advanza.

Last updated: 26 août 2026

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 application
  • redirect_uri (obligatoire): URL de redirection après authentification
  • response_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 PKCE
  • code_challenge_method (obligatoire avec code_challenge): 'S256'
  • state (recommandé): Chaîne aléatoire pour prévenir les attaques CSRF
  • tenant_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 /authorize
  • client_id (obligatoire): L'identifiant de votre application
  • client_secret (obligatoire): Le secret de votre application (à garder confidentiel)
  • redirect_uri (obligatoire): Doit correspondre à la requête /authorize
  • code_verifier (obligatoire pour les SPA): Code verifier PKCE
  • refresh_token (pour le flux de rafraîchissement): Le refresh token à échanger
  • username & 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.)

email

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'utilisateur
  • email_verified: Indique si l'email est vérifié
  • name, given_name, family_name: Nom de l'utilisateur
  • tenant_id: Tenant/organisation actif de l'utilisateur
  • iss: É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'utilisateur
  • email, name: Informations de l'utilisateur
  • tenant_id: Tenant actif (à utiliser pour le routage multi-tenant)
  • roles: Rôles de l'utilisateur au sein du tenant
  • scope: Scopes accordés
  • exp: 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