CoTURN:如何使用TURN REST API?

时间:2016-03-03 08:01:58

标签: api rest webrtc turn

我已经建立了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能够正确回复?你能举个例子吗?

7 个答案:

答案 0 :(得分:24)

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

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

  • 您不直接向TURN服务器发出任何请求, no rest api 对TURN服务器的控制权在您的控制之下。

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

  • 现在,在您的应用程序服务器中,您将使用相同的密钥生成凭据,对于用户名,它是UNIX时间戳和一些字符串(可以是随机的或用户ID或其他内容)由{{1}分隔密码将是您的密钥用户名的HMAC。

  • 关于UNIX时间戳,这是TURN服务器中你的凭证必须有效的时间,因此计算这个时间确保你考虑应用服务器和你的回合之间的时钟时差服务器

现在从我对另一个question

的回答中获取一些示例代码 用于说明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

使用它的浏览器代码:

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

答案 1 :(得分:2)

建立在@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)

这里是web based page,用于测试您的Coturn服务器的登录名。使用turn:host.example.com作为服务器名称。

答案 2 :(得分:0)

我最近遇到了类似的问题(使REST API与TURN服务器一起使用),并了解到TURN服务器完全不支持REST API调用,而仅当我们启用REST API支持时才提供对具有共享机密的身份验证格式的支持。打开配置。 draft仅提供有关在实现此类REST API时我们需要考虑的事情的信息,而我们需要自行创建API或使用类似turnhttp之类的内容来生成临时用户名密码组合。

详细@mido,您可以在应用程序本身中实现用户名/密码生成部分。但是,如果您有理由将其与应用程序分开,并希望将其作为完全不同的API服务来实现,而不是按照draft来实现完整的API,那么我会遇到另一个post,其中OP提供了一个PHP脚本来生成临时用户名和密码,将hash_hmac()函数修改为以下代码后,该脚本就可以很好地工作了,

$turn_password = hash_hmac('sha1', $turn_user, $secret_key, true);

我们需要对 hash_hmac 的RAW输出进行base64编码才能使其正常工作,我相信这就是为什么该链接不适用于该OP的原因。

您应该能够使用 turnutils_uclient 命令测试身份验证,以验证临时用户名/密码组合是否按预期工作。

turnutils_uclient -y -u GENERATED_USERNAME -w GENERATED_PASSWORD yourturnserver.com

一旦您验证了身份验证并确认它可以正常工作,就可以为PHP脚本设置网络服务器,以使其可用于您的应用程序并获取临时用户名/密码组合。另外,您还需要实施其他安全设置(身份验证)以保护API免受未经授权的访问。

我知道这是一篇过时的文章,只是在这里分享我的发现,希望有一天对某人有用。

答案 3 :(得分:0)

经过(数小时)的挫折之后,@ Mido出色的answer才是让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));

答案 4 :(得分:0)

这是我的TTL C#实现

public string[] GenerateTurnPassword(string username)
{
    long ttl = 3600 * 6;
    var time = DateTimeOffset.Now.ToUnixTimeSeconds() + ttl;
    var newuser = time + ":" + username;
    byte[] key = Encoding.UTF8.GetBytes("YOURSECRET");
    HMACSHA1 hmacsha1 = new HMACSHA1(key);
    byte[] buffer = Encoding.UTF8.GetBytes(newuser);
    MemoryStream stream = new MemoryStream(buffer);
    var hashValue = hmacsha1.ComputeHash(stream);
    string[] arr = new string[2];
    arr[0] = Convert.ToBase64String(hashValue);
    arr[1] = newuser;
    return arr;
}

答案 5 :(得分:0)

@Augusto Destrero提供的实现会在Python 3.7.6上导致TypeError: key: expected bytes or bytearray, but got 'str',对于正在寻找其他Python实现的人来说,这是一个示例:

import time
import hmac
import hashlib
import base64

secret = b'abcdefghijkmln'

def generateTurnUsernamePwd():
    username = "arbitry username here"
    password = hmac.new(secret, bytes(username, 'UTF-8'), hashlib.sha1).digest()
    passwordStr = base64.b64encode(password).decode("utf-8")
    
    return username,passwordStr

print(generateTurnUsernamePwd())

主要区别是key lib中的messagehmac关键字参数在新版本中必须为字节,而在旧版本中则需要str。

答案 6 :(得分:0)

我认为有必要在答案中添加有关该主题的 coturn 文档的实际文本,并为感兴趣的人添加一个 link

<块引用>

--auth-secret TURN REST API 标志。设置基于身份验证秘密的特殊 WebRTC 授权选项的标志。这 功能目的是支持“TURN Server REST API” 在下面的 TURN REST API 部分。此选项使用时间戳 作为组合用户名的一部分:usercombo -> "timestamp:username", 转用户 -> 用户组合,转密码 -> base64(hmac(input_buffer = usercombo, key = shared-secret))。这 允许将 TURN 凭据用于特定的用户 ID。如果 您没有合适的 id,可以单独使用时间戳。这 选项只是打开基于秘密的身份验证。实际上 秘密的值由选项 static-auth-secret 定义, 或者可以在数据库的turn_secret表中找到。