CoTURN: Как использовать API TURN REST?
Я создал coturn и успешно запускаю его. IP: 192.168.1.111. Теперь вопрос, с которым я столкнулся, - получить учетные данные Turn через REST API.
http://tools.ietf.org/html/draft-uberti-behave-turn-rest-00 Согласно проходу, формат запроса должен быть
GET /?service=turn&username=mbzrxpgjys
и ответ должен быть JSON
. Теперь мой вопрос:
a) Как настроить и запустить команду TURN SERVER, чтобы запустить ее в режиме REST API
?
b) Как написать http-запрос в правильном формате, чтобы TURN SERVER
мог правильно ответить? не могли бы вы привести мне пример?
Ответы
Ответ 1
Немногие вещи, которые нужно уточнить, следующие:
-
GET /?service=turn&username=mbzrxpgjys
, который возвращает JSON, - это всего лишь предлагаемый uri для получения ограниченных по времени учетных данных TURN с сервера, вам не обязательно следовать что ваш uri может быть просто /?giveMeCredentials
. На самом деле, я использую мое подключение сокета для извлечения этих данных, а не прямой HTTP-вызов с json-ответом. В конце дня не имеет значения, как вы (клиент, который использует указанный TURN), получите эти учетные данные, если они действительны.
-
Вы не делаете никаких запросов на сервер TURN напрямую, вызов no rest api на сервер TURN находится под вашим контролем.
-
вы выделяете секретный ключ при запуске сервера TURN, это может быть взято из db (таким образом, динамически изменяемо), но ленив, что я, просто жестко закодирован, и дал его в очередь config файл, также не забудьте включить REST API. В качестве части команды поворота turnserver ... --use-auth-secret --static-auth-secret=MySecretKey
-
Теперь, на вашем сервере приложений, вы будете использовать тот же секретный ключ для генерации учетных данных, для имени пользователя это временная метка UNIX и некоторая строка (может быть случайной или идентификатор пользователя или что-то еще), разделенная на :
и пароль будет HMAC имени пользователя с вашим секретным ключом.
-
о отметке времени UNIX, это время на сервере TURN, до которого ваши учетные данные должны быть действительными, поэтому, вычисляя это, убедитесь, что вы учитываете разницу в часах между сервером приложений и вашим ходом сервер.
Теперь некоторый пример кода, взятый из моего ответа на другой вопрос
для указания сервера 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
код для создания учетных данных TURN на сервере приложений:
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
};
}
Код браузера для использования:
...
iceServers:[
{
urls: "turn:turn_server_ip",
username: username,
credential:password
}
...
Ответ 2
Недавно я столкнулся с подобной проблемой (получив REST API, работающий с сервером TURN), и узнал, что сервер TURN вообще не поддерживает вызовы API REST и просто поддерживает поддержку формата аутентификации с общим секретом, когда мы включаем поддержку REST API в конфигурации TURN. В проекте только содержится информация о вещах, которые нам нужно учитывать при внедрении такого REST API, и нам нужно создать API самостоятельно или использовать что-то вроде turnhttp для создания комбинации паролей с временным именем пользователя.
Поскольку @mido подробно, вы можете реализовать часть генерации имени пользователя/пароля в самом приложении. Но если у вас есть причины отделить это от приложения и хотите реализовать его как совершенно другую службу API, вместо того, чтобы внедрять полный API в соответствии с проектом, я столкнулся с другим сообщением, в котором OP предоставил PHP-скрипт для создания темпа имя пользователя и пароль, и это работает очень хорошо, как только вы измените функцию hash_hmac() следующим образом:
$turn_password = hash_hmac('sha1', $turn_user, $secret_key, true);
Нам нужно, чтобы base64 кодировал вывод RAW hash_hmac, чтобы заставить его работать, и я считаю, что именно поэтому он не работал для OP в этой ссылке.
Вы должны проверить тестовую аутентификацию с помощью команды turnutils_uclient, чтобы убедиться, что команда temp username/password работает должным образом.
turnutils_uclient -y -u GENERATED_USERNAME -w GENERATED_PASSWORD yourturnserver.com
После того, как вы проверили аутентификацию и подтвердили, что она работает, вы можете настроить веб-сервер для скрипта PHP, чтобы сделать его доступным для вашего приложения и получить временное имя пользователя/пароль. Кроме того, для защиты API от несанкционированного доступа вам потребуется реализовать другую настройку безопасности (аутентификацию).
Я знаю, что это старый пост, просто делясь своими выводами, надеясь, что когда-нибудь он будет полезен кому-то.
Ответ 3
После многих часов разочарования, отличный ответ @Mido был единственной вещью, которая заставила CoTurn REST API работать на меня.
Мой сервер учетных данных - PHP, и я использую конфигурационный файл CoTurn 'turnserver.conf', поэтому здесь протестированный и рабочий перевод работы Mido для этой ситуации:
Предполагая, что "общий секрет" 3575819665154b268af59efedee8826e ', вот соответствующие записи turnserver.conf:
lt-cred-mech
use-auth-secret
static-auth-secret=3575819665154b268af59efedee8826e
... и PHP (который вводил меня в заблуждение целую вечность):
$ttl = 24 * 3600; // Time to live
$time = time() + $ttl;
$username = $time . ':' . $user;
$password = base64_encode(hash_hmac('sha1', $username, '3575819665154b268af59efedee8826e', true));