Aller au contenu principal

Authentification

L'API MyTelevision utilise l'authentification par token JWT Bearer. Deux systemes d'authentification coexistent selon le mode d'utilisation.

Methodes d'authentification

MethodeDescriptionEndpoint de base
Auth classiqueEmail/password avec JWT/api/v2/auth/*
Account AuthSysteme multi-profil (Netflix-style)/api/v2/account-auth/*
Social AuthGoogle, Apple, Facebook via Firebase/api/v2/auth/social/*
2FA (TOTP)Authentification a deux facteurs/api/v2/account/2fa/*

Bearer Token (JWT)

Toutes les requetes authentifiees doivent inclure le header Authorization :

Authorization: Bearer <access_token>

Obtenir un token (Auth classique)

POST /api/v2/auth/login
Content-Type: application/json

{
"email": "[email protected]",
"password": "SecurePassword123!"
}

Reponse :

{
"accessToken": "eyJhbGciOiJSUzI1NiIs...",
"refreshToken": "dGhpcyBpcyBhIHJlZnJlc2...",
"expiresIn": 900,
"tokenType": "Bearer",
"user": {
"id": "uuid",
"email": "[email protected]",
"role": "USER"
}
}

Obtenir un token (Account Auth -- multi-profil)

Le systeme multi-profil fonctionne en deux etapes :

Etape 1 -- Valider les credentials

POST /api/v2/account-auth/login
Content-Type: application/json

{
"email": "[email protected]",
"password": "SecureP@ss123"
}

Reponse :

{
"accountId": "uuid",
"profiles": [
{ "id": "uuid", "name": "John", "avatar": "url", "type": "STANDARD" },
{ "id": "uuid", "name": "Kids", "avatar": "url", "type": "KIDS" }
],
"tempToken": "eyJhbG..."
}

Etape 2 -- Selectionner un profil

POST /api/v2/account-auth/select-profile
Content-Type: application/json
Authorization: Bearer <tempToken>

{
"profileId": "uuid",
"pin": "1234"
}
info

Le champ pin n'est requis que si le profil a un PIN configure.

Rafraichir un token

POST /api/v2/auth/refresh
Content-Type: application/json

{
"refreshToken": "dGhpcyBpcyBhIHJlZnJlc2..."
}

Reponse :

{
"accessToken": "eyJhbGciOiJSUzI1NiIs...",
"expiresIn": 900
}

Deconnexion

POST /api/v2/auth/logout
Authorization: Bearer <access_token>

Reponse : 204 No Content

Authentification sociale

L'API utilise Firebase comme identity provider pour les connexions sociales.

ProviderEndpoint
GooglePOST /api/v2/auth/social/google
ApplePOST /api/v2/auth/social/apple
FacebookPOST /api/v2/auth/social/facebook
Firebase (auto-detection)POST /api/v2/auth/firebase

Exemple de requete sociale

POST /api/v2/auth/social/google
Content-Type: application/json

{
"idToken": "firebase-id-token-from-client-sdk"
}

Gestion des comptes lies

MethodeEndpointDescription
POST/api/v2/auth/social/linkLier un nouveau provider au compte
DELETE/api/v2/auth/social/unlink/:providerDelier un provider
GET/api/v2/auth/social/accountsLister les comptes lies

Strategie de liaison de compte (ordre de priorite)

  1. Recherche par provider + providerUserId (compte social existant)
  2. Recherche par firebaseUid (utilisateurs Firebase legacy)
  3. Recherche par email (liaison au compte email existant)
  4. Creation d'un nouvel utilisateur (premiere inscription)

Authentification a deux facteurs (2FA / TOTP)

Authentification basee sur TOTP (Time-based One-Time Password), compatible avec Google Authenticator, Authy, etc.

Endpoints 2FA

MethodeEndpointDescriptionAuth
POST/account/2fa/setupInitialiser la configuration 2FAOui
POST/account/2fa/verifyVerifier le code et activer la 2FAOui
POST/account/2fa/disableDesactiver la 2FAOui
GET/account/2fa/statusStatut 2FAOui
POST/account/2fa/backup-codesRegenerer les codes de secoursOui

Flux d'activation 2FA

  1. POST /account/2fa/setup -- recoit secret + qrCodeDataUrl + otpauthUrl
  2. Scanner le QR code avec l'application d'authentification
  3. POST /account/2fa/verify avec le code a 6 chiffres -- recoit 10 codes de secours
  4. Stocker les codes de secours en lieu sur

Flux de login avec 2FA

Quand la 2FA est activee, le POST /account-auth/login retourne :

{
"requiresTwoFactor": true,
"temporaryToken": "eyJ...",
"expiresIn": 300,
"maskedEmail": "u***@example.com"
}

Le client doit alors appeler :

POST /api/v2/account-auth/verify-2fa
Authorization: Bearer <temporaryToken>
Content-Type: application/json

{
"code": "123456"
}
attention

Le temporaryToken est un JWT avec une TTL de 5 minutes. L'endpoint est rate-limite a 5 tentatives par minute (anti brute-force).

Codes de secours

  • 10 codes alphanumeriques a 8 caracteres
  • Usage unique
  • Regenerables via POST /account/2fa/backup-codes
  • Utilisables en remplacement du code TOTP

Securite

MesureDetail
Hash des mots de passebcrypt (cost 12)
Signature des tokensRS256
Rate limiting login5 tentatives / 15 min
Stockage des sessionsRedis
IP bindingOptionnel
Secrets TOTPChiffres AES-256-GCM au repos (production)

Validation des credentials

Email

  • Format email valide
  • Maximum 255 caracteres

Mot de passe

  • Minimum 8 caracteres
  • Au moins 1 majuscule
  • Au moins 1 chiffre
  • Au moins 1 caractere special

Codes d'erreur specifiques

Code HTTPMessageDescription
401Invalid credentialsEmail ou mot de passe incorrect
401Token expiredToken JWT expire
403Account suspendedCompte suspendu
409Email already existsEmail deja utilise
422Validation failedDonnees invalides
423Account lockedTrop de tentatives de connexion
429Too many attemptsRate limit depasse