Azure Communication Services の .NET SDK でユーザーの作成とトークンの発行
通話やチャットが出来る Azure Communication Services ですが、実際に通話を行うクライアントサイドは Web ブラウザーや Android/iOS といったモバイルデバイスが主になると思います。というか UI Library が React/iOS/Android になっているのが現状なので現実問題的に UI Library のあるところをターゲットにするのが一番楽です。
ただ、ユーザー ID の作成やアクセストークンの発行などはアクセスキーなどの機密情報が必要になるためクライアントサイドではなくサーバーサイドで行う必要があります。その場合は .NET を使うことが出来ます。(もちろん Node.js, Python, Java といった言語でも可能です)
ここでは、.NET のライブラリを使ってユーザーを作成したりアクセストークンを取ったりする方法を見てみようと思います。
使用するライブラリは Azure.Communication.Identity になります。Azure から始まるのは最新の Azure SDK のお作法にのっとったものなので安心して使えますね。
ライブラリを使えば ID の作成とトークンの発行は凄く簡単にできます。試しに ASP.NET Core (空) のプロジェクトを作って Minimal APIs でユーザーの作成とトークンの発行を行う API を作ってみましょう。
プロジェクトを作成したら Azure.Communication.Identity を NuGet から追加します。
そして、Azure で Azure Communication Services のリソースを作成してエンドポイントとアクセスキーを取得します。
取得したら、プロジェクトのユーザーシークレットに以下のように追加しましょう。Azure などにデプロイするときはアクセスキーは Azure Key Vault に入れてそこからとるように構成してもいいですね。
{
"AzureCommunicationServicesOption": {
"Endpoint": "https://リソース名.communication.azure.com",
"AccessKey": "アクセスキー"
}
}
後は API を作るだけです。Azure Communication Services の ID のライブラリは CommunicationIdentityClient
にエンドポイントとアクセスキーを渡してインスタンス化して CreateUserAsync
と GetTokenAsync
でユーザーの作成とトークンの取得が出来ます。
トークンの取得を行うにはユーザーとスコープ (CommunicationTokenScope
列挙体の Chat
と VoIP
のどちらか(または両方) を配列で指定します。ということでコードは以下のようになります。
結構短く書けました。
using Azure;
using Azure.Communication;
using Azure.Communication.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
var builder = WebApplication.CreateBuilder(args);
// 構成情報から Endpoint と AccessKey を読み込む
builder.Services
.Configure<AzureCommunicationServicesOption>(
builder.Configuration.GetSection(nameof(AzureCommunicationServicesOption)));
// CommunicationIdentityClient をサービスとして登録しておく
builder.Services.AddSingleton(provider =>
{
var options = provider.GetRequiredService<IOptions<AzureCommunicationServicesOption>>();
return new CommunicationIdentityClient(
new Uri(options.Value.Endpoint),
new AzureKeyCredential(options.Value.AccessKey));
});
var app = builder.Build();
// ユーザーを作成して ID を返す API
app.MapPost("/users", async (CommunicationIdentityClient client, CancellationToken ct) =>
{
var user = await client.CreateUserAsync(ct);
return user.Value.Id;
});
// 指定したユーザーの Chat と VoIP が出来るアクセストークンを返す API
var tokenScopes = new[] { CommunicationTokenScope.Chat, CommunicationTokenScope.VoIP };
app.MapPost("/users/{userId}/token", async (
[FromRoute]string userId,
CommunicationIdentityClient client,
CancellationToken ct) =>
{
var user = new CommunicationUserIdentifier(userId);
var token = await client.GetTokenAsync(user, tokenScopes, ct);
return token.Value;
});
app.Run();
// 設定情報を読み込むためのクラス
public class AzureCommunicationServicesOption
{
public required string Endpoint { get; set; }
public required string AccessKey { get; set; }
}
実際には各種クラスは別ファイルに定義したり、MapXxxx のなかで直接 CommunicationIdentityClient
を使うのではなく、もう 1 枚くらいラップしてあげた方が良いと思います。
これを実行すると以下のように API を叩くとレスポンスが返ってきます。
users API を叩いた結果の例
users/{userId}/token API を叩いた結果の例
ばっちりですね。あとは、この API を適当な認証で保護してあげてクライアントから呼んであげれば OK です。App Service の場合は App Service 認証で適当な認証プロバイダーを使って保護できるので、それが一番お手軽だと思います。
まとめ
今回は .NET で作ってみましたが、どの言語でもユーザー ID を作る部分とトークンを作る部分はライブラリをパッケージマネージャーから追加して CommunicationIdentityClient
のインスタンスをエンドポイントとアクセスキーを元に作って createUser
, getToken
をする流れで使うことが出来ます。詳細は以下の公式ドキュメントのクイックスタートを確認してください。
Discussion