Aller au contenu principal

Authentification

JWT Bearer tokens, refresh automatique, multi-tenancy via header et OIDC headless.

Flow d'authentification

  1. POST /auth/login → reçoit accessToken + refreshToken
  2. Chaque requête : Authorization: Bearer {accessToken} + X-Tenant-ID: {slug}
  3. Token expiré (401) → POST /auth/refresh → nouveaux tokens
  4. Refresh expiré → redirection vers /auth/login

Durée de vie des tokens

Caractéristiques des tokens d'accès et de rafraîchissement
TokenDuréeStockage recommandéRotation
Access Token1 heureMémoire / variableÀ chaque refresh
Refresh Token7 joursHttpOnly cookie ou SecureStoreÀ chaque utilisation

Rafraîchir un token

Rotation automatique : chaque refresh renvoie un nouveau pair de tokens. L'ancien refresh token est immédiatement invalidé.

POST /auth/refresh · Python
import requests

# Rafraîchir l'access token sans re-login
refresh_response = requests.post(
    'https://api.qualiforma.site/api/v1/auth/refresh',
    headers={
        'X-Tenant-ID': 'votre-tenant',
        'Content-Type': 'application/json'
    },
    json={'refreshToken': 'eyJhbGci...ancien-refresh-token...'}
)
data = refresh_response.json()['data']
new_access_token = data['accessToken']
new_refresh_token = data['refreshToken']  # rotation à chaque refresh
print("Token rafraîchi avec succès")

Payload JWT

Exemple décodé

JWT payload · JSON
{
  "sub": "usr_abc123",
  "email": "admin@example.com",
  "tenantId": "ten_xyz789",
  "tenantSlug": "votre-tenant",
  "iat": 1700000000,
  "exp": 1700003600
}

Champs disponibles

ChampTypeDescription
substringID utilisateur (usr_...)
emailstringEmail de l'utilisateur
tenantIdstringID interne du tenant (ten_...)
tenantSlugstringSlug du tenant (URL-friendly)
iatnumberIssued At — timestamp Unix d'émission
expnumberExpiration — timestamp Unix (iat + 3600)

Multi-tenancy

Chaque organisation QualiForma est un tenant isolé. Le header X-Tenant-ID est obligatoire sur toutes les requêtes, y compris /auth/login.

X-Tenant-ID: votre-tenant-slug

Le slug tenant est la partie URL-friendly du nom de votre organisation. Retrouvez-le dans Administration → Paramètres → Informations du tenant.

Rôles et permissions

Rôles RBAC et niveaux d'accès
RôleAccès
ADMINAccès complet au tenant — gestion utilisateurs, formations, config
CREATORCréer et gérer ses propres formations, inscrire des apprenants
LEARNERConsulter le catalogue, suivre ses formations, télécharger ses documents
TRAINERAnimer des sessions, gérer les présences
FUNDERConsulter les inscriptions et documents de son périmètre

Vérification du rôle

Les endpoints vérifient toujours les permissions côté serveur. La vérification côté client est optionnelle pour l'UX.

Vérifier le rôle avant appel · Python
import requests

# Vérifier le rôle avant d'appeler un endpoint protégé
me = requests.get(
    'https://api.qualiforma.site/api/v1/auth/me',
    headers={
        'Authorization': f'Bearer {access_token}',
        'X-Tenant-ID': 'votre-tenant'
    }
).json()['data']

role = me['role']
if role not in ['ADMIN', 'CREATOR']:
    raise PermissionError(f"Rôle {role} insuffisant pour cette opération")

# Continuer — l'endpoint vérifie aussi côté serveur
response = requests.post(
    'https://api.qualiforma.site/api/v1/courses',
    headers={
        'Authorization': f'Bearer {access_token}',
        'X-Tenant-ID': 'votre-tenant',
        'Content-Type': 'application/json'
    },
    json={'title': 'Ma nouvelle formation', 'description': '...'}
)

OIDC Headless

Pour les organisations avec un SSO existant (Azure AD, Okta, etc.), QualiForma supporte l'authentification OIDC headless par tenant. Le flux consiste à échanger un token OIDC contre des tokens QualiForma via POST /auth/oidc/exchange. Contactez le support pour la configuration.