J'ai construit coturn et l'exécute avec succès. ip: 192.168.1.111. Maintenant, la question à laquelle je suis confronté est d'obtenir les informations d'identification de Turn via REST API. http://tools.ietf.org/html/draft-uberti-behave-turn-rest-00 Selon le passage, le format de la requête devrait être
GET /?service=turn&username=mbzrxpgjys
et la réponse devrait être JSON
. Maintenant ma question est:
a) Comment configurer et commander TURN SERVER pour le faire fonctionner en mode REST API
?
b) Comment écrire une requête http dans le bon format pour que TURN SERVER
puisse répondre correctement? Pourriez-vous me donner un exemple?
Peu de choses à clarifier ici sont:
GET /?service=turn&username=mbzrxpgjys
qui retourne un JSON, est juste un suggéré uri pour récupérer limité dans le temps TURN du serveur, vous n'avez pas à suivre cela, votre uri peut être simplement /?giveMeCredentials
. En fait, j'utilise ma connexion socket pour récupérer ces données, pas un appel http direct avec une réponse json. En fin de journée, peu importe la façon dont vous (le client qui utilise ledit TURN) obtenez ces informations d’identité tant qu’elles sont valides.
Vous ne faites aucune demande directement au serveur TURN, no rest api appel au serveur TURN est sous votre contrôle.
vous allouez une clé secrète lorsque vous démarrez le serveur TURN, cela peut être pris à partir d'une base de données (donc modifiable dynamiquement), mais je suis paresseux, je l'ai simplement codé en dur, et je l'ai donné dans le fichier de configuration à tour REST API. Dans le cadre de la commande turn, turnserver ... --use-auth-secret --static-auth-secret=MySecretKey
À présent, dans votre serveur d'applications, vous utiliseriez la même clé secrète pour générer des informations d'identification. Pour un nom d'utilisateur, il s'agit d'un horodatage UNIX et d'une chaîne (aléatoire ou id utilisateur ou autre) séparée par :
et le mot de passe correspondant à HMAC avec votre clé secrète.
À propos de l’horodatage UNIX, il s’agit du temps dans le serveur TURN jusqu’à ce que vos informations d’identité soient valides. Ainsi, ce calcul vous permet de prendre en compte la différence d’horloge entre votre serveur d’application et votre serveur tour.
Maintenant, un exemple de code tiré de ma réponse à une autre question
commande pour indiquer le serveur TURN:
turnserver -v --syslog -a -L xx.xxx.xx.xx -X yy.yyy.yyy.yy -E zz.zzz.zz.zzz --max-bps=3000000 -f -m 3 --min-port=32355 --max-port=65535 --use-auth-secret --static-auth-secret=my_secret --realm=north.gov --cert=turn_server_cert.pem --pkey=turn_server_pkey.pem --log-file=stdout -q 100 -Q 300 --cipher-list=ALL
node.js
code pour la création des informations d'identification TURN sur le serveur d'applications:
var crypto = require('crypto');
function getTURNCredentials(name, secret){
var unixTimeStamp = parseInt(Date.now()/1000) + 24*3600, // this credential would be valid for the next 24 hours
username = [unixTimeStamp, name].join(':'),
password,
hmac = crypto.createHmac('sha1', secret);
hmac.setEncoding('base64');
hmac.write(username);
hmac.end();
password = hmac.read();
return {
username: username,
password: password
};
}
Code du navigateur pour utiliser ceci:
...
iceServers:[
{
urls: "turn:turn_server_ip",
username: username,
credential:password
}
...
Je suis récemment tombé sur un problème similaire (obtenir l'API REST fonctionnant avec le serveur TURN) et appris récemment que le serveur TURN ne prend pas en charge les appels d'API REST et fournit uniquement la prise en charge d'un format secret partagé lorsque nous activons REST API dans la configuration TURN. Le draft fournit uniquement des informations sur les éléments à prendre en compte lors de la mise en œuvre de cette REST API et de WE pour créer l'API nous-mêmes ou utiliser quelque chose comme turnhttp. pour générer le combo nom d'utilisateur temporaire.
Comme @mido détaillé, vous pouvez implémenter la partie génération de nom d'utilisateur/mot de passe dans l'application elle-même. Mais si vous avez des raisons de séparer cette application de l'application et souhaitez l'implémenter en tant que service d'API totalement différent, au lieu d'implémenter une API complète selon le draft , je suis tombé sur un autre post dans lequel OP a fourni un script PHP pour générer le nom d'utilisateur et le mot de passe temporaires. Celui-ci fonctionne plutôt bien une fois que vous avez modifié la fonction hash_hmac () comme suit:
$turn_password = hash_hmac('sha1', $turn_user, $secret_key, true);
Nous devons coder en base64 la sortie RAW de hash_hmac pour que cela fonctionne et je crois que c'est pourquoi il ne fonctionnait pas pour le PO dans ce lien.
Vous devriez pouvoir tester l'authentification à l'aide de turnutils_uclient command pour vérifier que la liste déroulante nom d'utilisateur/mot de passe temporaire fonctionne comme prévu.
turnutils_uclient -y -u GENERATED_USERNAME -w GENERATED_PASSWORD yourturnserver.com
Une fois que vous avez vérifié l'authentification et vérifié son fonctionnement, vous pouvez configurer le serveur Web pour le script PHP afin de le rendre disponible pour votre application et récupérer le combo nom d'utilisateur/mot de passe temporaire. En outre, vous devrez implémenter une autre configuration de sécurité (authentification) pour protéger l'API contre les accès non autorisés.
Je sais que ceci est un ancien post, je partage juste mes découvertes ici en espérant que cela sera utile à quelqu'un un jour.
Après de nombreuses heures de frustration, l'excellent answer here de @ Mido était la seule chose qui a réellement permis à l'API REST de CoTurn de fonctionner pour moi.
Mon serveur d'informations d'identification est PHP et j'utilise le fichier de configuration de CoTurn 'turnerver.conf'. Voici donc une traduction testée et fonctionnelle de son travail pour cette situation:
En supposant un 'secret partagé' 'de' 3575819665154b268af59efedee8826e ', voici les informations pertinentes de turnerver.conf:
lt-cred-mech
use-auth-secret
static-auth-secret=3575819665154b268af59efedee8826e
... et le PHP (qui m'a longtemps induit en erreur):
$ttl = 24 * 3600; // Time to live
$time = time() + $ttl;
$username = $time . ':' . $user;
$password = base64_encode(hash_hmac('sha1', $username, '3575819665154b268af59efedee8826e', true));