1 000 FAQ, 500 tutoriels et vidéos explicatives. Ici, il n'y a que des solutions !
Sécuriser un flux MP3/AAC ou HLS par clé unique
Ce guide explique comment maintenir un contrôle sur vos flux de Streaming Radio MP3/AAC ou HLS en activant la protection par clé unique (token) afin de décider p.ex si un auditeur peut écouter votre radio ou non.
Préambule
- Le principe est simple: à chaque connexion, vous effectuerez une requête vers l'API Infomaniak qui vous renverra en retour un token unique avec une durée de vie limitée et paramétrable. Ce token autorisera quiconque le possède à consommer le flux pendant cette période.
- Vous pouvez protéger un flux MP3/AAC ou HLS indépendamment l’un de l’autre (idem pour la géolocalisation d'ailleurs).
- L'activation de la restriction implique un changement de la configuration du flux qui peut prendre quelques minutes pour être répliquée sur les serveurs.
Protéger un flux audio par clé unique
Pour ce faire, il suffit de se rendre dans les paramètres de restrictions et d'activer la protection par token sur le flux que vous souhaitez sécuriser:
- Cliquez ici afin d'accéder à la gestion de votre produit sur le Manager Infomaniak (besoin d'aide ?).
- Cliquez directement sur le nom attribué au produit concerné.
- Cliquez sur le nom du flux audio concerné.
- Cliquez sur Restrictions dans le menu latéral gauche.
- Choisissez HLS si nécessaire.
- Cliquez sur le menu d'action ⋮ situé à droite de l'élément concerné.
- Cliquez sur Restriction par token:
Activez ensuite la protection.
Attention, au moment où vous allez activer cette option, l'accès au flux sera instantanément bloqué pour les nouvelles connexions. Adaptez vos Players pour prendre en compte la restriction, comme illustré dans l'exemple ci-dessous :
Créer un token API Radio
Pour avoir accès à l'API Radio, vous devez en premier lieu vous authentifier grâce à un token application. Cette étape n'est à faire qu'une seule fois. Pour créer ce token d'application, lire ce guide.
Le scope est radio et la durée de vie illimité pour éviter de devoir régénérer un code de manière régulière. Une fois le token généré, le copier afin de le coller dans l'exemple ci-dessous.
Exemple d'utilisation en langage PHP
Pour MP3/AAC ou HLS, le code peut être sensiblement le même, seule l'URL appelée en POST change au niveau de sa forme.
Collez ci-dessous le token généré en lieu et place de celui indiqué:
if (!defined('API_TOKEN')) {
define('API_TOKEN', 'AYF5lSh3c7Xy5974Fs12RTkTThujT-L9R4Xk2ZfGyP6sV7QqJ1oC3jD8nFtKzIxUeMw5oNzR6');
}
/**
* Fonction générique pour executer des requêtes cURL
*
* @param string $method MĂ©thode HTTP (GET, POST, PUT, etc...)
* @param string $url Url de l'api a requĂŞter
* @param array $headers Liste des en-têtes HTTP (l'autorisation doit être passée ici avec un ['Authorization: Bearer ']
* @param array $payload Un tableau contenant les données pour créer un token
* @return mixed
*/
function request(string $method, string $url, array $headers = [], array $payload = []): mixed{
// prepare options array
$opts = [
CURLOPT_HTTPHEADER => $headers,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_URL => $url,
CURLOPT_CUSTOMREQUEST => strtoupper($method),
];
// add payload if relevant
if ($payload && $method !== 'GET') {
$opts[CURLOPT_POSTFIELDS] = json_encode($payload);
}
$ch = curl_init();
curl_setopt_array($ch, $opts);
$result = curl_exec($ch);
if(curl_errno($ch)){
throw new Exception(curl_error($ch));
}
$data = json_decode($result, true);
if ($data['result'] === 'error') {
throw new Exception($data['error']['description'] ?? 'an error occured');
}
return $data['data'];
}
On va créer le token, l'URL de création du token se décompose comme suit :
- Pour un flux MP3 / AAC
POST https://api.infomaniak.com/1/radios/acl/streams/mountpoint.mp3/token
Exemple pour protéger https://newradiotest.ice.infomaniak.ch/newradiotest-128.aac
la route sera: https://api.infomaniak.com/1/radios/acl/streams/newradiotest-128.aac/token
- Pour un flux HLS
POST https://api.infomaniak.com/1/radios/acl/hls_streams/<stream>/token
Exemple pour protéger https://myradiostream.radiohls.infomaniak.com/myradiostream/manifest.m3u8
la route sera: https://api.infomaniak.com/1/radios/acl/hls_streams/myradiostream/token
Exemple dans le cas du MP3 / AAC, pensez Ă ajuster :
$token = request(
'POST',
'https://api.infomaniak.com/1/radios/acl/streams/newradiotest-128.aac/token',
// en-tĂŞte d'authorization
[
'Authorization: Bearer ' . API_TOKEN,
'Content-Type: application/json',
],
/**
* payload pour créer le token, vous pouvez passer les valeurs suivantes
* window | 300 | optionnel | durée de validité du token (default: 5 minutes)
*/
[
'window' => 3600, // 1h validity
]
);
Il est important de noter que si ce code est généré au moment du chargement de la page, l'auditeur aura "window" secondes pour lancer la lecture du flux. Au-delà de ce délai, le token expirera, et le flux ne pourra plus être lancé à moins que la page ne soit rechargée. Selon vos besoins et votre cas d'utilisation, il sera nécessaire d'ajuster ce délai de la meilleure manière possible.
Il faudra également remplacer ci-dessous l'URL de lecture de votre flux à la place de celle indiqué tout en conservant le paramètre $token
à la fin. Et pour finir, on affiche le Player (ici une simple balise html5, mais on peut ajouter bien sûr n'importe quelle surcouche après, le token étant passé dans les paramètres $_GET
de l'url).
$streamUrl = "https://newradiotest.ice.infomaniak.ch/newradiotest-128.aac?$token";
echo "<audio controls=""><source src="$streamUrl"></audio>";