CoTURN:如何使用TURN REST API?

Lov*_*Lxr 17 api rest webrtc turn coturn

我已经建立了coturn并成功运行它.IP:192.168.1.111.现在我遇到的问题是通过REST API获取Turn凭证. 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正确回复?你能举个例子吗?

mid*_*ido 26

这里要澄清的几件事情是:

  • GET /?service=turn&username=mbzrxpgjys它返回一个JSON,只是一个建议的 uri,用于从服务器检索有时间限制的 TURN凭证,你不必遵循它,你的uri就可以了/?giveMeCredentials.实际上,我使用我的套接字连接来检索此数据,而不是使用json响应直接进行http调用.一天结束时,只要它们有效,您(使用所述TURN的客户端)如何获得这些凭证并不重要.

  • 您不直接向TURN服务器发出任何请求,您无法控制对TURN服务器的休息api调用.

  • 你在启动TURN服务器时分配一个密钥,这可以从一个db(因此动态变化)获取,但我只是懒惰,只是硬编码,并在转向配置文件中给它,也记得启用REST API.作为转弯命令的一部分,turnserver ... --use-auth-secret --static-auth-secret=MySecretKey

  • 现在,在您的应用程序服务器中,您将使用相同的密钥生成凭据,对于用户名,它是UNIX时间戳和一些字符串(可以是随机或用户ID或其他东西)分隔,:密码将是用户名的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
Run Code Online (Sandbox Code Playgroud)

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
    };
}
Run Code Online (Sandbox Code Playgroud)

浏览器代码使用此:

  ...
  iceServers:[
    {
      urls: "turn:turn_server_ip",
      username: username,
      credential:password
    }
  ...
Run Code Online (Sandbox Code Playgroud)

  • 今天我一整天都在费尽心思地尝试这个,只是为了随机地发现为了让它起作用,一个人“必须”还指定一个领域。如果配置中未设置“realm”选项,则该选项不起作用,并且会收到“realm <> user <>”错误消息。也许这可以节省一些人的头发! (3认同)

Hey*_*yJC 9

经过(许多)小时的沮丧之后,@Mido在这里的出色回答是唯一真正让 CoTurn 的 REST API 为我工作的东西。

我的凭证服务器是 PHP,我使用 CoTurn 的配置文件“turnserver.conf”,所以这里是 Mido 在这种情况下工作的经过测试和有效的翻译:

假设'3575819665154b268af59efedee8826e'的'共享秘密',这里是相关的turnserver.conf条目:

lt-cred-mech
use-auth-secret
static-auth-secret=3575819665154b268af59efedee8826e
Run Code Online (Sandbox Code Playgroud)

...和 ​​PHP(误导了我多年):

$ttl = 24 * 3600;  // Time to live
$time = time() + $ttl;
$username = $time . ':' . $user;
$password = base64_encode(hash_hmac('sha1', $username, '3575819665154b268af59efedee8826e', true));
Run Code Online (Sandbox Code Playgroud)

  • @baptx 我使用秘密(即某物的哈希值)的唯一原因是为了轻松自动更改它,同时几乎不可能猜测或暴力破解。我也只拥有这么多猫,所以很快就用完了猫名密码。 (2认同)

bax*_*ico 5

基于@Mido 和@HeyHeyJC 的回答,这里是为 coturn 构建凭证的 Python 实现。

import hashlib
import hmac
import base64
from time import time

user = 'your-arbitrary-username'
secret = 'this-is-the-secret-configured-for-coturn-server'

ttl = 24 * 3600 # Time to live
timestamp = int(time()) + ttl
username = str(timestamp) + ':' + user
dig = hmac.new(secret, username, hashlib.sha1).digest()
password = base64.b64encode(dig).decode()

print('username: %s' % username)
print('password: %s' % password)
Run Code Online (Sandbox Code Playgroud)

这是一个基于 Web 的页面,用于测试您的 coturn 服务器的登录。使用turn:host.example.com作为服务器名称。

  • 我必须使用 `bytes(secret, 'utf-8')` 和 `bytes(username, 'utf-8')` (Python3.9) (2认同)