【问题标题】:TURN server for WebRTC with REST API authentication使用 REST API 身份验证的 WebRTC TURN 服务器
【发布时间】:2015-06-10 00:33:19
【问题描述】:

我正在尝试从here 为 webRTC 设置 rfc5766-turn-server TURN 服务器。 我能够使用我的用户名和密码 (my_user_name:my_password) 的 turnuserdb.conf 文件通过此 TURN 服务器成功转发我的视频。 在我使用的网络客户端:

"iceServers":{[
    "url": "turn:my_user_name,@turn_server_ip",
    "credential":"my_password"
}]

我正在尝试使用 TURN 服务器附带的 REST API 功能来避免通过网络发送密码或将其存储在客户端。 我在 Rest API 下关注了 this specthis explanation

但不幸的是,我收到了 401 并且无法进行身份验证。

这就是我所做的:

  1. 我创建了一个秘密“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.xxyy.yyy.yyy.yyzz.zzz.zz.zzz

  2. 后来我生成了一个现在 + 1 小时的时间戳,所以我在 nodejs 上运行:

    Date.now()+1000*60*60;      // output 1433895918506.
    

    我在this website上生成了临时密码, 使用我的秘密,得到了结果0ca57806bdc696b3129d4cad83746945b00af77b

  3. 我将密码编码为 base64

  4. 现在我尝试使用临时用户名:1433895918506:my_user_name 和密码:MGNhNTc4MDZiZGM2OTZiMzEyOWQ0Y2FkODM3NDY5NDViMDBhZjc3Yg==,从 Web 客户端登录与转向服务器的通信,现在我在 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.

你能帮我找出问题所在吗?

【问题讨论】:

    标签: javascript rest authentication webrtc turn


    【解决方案1】:

    当我使用您的姓名和密码生成凭据时,我得到的是 1Dj9XZ5fwvKS6YoQZOoORcFnXaI= 而不是 MGNhNTc4MDZiZGM2OTZiMzEyOWQ0Y2FkODM3NDY5NDViMDBhZjc3Yg==,请检查您的算法/代码是否有错误。

    时间是 Unix Timestamp,所以以秒为单位,而不是像你所做的那样以毫秒为单位(虽然这不应该影响,但只会让你的凭据永不过期)

    检查你的系统和运行 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
        };
    }
    

    【讨论】:

    • 是的,我在从十六进制到 base64 的转换中遇到了一个错误,我错过了毫秒到秒的转换。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2019-08-01
    • 2014-01-10
    • 2018-05-09
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    相关资源
    最近更新 更多