Streaming API
Gestion des tokens de streaming securises pour l'acces aux medias.
Base URL : /api/v2/streaming
Vue d'ensemble
Le streaming utilise des tokens temporaires pour securiser l'acces aux medias :
1. Le client demande un token de streaming
2. L'API verifie les droits (abonnement, profil, restrictions)
3. L'API genere un token signe avec expiration
4. Le client utilise le token pour acceder au stream
5. Le CDN/API verifie le token avant de servir le media
Endpoints
| Methode | Endpoint | Description | Auth |
|---|---|---|---|
| POST | /streaming/token | Generer un token de streaming | Oui |
| GET | /streaming/verify | Verifier et valider un token | Non |
| POST | /streaming/revoke | Revoquer un token | Oui |
| POST | /streaming/drm/license | Obtenir une licence DRM | Oui |
POST /streaming/token
Generer un token de streaming securise.
POST /api/v2/streaming/token
Authorization: Bearer <token>
Content-Type: application/json
{
"contentId": "uuid",
"contentType": "MOVIE",
"quality": "1080p"
}
Reponse 200 OK
{
"streamToken": "eyJhbG...",
"expiresAt": "2025-01-15T11:30:00.000Z",
"maxUses": 5,
"streamUrl": "https://cdn.mytelevision.app/stream/..."
}
GET /streaming/verify
Verifier et valider un token de streaming.
GET /api/v2/streaming/verify?token=eyJhbG...
Reponse 200 OK
{
"valid": true,
"contentId": "uuid",
"contentType": "MOVIE",
"quality": "1080p",
"remainingUses": 4,
"expiresAt": "2025-01-15T11:30:00.000Z"
}
POST /streaming/revoke
Revoquer un token de streaming.
POST /api/v2/streaming/revoke
Authorization: Bearer <token>
Content-Type: application/json
{
"streamToken": "eyJhbG..."
}
POST /streaming/drm/license
Obtenir une licence DRM pour le contenu premium.
POST /api/v2/streaming/drm/license
Authorization: Bearer <token>
Content-Type: application/json
{
"contentId": "uuid",
"drmType": "widevine",
"challenge": "base64-encoded-challenge"
}
Structure du token
{
// Claims standards
"sub": "user-uuid",
"iat": 1234567890,
"exp": 1234571490, // +1h
// Claims custom
"contentId": "content-uuid",
"contentType": "MOVIE",
"quality": "1080p",
"deviceId": "device-uuid",
"profileId": "profile-uuid",
"ipAddress": "192.168.1.1",
"maxUses": 5,
"jti": "token-uuid" // ID unique
}
Protections de securite
| Protection | Description |
|---|---|
| Expiration | Token valide 1h maximum |
| Max Uses | 5 utilisations maximum par token |
| IP Binding | Token lie a l'adresse IP d'origine |
| Device Binding | Token lie a l'appareil |
| Signature | Token signe HMAC-SHA256 |
| Revocation | Revocation immediate possible via blacklist Redis |
Verifications avant diffusion
Avant de servir un stream, le systeme verifie :
- Signature valide -- Token non modifie
- Non expire --
exp > now - Uses restantes --
count < maxUses - IP match -- IP actuelle = IP du token
- Non revoque -- Token absent de la blacklist Redis
- Abonnement actif -- L'utilisateur a acces au contenu
Qualites disponibles
| Qualite | Resolution | Bitrate approximatif |
|---|---|---|
auto | Adaptive | Variable |
480p | 854x480 | ~1.5 Mbps |
720p | 1280x720 | ~3 Mbps |
1080p | 1920x1080 | ~6 Mbps |
4k | 3840x2160 | ~15 Mbps |
DRM (Digital Rights Management)
Pour le contenu premium, le DRM est applique selon la plateforme :
| DRM | Plateforme |
|---|---|
| Widevine | Android, Chrome |
| FairPlay | iOS, Safari |
| PlayReady | Windows |
Bonnes pratiques
- Demander un nouveau token avant chaque lecture
- Ne pas stocker les tokens de streaming cote client
- Gerer les erreurs et redemander un token si necessaire
- Respecter les limites de qualite selon l'abonnement de l'utilisateur
Codes d'erreur
| Code | Message | Description |
|---|---|---|
| 401 | Token expired | Token de streaming expire |
| 403 | Subscription required | Abonnement requis pour ce contenu |
| 403 | Max uses exceeded | Nombre maximum d'utilisations atteint |
| 403 | IP mismatch | Adresse IP differente de l'original |
| 404 | Content not found | Contenu introuvable |
| 410 | Token revoked | Token revoque |