使用 REST API 身份验证的 WebRTC TURN 服务器
TURN server for WebRTC with REST API authentication
我正在尝试从 here 为 webRTC 设置 rfc5766-turn-server TURN 服务器。
我能够使用我的用户名和密码 (my_user_name:my_password) 的 turnuserdb.conf
文件通过此 TURN 服务器成功转发我的视频。
在 Web 客户端,我使用了:
"iceServers":{[
"url": "turn:my_user_name,@turn_server_ip",
"credential":"my_password"
}]
我正在尝试使用 TURN 服务器附带的 REST API 功能来避免通过网络发送密码或将其存储在客户端。
我跟着this spec and this explanation下了休息API
然而不幸的是,我收到 401 并且我无法进行身份验证。
这就是我所做的:
我创建了一个秘密“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
)
后来我生成了一个时间戳,现在是 + 1 小时,所以我在 nodejs 上 运行:
Date.now()+1000*60*60; // output 1433895918506.
我在 this website 上生成了临时密码,
使用我的秘密,得到了结果 0ca57806bdc696b3129d4cad83746945b00af77b
我把密码编码成base64.
现在我尝试使用临时用户名:1433895918506:my_user_name
和密码:MGNhNTc4MDZiZGM2OTZiMzEyOWQ0Y2FkODM3NDY5NDViMDBhZjc3Yg==
从 Web 客户端与 turn 服务器进行日志通信,现在我在 Web 客户端上使用
"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.
你能帮我找出问题所在吗?
当我用你的名字和密码生成凭证时,我得到的是 1Dj9XZ5fwvKS6YoQZOoORcFnXaI=
而不是 MGNhNTc4MDZiZGM2OTZiMzEyOWQ0Y2FkODM3NDY5NDViMDBhZjc3Yg==
,请检查你的 algorithm/code 是否有错误。
并且时间在 Unix 时间戳 中,所以以秒为单位,而不是像您所做的那样以毫秒为单位(虽然这不应该影响,但只是让您的凭据永不过期)
检查你的系统和 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
};
}
我正在尝试从 here 为 webRTC 设置 rfc5766-turn-server TURN 服务器。
我能够使用我的用户名和密码 (my_user_name:my_password) 的 turnuserdb.conf
文件通过此 TURN 服务器成功转发我的视频。
在 Web 客户端,我使用了:
"iceServers":{[
"url": "turn:my_user_name,@turn_server_ip",
"credential":"my_password"
}]
我正在尝试使用 TURN 服务器附带的 REST API 功能来避免通过网络发送密码或将其存储在客户端。 我跟着this spec and this explanation下了休息API
然而不幸的是,我收到 401 并且我无法进行身份验证。
这就是我所做的:
我创建了一个秘密“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
)后来我生成了一个时间戳,现在是 + 1 小时,所以我在 nodejs 上 运行:
Date.now()+1000*60*60; // output 1433895918506.
我在 this website 上生成了临时密码, 使用我的秘密,得到了结果
0ca57806bdc696b3129d4cad83746945b00af77b
我把密码编码成base64.
现在我尝试使用临时用户名:
1433895918506:my_user_name
和密码:MGNhNTc4MDZiZGM2OTZiMzEyOWQ0Y2FkODM3NDY5NDViMDBhZjc3Yg==
从 Web 客户端与 turn 服务器进行日志通信,现在我在 Web 客户端上使用"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.
你能帮我找出问题所在吗?
当我用你的名字和密码生成凭证时,我得到的是 1Dj9XZ5fwvKS6YoQZOoORcFnXaI=
而不是 MGNhNTc4MDZiZGM2OTZiMzEyOWQ0Y2FkODM3NDY5NDViMDBhZjc3Yg==
,请检查你的 algorithm/code 是否有错误。
并且时间在 Unix 时间戳 中,所以以秒为单位,而不是像您所做的那样以毫秒为单位(虽然这不应该影响,但只是让您的凭据永不过期)
检查你的系统和 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
};
}