Javascript 使用REST API身份验证为WebRTC打开服务器
我正在尝试从为webRTC设置rfc5766 turn服务器turn服务器。 我能够使用一个Javascript 使用REST API身份验证为WebRTC打开服务器,javascript,rest,authentication,webrtc,turn,Javascript,Rest,Authentication,Webrtc,Turn,我正在尝试从为webRTC设置rfc5766 turn服务器turn服务器。 我能够使用一个turnuserdb.conf文件成功地通过这个TURN服务器转发我的视频,我在这个文件中有我的用户名和密码(我的用户名:我的密码)。 在web客户端,我使用了: "iceServers":{[ "url": "turn:my_user_name,@turn_server_ip", "credential":"my_password" }] 我试图使用TURN服务器附带的RESTAPI功
turnuserdb.conf
文件成功地通过这个TURN服务器转发我的视频,我在这个文件中有我的用户名和密码(我的用户名:我的密码)。
在web客户端,我使用了:
"iceServers":{[
"url": "turn:my_user_name,@turn_server_ip",
"credential":"my_password"
}]
我试图使用TURN服务器附带的RESTAPI功能来避免通过网络发送密码或将密码存储在客户端。
我遵循RESTAPI并在其下运行
然而不幸的是,我得到了401,无法进行身份验证
下面是我所做的:
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.yy
zz.zzz.zzz
)Date.now()+1000*60*60; // output 1433895918506.
我在上生成了临时密码,
使用我的秘密,并得到一个结果0CA57806BDC6966B3129D4CAD83746945B00AF77B
1433895918506:my_user_name
和密码:mgnhntc4mdzizgzgm2otzimzeyowq0y2fkodm3ndy5ndvimdbhzjc3yg==
,在我现在使用的web客户端上,从web客户端与turn服务器进行日志通信
"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.
401已处理用户传入的数据包消息,错误401:未经授权。
你能帮我找出问题所在吗?当我用你的名字和密码生成凭证时,我得到了
1dj9xz5fwvks6yoqzoorcfnxai=
不是mgnhntc4mdzizgzgm2otzimzeyowq0y2fkodm3ndy5ndvimdbhzjc3yg=
,请检查你的算法/代码是否有错误
并且时间是以Unix时间戳为单位的,因此以秒为单位,而不是以毫秒为单位(虽然这不会影响,但只会使您的凭据永不过期)
检查您的系统和正在运行TURN服务器的系统的时钟是否同步(至少间隔几天),通常,为了避免时钟不同步的问题,最好使用ttl作为24小时,因此您的时间戳:
timestamp= parseInt(Date.now()/1000) + 24*3600
生成转弯凭证的代码:
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
};
}
是的,我在从十六进制到base64的转换过程中遇到了一个错误,我错过了毫秒到秒的转换。谢谢你的帮助