Aller au contenu principal

Sessions API

Gestion des sessions utilisateur a travers les appareils et les profils, avec monitoring de securite et controle des sessions.

Base URL : /api/v2/sessions

Endpoints

MethodeEndpointDescriptionAuth
GET/sessionsLister les sessions du compteOui
GET/sessions/profileSessions du profil courantOui
GET/sessions/currentSession couranteOui
GET/sessions/:idDetails d'une sessionOui
DELETE/sessions/:idRevoquer une sessionOui
DELETE/sessions/profile/allRevoquer toutes les sessions du profilOui
DELETE/sessionsRevoquer toutes les sessions du compteOui
POST/sessions/current/heartbeatMettre a jour l'activiteOui
POST/sessions/:id/challengeChallenger une session (haute securite)Oui

GET /sessions

Lister toutes les sessions actives du compte.

GET /api/v2/sessions?status=ACTIVE&limit=20
Authorization: Bearer <access_token>

Reponse 200 OK

{
"data": [
{
"id": "session-uuid-1",
"profileId": "profile-uuid",
"profileName": "John",
"deviceId": "device-uuid",
"deviceName": "iPhone 15 Pro",
"deviceType": "MOBILE_IOS",
"ipAddress": "192.168.1.100",
"location": {
"city": "Paris",
"country": "France"
},
"status": "ACTIVE",
"createdAt": "2025-01-15T08:00:00Z",
"lastActivityAt": "2025-01-15T10:30:00Z",
"expiresAt": "2025-01-22T08:00:00Z",
"isCurrent": true
}
],
"meta": {
"total": 2,
"maxConcurrent": 4,
"activeSessions": 2
}
}

GET /sessions/current

Details de la session courante.

GET /api/v2/sessions/current
Authorization: Bearer <access_token>

Reponse 200 OK

{
"id": "current-session-uuid",
"accountId": "account-uuid",
"profileId": "profile-uuid",
"deviceId": "device-uuid",
"deviceName": "iPhone 15 Pro",
"deviceType": "MOBILE_IOS",
"ipAddress": "192.168.1.100",
"userAgent": "MyTV/2.1.0 (iOS 17.2; iPhone15,2)",
"location": {
"city": "Paris",
"region": "Ile-de-France",
"country": "France",
"countryCode": "FR"
},
"status": "ACTIVE",
"createdAt": "2025-01-15T08:00:00Z",
"lastActivityAt": "2025-01-15T10:30:00Z",
"expiresAt": "2025-01-22T08:00:00Z",
"tokenRefreshCount": 3
}

DELETE /sessions/:id

Revoquer une session specifique.

DELETE /api/v2/sessions/:id
Authorization: Bearer <access_token>

Reponse 200 OK

{
"message": "Session revoked successfully",
"sessionId": "session-uuid"
}
attention

La session courante ne peut pas etre revoquee. Utilisez la deconnexion a la place.


DELETE /sessions

Revoquer toutes les sessions du compte (sauf la session courante).

DELETE /api/v2/sessions
Authorization: Bearer <access_token>

Reponse 200 OK

{
"message": "All other account sessions revoked",
"revokedCount": 5
}

POST /sessions/current/heartbeat

Mettre a jour le timestamp d'activite de la session.

POST /api/v2/sessions/current/heartbeat
Authorization: Bearer <access_token>
Content-Type: application/json

{
"currentContentId": "movie-uuid",
"contentType": "MOVIE",
"playbackPosition": 1845
}

Reponse 200 OK

{
"lastActivityAt": "2025-01-15T10:35:00Z",
"sessionValid": true
}

Statuts de session

StatutDescription
ACTIVESession valide et active
EXPIREDSession expiree naturellement
REVOKEDSession revoquee manuellement
CHALLENGEDRe-authentification requise

Limites de sessions concurrentes

Les sessions sont limitees par compte selon l'abonnement :

PlanSessions concurrentes max
Free1
Basic2
Premium4
Ultimate6

Lorsque la limite est depassee, la session la plus ancienne est automatiquement revoquee.

Cycle de vie d'une session

[Login/Select Profile] --> ACTIVE
ACTIVE --> ACTIVE (Heartbeat / Token Refresh)
ACTIVE --> EXPIRED (TTL depasse)
ACTIVE --> REVOKED (Revocation manuelle)
ACTIVE --> CHALLENGED (Activite suspecte)
CHALLENGED --> ACTIVE (Re-authentification reussie)
CHALLENGED --> REVOKED (Timeout)

Detection de session suspecte

Lorsqu'une activite suspecte est detectee :

{
"alert": "SUSPICIOUS_SESSION",
"session": {
"id": "session-uuid",
"location": "Unknown City, Russia",
"riskScore": 85
},
"recommendedAction": "REVOKE"
}

Donnees de localisation

La localisation de la session est derivee de l'adresse IP :

{
"location": {
"city": "Paris",
"region": "Ile-de-France",
"country": "France",
"countryCode": "FR",
"latitude": 48.8566,
"longitude": 2.3522,
"accuracy": "city"
}
}
Vie privee

Les coordonnees precises ne sont stockees que si l'utilisateur a donne son consentement.

Exemple d'integration

React Native -- Moniteur de session

import { useEffect } from 'react';
import { api } from './api';

export function useSessionMonitor() {
useEffect(() => {
const interval = setInterval(
async () => {
try {
await api.post('/sessions/current/heartbeat');
} catch (error) {
if (error.response?.status === 401) {
// Session revoquee, deconnecter l'utilisateur
logout();
}
}
},
5 * 60 * 1000,
); // toutes les 5 minutes

return () => clearInterval(interval);
}, []);
}

Codes d'erreur

CodeHTTPDescription
SESSION_001404Session introuvable
SESSION_002403Impossible de revoquer la session courante
SESSION_003403Session appartenant a un autre compte
SESSION_004401Session revoquee
SESSION_005401Session expiree
SESSION_006403Re-authentification requise