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));