37

coturn をビルドし、正常に実行しました。IP:192.168.1.111。ここで私が直面した問題は、REST API を介して Turn 資格情報を取得することです。 https://datatracker.ietf.org/doc/html/draft-uberti-behave-turn-rest-00パッセージによると、リクエストのフォーマットは

GET /?service=turn&username=mbzrxpgjys

と応答する必要がありますJSON。今私の質問は:

a) TURN SERVER をモードで実行するように構成してコマンドを実行する方法はREST API?

TURN SERVERb)正しく応答できるように正しい形式で http 要求を記述する方法は? 例を教えてください。

4

7 に答える 7

66

ここで明確にする必要があるのは、次のとおりです。

  • GET /?service=turn&username=mbzrxpgjysこれは JSON を返します。サーバーから期限付きのTURN 資格情報を取得するための推奨URI にすぎません。それに従う必要はありません。URI は. 実際、私はソケット接続を使用してこのデータを取得していますが、json 応答で直接 http 呼び出しを行うのではありません。一日の終わりに、それらの資格情報が有効である限り、あなた (上記の TURN を使用するクライアント) がそれらの資格情報を取得する方法は問題ではありません。/?giveMeCredentials

  • TURN サーバーに直接リクエストを行うことはありません。TURN サーバーへの残りの API呼び出しは制御できません。

  • TURNサーバーを起動するときに秘密鍵を割り当てます。これはdbから取得できます(したがって動的に変更可能です)が、私は怠け者で、ハードコードされているだけで、ターン構成ファイルでそれを与えました。有効にすることも忘れないでください残りの API。ターンコマンドの一部として、turnserver ... --use-auth-secret --static-auth-secret=MySecretKey

  • ここで、アプリケーションサーバーで同じ秘密鍵を使用して資格情報を生成します。ユーザー名については、UNIX タイムスタンプといくつかの文字列 (ランダムまたはユーザー ID など) で区切られ:、パスワードはユーザー名の HMAC です。あなたの秘密鍵。

  • UNIX タイムスタンプについては、資格情報が有効になるまでの 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アプリケーション サーバーで TURN 資格情報を作成するためのコード:

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

これを使用するためのブラウザ コード:

  ...
  iceServers:[
    {
      urls: "turn:turn_server_ip",
      username: username,
      credential:password
    }
  ...
于 2016-03-03T08:48:38.267 に答える
5

@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)

これは、coturn サーバーへのログインをテストするためのWeb アプリケーションです。turn:host.example.comサーバー名として使用します。

于 2020-06-06T14:44:26.980 に答える
2

@Augusto Destrero が提供する実装はTypeError: key: expected bytes or bytearray, but got 'str'、Python 3.7.6 で発生します。別の 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 のmessageキーワード引数hmacは新しいバージョンではバイトでなければならないのに対し、古いバージョンでは str が必要なことです。

于 2020-11-25T07:01:47.187 に答える