Javascript 使用REST API身份验证为WebRTC打开服务器

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功

我正在尝试从为webRTC设置rfc5766 turn服务器turn服务器。 我能够使用一个
turnuserdb.conf
文件成功地通过这个TURN服务器转发我的视频,我在这个文件中有我的用户名和密码(我的用户名:我的密码)。 在web客户端,我使用了:

"iceServers":{[
    "url": "turn:my_user_name,@turn_server_ip",
    "credential":"my_password"
}]
我试图使用TURN服务器附带的RESTAPI功能来避免通过网络发送密码或将密码存储在客户端。 我遵循RESTAPI并在其下运行

然而不幸的是,我得到了401,无法进行身份验证

下面是我所做的:

  • 我创建了一个秘密“my_secret”,并按如下方式运行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
    
    (我刚刚将IP地址替换为
    xx.xxx.xx.xx
    yy.yyy.yy
    zz.zzz.zzz

  • 后来我生成了一个时间戳,现在是+1小时,所以我在NodeJ上运行:

    Date.now()+1000*60*60;      // output 1433895918506.
    
    我在上生成了临时密码, 使用我的秘密,并得到一个结果
    0CA57806BDC6966B3129D4CAD83746945B00AF77B

  • 我将密码编码为base64

  • 现在,我尝试使用临时用户名:
    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的转换过程中遇到了一个错误,我错过了毫秒到秒的转换。谢谢你的帮助