私はcoturnを構築し、それを正常に実行しました。 ip:192.168.1.111。今私が直面した問題は、REST API。 http://tools.ietf.org/html/draft-uberti-behave-turn-rest- 文章によると、リクエストのフォーマットは
GET /?service=turn&username=mbzrxpgjys
レスポンスはJSON
である必要があります。今私の質問は:
a)TURN SERVERをREST API
モードで実行するように設定およびコマンドする方法は?
b)TURN SERVER
が正しく応答できるように、httpリクエストを正しい形式で書き込む方法は?例を挙げてもらえますか?
ここで明確にすべきことは次のとおりです。
JSONを返すGET /?service=turn&username=mbzrxpgjys
は、サーバーからtime-limitedTURNクレデンシャルを取得するための推奨uriです。従う必要はありません。URIは/?giveMeCredentials
だけです。実際、私はソケット接続を使用してこのデータを取得します。json応答による直接のhttp呼び出しではありません。 1日の終わりに、有効である限り、あなた(上記のTURNを使用するクライアント)がこれらの資格情報をどのように取得するかは重要ではありません。
no rest apiTURNサーバーへの呼び出しは、制御下にあります。
tURNサーバーを起動するときに秘密鍵を割り当てます。これはdb(したがって動的に変更可能)から取得できますが、私は怠惰で、ハードコードされており、ターン構成ファイルで指定しているので、忘れずに有効にしてください。 REST 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
アプリケーションサーバーでTURN資格情報を作成するためのnode.js
コード:
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
}
...
私は最近同様の問題に遭遇し(REST APIがTURNサーバーで動作する)、最近TURNサーバーはREST API呼び出しをまったくサポートせず、 TURN configでREST APIサポートを有効にした場合の共有シークレットによる認証形式のサポート。 draft は、そのような=を実装するときに考慮する必要がある事項に関する情報のみを提供しますREST APIおよびWE独自にAPIを作成するか、 turnhttp のようなものを使用して、一時的なユーザー名とパスワードの組み合わせを生成する必要があります。
@midoが詳述するように、ユーザー名/パスワード生成部分をアプリケーション自体に実装できます。しかし、これをアプリケーションから分離する理由があり、完全に異なるAPIサービスとして実装する場合は、 draft のように完全なAPIを実装するのではなく、別の post ここで、OPはPHPスクリプトを使用して一時的なユーザー名とパスワードを生成します。これは、hash_hmac()関数を次のように変更すると非常にうまく機能します。
$turn_password = hash_hmac('sha1', $turn_user, $secret_key, true);
hash_hmacのRAW出力をbase64エンコードして機能させる必要があります。これが、そのリンクのOPで機能しなかった理由です。
turnutils_uclientコマンドを使用して認証をテストし、一時的なユーザー名/パスワードの組み合わせが期待どおりに機能していることを確認できるはずです。
turnutils_uclient -y -u GENERATED_USERNAME -w GENERATED_PASSWORD yourturnserver.com
認証を確認し、機能していることを確認したら、PHPスクリプト用にWebサーバーを設定して、アプリケーションで利用できるようにし、一時的なユーザー名/パスワードの組み合わせを取得します。また、 APIを不正アクセスから保護するために、他のセキュリティ設定(認証)を実装します。
私はこれが古い投稿であることを知っています。いつか誰かに役立つことを期待して、ここで私の発見を共有します。
(多くの)時間の欲求不満の後、@ Midoの優れた answer ここが、実際にCoTurnのREST APIが機能するようにした唯一のものです。
私の資格情報サーバーはPHPであり、CoTurnの構成ファイル 'turnserver.conf'を使用しているので、その状況でのMidoの作業のテスト済みで動作する翻訳は次のとおりです。
「共有シークレット」が「3575819665154b268af59efedee8826e」であるとすると、関連するturnserver.confエントリは次のとおりです。
lt-cred-mech
use-auth-secret
static-auth-secret=3575819665154b268af59efedee8826e
...そしてPHP(これは長い間私を惑わしました):
$ttl = 24 * 3600; // Time to live
$time = time() + $ttl;
$username = $time . ':' . $user;
$password = base64_encode(hash_hmac('sha1', $username, '3575819665154b268af59efedee8826e', true));