TURN-сервер для WebRTC с аутентификацией REST API

Я пытаюсь настроить сервер TURN rfc5766-turn-server для webRTC из здесь< /а>. Мне удалось успешно передать свое видео через этот сервер TURN, используя файл turnuserdb.conf, в котором у меня есть имя пользователя и пароль (my_user_name:my_password). И на стороне веб-клиента я использовал:

"iceServers":{[
    "url": "turn:my_user_name,@turn_server_ip",
    "credential":"my_password"
}]

Я пытаюсь использовать функцию REST API, которая поставляется с сервером TURN, чтобы избежать отправки пароля по сети или хранения его на стороне клиента. Я следовал этой спецификации и это объяснение в Rest API

Однако, к сожалению, я получаю 401 и не могу пройти аутентификацию.

Вот что я сделал точно:

  1. Я создал секрет «my_secret» и запустил сервер поворота следующим образом:

    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
    

    (Я просто заменил IP-адрес на xx.xxx.xx.xx yy.yyy.yyy.yy zz.zzz.zz.zzz)

  2. Позже я сгенерировал отметку времени, которая будет сейчас + 1 час, поэтому я запустил nodejs:

    Date.now()+1000*60*60;      // output 1433895918506.
    

    Я сгенерировал временный пароль на этом сайте, используя свой секрет, и получил результат 0ca57806bdc696b3129d4cad83746945b00af77b

  3. Я закодировал пароль в base64.

  4. Теперь я попытался зарегистрировать связь с сервером поворота из веб-клиента, используя временное имя пользователя: 1433895918506:my_user_name и пароль: MGNhNTc4MDZiZGM2OTZiMzEyOWQ0Y2FkODM3NDY5NDViMDBhZjc3Yg==, в веб-клиенте теперь я использую

    "iceServers":"url":"turn:1433895918506:my_user_name@turn_server_ip","credential":"MGNhNTc4MDZiZGM2OTZiMzEyOWQ0Y2FkODM3NDY5NDViMDBhZjc3Yg=="}]
    

Но это не работает, я получаю:

401 user <1433895918506:my_user_name>  incoming packet message processed, error 401: Unauthorised.

Можете ли вы помочь мне понять, что не так?


person Michael P    schedule 10.06.2015    source источник


Ответы (1)


когда я сгенерировал учетные данные с вашим именем и секретом, я получил 1Dj9XZ5fwvKS6YoQZOoORcFnXaI=, а не MGNhNTc4MDZiZGM2OTZiMzEyOWQ0Y2FkODM3NDY5NDViMDBhZjc3Yg==, проверьте ваш алгоритм/код на наличие ошибок.

и время указано в Unix Timestamp, то есть в секундах, а не в миллисекундах, как вы сделали (хотя это не должно влиять, но просто делает ваши учетные данные бессрочными)

проверьте, синхронизированы ли часы в вашей системе и в системе, где работает сервер TURN, (по крайней мере, с разницей в несколько дней), и в целом, чтобы избежать проблем с синхронизацией часов, лучше использовать ttl как 24 часа, поэтому ваша временная метка:

timestamp=  parseInt(Date.now()/1000) + 24*3600

код для создания учетных данных TURN:

var crypto = require('crypto');

function getTURNCredentials(name, secret){    

    var unixTimeStamp = parseInt(Date.now()/1000) + 24*3600,
        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
    };
}
person mido    schedule 10.06.2015
comment
Да, у меня была ошибка при преобразовании из шестнадцатеричного формата в base64, и я пропустил преобразование миллисекунд в секунды. Спасибо за помощь - person Michael P; 10.06.2015