🐙

Azure Communication Services の .NET SDK でユーザーの作成とトークンの発行

2023/02/06に公開

通話やチャットが出来る 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 のお作法にのっとったものなので安心して使えますね。

https://www.nuget.org/packages/Azure.Communication.Identity

ライブラリを使えば 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 にエンドポイントとアクセスキーを渡してインスタンス化して CreateUserAsyncGetTokenAsync でユーザーの作成とトークンの取得が出来ます。

トークンの取得を行うにはユーザーとスコープ (CommunicationTokenScope 列挙体の ChatVoIP のどちらか(または両方) を配列で指定します。ということでコードは以下のようになります。

結構短く書けました。

Program.cs
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 をする流れで使うことが出来ます。詳細は以下の公式ドキュメントのクイックスタートを確認してください。

https://learn.microsoft.com/ja-jp/azure/communication-services/quickstarts/access-tokens?tabs=windows&pivots=platform-azcli

Microsoft (有志)

Discussion