クイックスタート: Teams ユーザー向けのアクセス トークンを設定して管理する

このクイックスタートでは、Microsoft Authentication Library (MSAL) を使って、Microsoft Entra ユーザー トークンを取得することにより、Microsoft 365 ユーザーを認証する .NET コンソール アプリケーションを構築します。 次に、Azure Communication Services Identity SDK を使用して、そのトークンを Teams ユーザーのアクセス トークンと交換します。 その後、Teams ユーザーのアクセス トークンを Communication Services Calling SDK で使用して、Teams ユーザーとして呼び出し機能を統合できます。

注意

交換の要求はシークレットを使用して署名されるため、運用環境では、この交換メカニズムをバックエンド サービスに実装することをお勧めします。

前提条件

はじめに

Teams ID は Microsoft Entra ID のテナントにバインドされます。 このアプリケーションは、同じまたは別のテナントのユーザーが使用できます。 このクイックスタートでは、複数のアクター (架空の企業である Contoso および Fabrikam のユーザー、開発者、管理者) を含むマルチテナントのユース ケースについて説明します。 このユース ケースでは、Contoso は Fabrikam のためにサービスとしてのソフトウェア (SaaS) を構築している企業です。

以降のセクションでは、管理者、開発者、およびユーザー向けの手順について説明します。 この図は、マルチテナントのユース ケースを示しています。 単一テナントで作業する場合は、単一テナントで Contoso と Fabrikam のすべての手順を行います。

管理者のアクション

管理者ロールには、Microsoft Entra ID での拡張アクセス許可があります。 このロールのメンバーは、リソースを設定し、Azure portal から情報を読み取ることができます。 次の図では、管理者によって実行される必要があるすべてのアクションを確認できます。

Teams ID に対する Azure Communication Services のサポートを有効にする管理者アクション。

  1. Contoso の管理者は、Microsoft Entra ID で既存の "アプリケーション" を作成するか選びます。 プロパティ [Supported account types](サポートされているアカウントの種類) は、さまざまなテナントのユーザーがアプリケーションに対して認証できるかどうかを定義します。 プロパティ [リダイレクト URI] は、Contoso "サーバー" に成功した認証要求をリダイレクトします。
  2. Contoso の管理者は、Communication Services から Teams.ManageCalls および Teams.ManageChats に API のアクセス許可を追加します。
  3. Contoso の管理者は、アプリケーションのパブリック クライアント フローを許可します。
  4. Contoso の管理者は、既存の Communication Services を選択するか作成します。これは交換要求の認証に使用されます。 Microsoft Entra ユーザー トークンは Teams ユーザーのアクセス トークンと交換されます。 詳細については、「Communication Services のリソースを作成して管理する」を参照してください。
  5. Fabrikam の管理者は、Communication Services の Teams.ManageCalls および Teams.ManageChats のアクセス許可を Contoso アプリケーションに付与します。 Fabrikam の管理者だけが Teams.ManageCalls および Teams.ManageChats アクセス許可を使用してアプリケーションへのアクセスを許可できる場合は、この手順が必要です。

手順 1: Microsoft Entra アプリケーションの登録を作成するか、Microsoft Entra アプリケーションを選択する

ユーザーは、Azure Communication Services の Teams.ManageCalls と Teams.ManageChats アクセス許可を持つ Microsoft Entra アプリケーションに対して認証される必要があります。 このクイックスタートで使用する既存のアプリケーションがない場合は、新しいアプリケーション登録を作成できます。

次のアプリケーション設定がエクスペリエンスに影響します。

  • プロパティ [Supported account types](サポートされているアカウントの種類) は、アプリケーションがシングル テナント ([この組織のディレクトリ内のアカウントのみ]) であるか、マルチテナント ([任意の組織のディレクトリ内のアカウント]) であるかを定義します。 このシナリオでは、マルチテナントを使用できます。
  • [リダイレクト URI] は、認証後に認証要求がリダイレクトされる URI を定義します。 このシナリオでは、[パブリック クライアント/ネイティブ (モバイルとデスクトップ)] を使用して、URI として「http://localhost」を入力できます。

詳細については、Microsoft ID プラットフォームにアプリケーションを登録する方法に関するページを参照してください。

アプリケーションが登録されると、概要に識別子が表示されます。 この識別子 (アプリケーション (クライアント) ID) は以降の手順で使用されます。

手順 2: パブリック クライアント フローを許可する

ご利用のアプリケーションの [認証] ペインには、[パブリック クライアント/ネイティブ (モバイルとデスクトップ)] に構成されたプラットフォームが http://localhost を指すリダイレクト URI と共に表示されます。 このペインの下部に、 [パブリック クライアント フローを許可する] のトグル コントロールがあります。このクイックスタートでは、 [はい] に設定する必要があります。

手順 3: アプリケーションで Communication Services のアクセス許可を追加する

アプリケーションで Teams.ManageCalls および Teams.ManageChats アクセス許可を宣言し、テナント内の Teams 呼び出し機能にアクセスできるようにする必要があります。 Teams ユーザーは、トークン交換のこのアクセス許可を持つ Microsoft Entra ユーザー トークンを要求します。

  1. Azure portal で Microsoft Entra アプリに移動し、[API のアクセス許可] を選びます
  2. [アクセス許可の追加] を選択します。
  3. [アクセス許可の追加] メニューで、[Azure Communication Services] を選択します
  4. Teams.ManageCallsTeams.ManageChats のアクセス許可を選択し、[アクセス許可の追加] を選択します

Teams.ManageCalls および Teams.ManageChats アクセス許可を以前の手順で作成した Microsoft Entra アプリケーションに追加します。

手順 4: Communication Services リソースを作成または選択する

Communication Services リソースは、Microsoft Entra ユーザー トークンを Teams ユーザーのアクセス トークンと交換するためのすべての要求を認証するために使用されます。 この交換をトリガーするには、Communication Services Identity SDK を使用し、アクセス キーで認証するか、Azure のロールベースのアクセス制御 (Azure RBAC) を使用します。 アクセス キーは、Azure portal で取得するか、 Communication Services リソースにより、[アクセス制御 (IAM)] ペインで Azure RBAC を構成することで取得できます。

新しい Communication Services リソースを作成する場合は、「Communication Services のリソースを作成して管理する」を参照してください。

Microsoft Entra テナントは、アプリケーションの Teams.ManageCalls および Teams.ManageChats アクセス許可に対して Microsoft Entra 管理者の同意を要求するように構成できます。 このような場合、Microsoft Entra 管理者は、Contoso アプリケーションに対して、Communication Services の Teams.ManageCalls と Teams.ManageChats のアクセス許可を付与する必要があります。 Fabrikam の Microsoft Entra 管理者は、一意の URL を介して同意を提供します。

次のロールは、会社に代わって同意を提供できます。

  • 全体管理者
  • アプリケーション管理者
  • クラウド アプリケーション管理者

Azure portal でロールを確認する場合は、Azure ロールの割り当ての一覧表示に関するページを参照してください。

管理者の同意 URL を作成するために、Fabrikam の Microsoft Entra 管理者は次の手順を実行します:

  1. URL https://login.microsoftonline.com/{Tenant_ID}/adminconsent?client_id={Application_ID} で、管理者は {Tenant_ID} を Fabrikam テナント ID に置き換え、{Application_ID} を Contoso アプリケーション ID に置き換えます。
  2. 管理者が組織を代表してログインし、アクセス許可を付与します。

同意が得られた場合は、Contoso アプリケーションのサービス プリンシパルが Fabrikam テナント内に作成されます。 Fabrikam の管理者は、次の手順に従って Microsoft Entra ID で同意を確認できます:

  1. Azure Portal に管理者としてサインインします。
  2. Microsoft Entra ID に移動します。
  3. [エンタープライズ アプリケーション] ペインで、 [アプリケーションの種類] フィルターを [すべてのアプリケーション] に設定します。
  4. アプリケーションをフィルター処理するためのフィールドに、Contoso アプリケーションの名前を入力します。
  5. [適用] を選択します。
  6. 必要な名前を使用してサービス プリンシパルを選択します。
  7. [アクセス許可] ペインに移動します。

Communication Services Teams.ManageCalls および Teams.ManageChats アクセス許可の状態が [{Directory_name} に付与されました] になっていることがわかります。

"あなたの組織 '{GUID}' にサービス プリンシパルがないサービス '1fd5118e-2576-4263-8130-9503064c837a'(Azure Communication Services) にアプリがアクセスしようとしています。 サービス サブスクリプションの構成を IT 管理に問い合わせて確認するか、アプリケーションに同意して必要なサービス プリンシパルを作成してください。" という問題が発生する場合、使用している Microsoft Entra テナントには、Azure Communication Services アプリケーションのサービス プリンシパルがありません。 この問題を解決するには、Microsoft Entra 管理者として PowerShell を使ってテナントに接続します。 Tenant_ID を Microsoft Entra テナントの ID に置き換えます。

次に示すように、Application.ReadWrite.All が必要になります

Application Read Write All を示すスクリーンショット。

Connect-MgGraph -TenantId "Tenant_ID" -Scopes Application.ReadWrite.All

コマンドが見つからない場合は、管理者として PowerShell を起動し、Microsoft Graph パッケージをインストールします。

Install-Module Microsoft.Graph

次に、次のコマンドを実行して、サービス プリンシパルをテナントに追加します。 アプリ ID の GUID は変更しないでください。

New-MgServicePrincipal -AppId "1fd5118e-2576-4263-8130-9503064c837a"

開発者の操作

Contoso の開発者は、ユーザーを認証するために "クライアント アプリケーション" を設定する必要があります。 次に開発者は、リダイレクト後に Microsoft Entra ユーザー トークンを処理するために、バックエンド "サーバー" にエンドポイントを作成する必要があります。 Microsoft Entra ユーザー トークンが受信されると、Teams ユーザーのアクセス トークンと交換され、"クライアント アプリケーション" に返されます。

開発者の必要なアクションを次の図に示します。

Teams ID に対する Azure Communication Services のサポートを有効にする開発者アクションの図。

  1. Contoso の開発者は、Communication Services Teams.ManageCalls および Teams.ManageChats アクセス許可のために管理者によって以前に作成されたアプリケーションに対してユーザーを認証するように Microsoft Authentication Library (MSAL) ライブラリを構成します。
  2. Contoso の開発者は、Communication Services Identity SDK を初期化し、ID SDK を使って、受信する Microsoft Entra ユーザー トークンを Teams ユーザーのアクセス トークンと交換します。 その後、Teams ユーザーのアクセス トークンが "クライアント アプリケーション" に返されます。

MSAL を使用すると、開発者は Microsoft ID プラットフォーム エンドポイントから Microsoft Entra ユーザー トークンを取得して、ユーザーを認証し、セキュリティで保護された Web API にアクセスすることができます。 これは、Communication Services へのセキュリティで保護されたアクセスを提供するために使用できます。 MSAL では、.NET、JavaScript、Java、Python、Android、iOS などの、さまざまなアプリケーション アーキテクチャとプラットフォームがサポートされています。

パブリック ドキュメントでの環境の設定の詳細については、Microsoft Authentication Library の概要に関するページを参照してください。

Note

以降のセクションでは、コンソール アプリケーションで Microsoft Entra アクセス トークンを Teams ユーザーのアクセス トークンと交換する方法について説明します。

前提条件の設定

  • お使いのオペレーティング システムに対応した最新バージョンの .NET SDK

最終的なコード

このクイックスタートの最終的なコードは GitHub にあります。

設定

新しい C# アプリケーションを作成する

コンソール ウィンドウ (cmd、PowerShell、Bash など) で、dotnet new コマンドを使用し、CommunicationAccessTokensQuickstart という名前で新しいコンソール アプリを作成します。 このコマンドにより、1 つのソース ファイルを使用する単純な "Hello World" C# プロジェクトが作成されます。Program.cs

dotnet new console -o CommunicationAccessTokensQuickstart

新しく作成したアプリ フォルダーにディレクトリを変更し、dotnet build コマンドを使用してアプリケーションをコンパイルします。

cd CommunicationAccessTokensQuickstart
dotnet build

パッケージをインストールする

まだアプリケーション ディレクトリにいる間に、dotnet add package コマンドを使用して、.NET 用の Azure Communication Services ID ライブラリ パッケージをインストールします。

dotnet add package Azure.Communication.Identity
dotnet add package Microsoft.Identity.Client

アプリのフレームワークを設定する

プロジェクト ディレクトリで次の操作を行います。

  1. テキスト エディターで、Program.cs ファイルを開きます
  2. Azure.Communication.Identity 名前空間を含めるように using ディレクティブを追加します
  3. 非同期コードをサポートするように Main メソッドの宣言を更新します

次のコードを使用して開始します。

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Azure.Communication.Identity;
using Microsoft.Identity.Client;

namespace CommunicationAccessTokensQuickstart
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine("Azure Communication Services - Teams Access Tokens Quickstart");

            // Quickstart code goes here
        }
    }
}

手順 1: MSAL ライブラリを使って Microsoft Entra ユーザー トークンとオブジェクト ID を受け取る

トークン交換フローの最初の手順は、Microsoft.Identity.Client を使用して、Teams ユーザーのトークンを取得することです。 以下のコードは、環境変数 AAD_CLIENT_IDAAD_TENANT_ID から、Microsoft Entra クライアント ID とテナント ID を取得します。 Fabrikam のテナント内のユーザーに対応するオブジェクト ID (oid) 要求を取得し、userObjectId 変数を初期化できるように、AAD_TENANT_ID 環境変数に基づいて適切な権限を持つ MSAL クライアントを構成することが不可欠です。

// This code demonstrates how to fetch an AAD client ID and tenant ID 
// from an environment variable.
string appId = Environment.GetEnvironmentVariable("AAD_CLIENT_ID");
string tenantId = Environment.GetEnvironmentVariable("AAD_TENANT_ID");
string authority = $"https://login.microsoftonline.com/{tenantId}";
string redirectUri = "http://localhost";

// Create an instance of PublicClientApplication
var aadClient = PublicClientApplicationBuilder
                .Create(appId)
                .WithAuthority(authority)
                .WithRedirectUri(redirectUri)
                .Build();

List<string> scopes = new() {
    "https://auth.msft.communication.azure.com/Teams.ManageCalls",
    "https://auth.msft.communication.azure.com/Teams.ManageChats"
};

// Retrieve the AAD token and object ID of a Teams user
var result = await aadClient
                        .AcquireTokenInteractive(scopes)
                        .ExecuteAsync();
string teamsUserAadToken =  result.AccessToken;
string userObjectId =  result.UniqueId;

手順 2: CommunicationIdentityClient を初期化する

接続文字列を使用して CommunicationIdentityClient を初期化します。 次のコードは、 COMMUNICATION_SERVICES_CONNECTION_STRING という名前の環境変数からリソースの接続文字列を取得します。 リソースの接続文字列を管理する方法について確認してください。

Main メソッドに次のコードを追加します。

// This code demonstrates how to fetch your connection string
// from an environment variable.
string connectionString = Environment.GetEnvironmentVariable("COMMUNICATION_SERVICES_CONNECTION_STRING");
var client = new CommunicationIdentityClient(connectionString);

手順 3: Teams ユーザーの Microsoft Entra アクセス トークンを通信 ID アクセス トークンに交換する

GetTokenForTeamsUser メソッドを使用して、Azure Communication Services SDK で使用できる Teams ユーザーのアクセス トークンを発行します。

var options = new GetTokenForTeamsUserOptions(teamsUserAadToken, appId, userObjectId);
var accessToken = await client.GetTokenForTeamsUserAsync(options);
Console.WriteLine($"Token: {accessToken.Value.Token}");

コードの実行

アプリケーション ディレクトリから dotnet run コマンドを使用してアプリケーションを実行します。

dotnet run

前提条件の設定

  • Node.js アクティブ LTS およびメンテナンス LTS バージョン (8.11.1 および 10.14.1 を推奨)。

最終的なコード

このクイックスタートの最終的なコードは GitHub にあります。

設定

新しい Node.js アプリケーションを作成する

ターミナルまたはコマンド ウィンドウを開き、アプリ用の新しいディレクトリを作成し、そこに移動します。

mkdir communication-access-tokens-quickstart && cd communication-access-tokens-quickstart

既定の設定で npm init -y を実行して、package.json ファイルを作成します。

npm init -y

パッケージをインストールする

npm install コマンドを使用して、JavaScript 用の Azure Communication Services Identity SDK をインストールします。


npm install @azure/communication-identity@latest --save
npm install @azure/msal-node --save
npm install express --save
npm install dotenv --save

--save オプションを使用すると、package.json ファイル内の依存関係としてライブラリが表示されます。

アプリのフレームワークを設定する

プロジェクト ディレクトリで次の操作を行います。

  1. コード エディターで新しいテキスト ファイルを開きます

  2. CommunicationIdentityClient を読み込むための require 呼び出しを追加します

  3. 基本的な例外処理を含め、プログラムの構造を作成します

    const { CommunicationIdentityClient } = require('@azure/communication-identity');    
    const { PublicClientApplication, CryptoProvider } = require('@azure/msal-node');
    const express = require("express");
    
    // You will need to set environment variables in .env
    const SERVER_PORT = process.env.PORT || 80;
    const REDIRECT_URI = `http://localhost:${SERVER_PORT}/redirect`;
    const clientId = process.env['AAD_CLIENT_ID'];
    const tenantId = process.env['AAD_TENANT_ID'];
    
    // Quickstart code goes here
    
    app.listen(SERVER_PORT, () => console.log(`Communication access token application started on ${SERVER_PORT}!`))
    
    
  4. access-tokens-quickstart ディレクトリに新しいファイルを issue-communication-access-token.js として保存します。

手順 1: MSAL ライブラリを使って Microsoft Entra ユーザー トークンとオブジェクト ID を受け取る

トークン交換フローの最初の手順は、Microsoft.Identity.Client を使用して、Teams ユーザーのトークンを取得することです。 以下のコードは、環境変数 AAD_CLIENT_IDAAD_TENANT_ID から、Microsoft Entra クライアント ID とテナント ID を取得します。 Fabrikam のテナント内のユーザーに対応するオブジェクト ID (oid) 要求を取得し、userObjectId 変数を初期化できるように、AAD_TENANT_ID 環境変数に基づいて適切な権限を持つ MSAL クライアントを構成することが不可欠です。

// Create configuration object that will be passed to MSAL instance on creation.
const msalConfig = {
    auth: {
        clientId: clientId,
        authority: `https://login.microsoftonline.com/${tenantId}`,
    }
};

// Create an instance of PublicClientApplication
const pca = new PublicClientApplication(msalConfig);
const provider = new CryptoProvider();

const app = express();

let pkceVerifier = "";
const scopes = [
            "https://auth.msft.communication.azure.com/Teams.ManageCalls",
            "https://auth.msft.communication.azure.com/Teams.ManageChats"
        ];

app.get('/', async (req, res) => {
    // Generate PKCE Codes before starting the authorization flow
    const {verifier, challenge} = await provider.generatePkceCodes();
    pkceVerifier = verifier;
    
    const authCodeUrlParameters = {
        scopes: scopes,
        redirectUri: REDIRECT_URI,
        codeChallenge: challenge, 
        codeChallengeMethod: "S256"
    };
    // Get url to sign user in and consent to scopes needed for application
    pca.getAuthCodeUrl(authCodeUrlParameters).then((response) => {
        res.redirect(response);
    }).catch((error) => console.log(JSON.stringify(error)));
});

app.get('/redirect', async (req, res) => {
    // Create request parameters object for acquiring the AAD token and object ID of a Teams user
    const tokenRequest = {
        code: req.query.code,
        scopes: scopes,
        redirectUri: REDIRECT_URI,
        codeVerifier: pkceVerifier,
    };
    // Retrieve the AAD token and object ID of a Teams user
    pca.acquireTokenByCode(tokenRequest).then(async(response) => {
        console.log("Response:", response);
        let teamsUserAadToken = response.accessToken;
        let userObjectId = response.uniqueId;
        //TODO: the following code snippets go here
        res.sendStatus(200);
    }).catch((error) => {
        console.log(error);
        res.status(500).send(error);
    });
});

手順 2: CommunicationIdentityClient を初期化する

接続文字列を使用して CommunicationIdentityClient をインスタンス化します。 次のコードは、 COMMUNICATION_SERVICES_CONNECTION_STRING という名前の環境変数からリソースの接続文字列を取得します。 リソースの接続文字列を管理する方法について確認してください。

then メソッドに次のコードを追加します。

// This code demonstrates how to fetch your connection string
// from an environment variable.
const connectionString = process.env['COMMUNICATION_SERVICES_CONNECTION_STRING'];

// Instantiate the identity client
const identityClient = new CommunicationIdentityClient(connectionString);

手順 3: Teams ユーザーの Microsoft Entra アクセス トークンを通信 ID アクセス トークンに交換する

getTokenForTeamsUser メソッドを使用して、Azure Communication Services SDK で使用できる Teams ユーザーのアクセス トークンを発行します。

//Exchange the Azure AD access token of the Teams User for a Communication Identity access token
let accessToken = await identityClient.getTokenForTeamsUser({
    teamsUserAadToken: teamsUserAadToken,
    clientId: clientId,
    userObjectId: userObjectId,
  });
console.log("Token:", accessToken);

コードの実行

コンソール プロンプトから、issue-communication-access-token.js ファイルが格納されているディレクトリに移動し、次の node コマンドを実行してアプリを実行します。

node ./issue-communication-access-token.js

前提条件の設定

最終的なコード

このクイックスタートの最終的なコードは GitHub にあります。

設定

新しい Python アプリケーションを作成する

  1. ターミナルまたはコマンド ウィンドウを開き、自分のアプリ用に新しいディレクトリを作成し、そこに移動します。

    mkdir communication-access-tokens-quickstart && cd communication-access-tokens-quickstart
    
  2. テキスト エディターを使用して、exchange-communication-access-tokens.py という名前のファイルをプロジェクトのルート ディレクトリに作成し、基本的な例外処理を含むプログラムの構造を追加します。 このクイックスタートのソース コードはすべて、以降のセクションでこのファイルに追加します。

    import os
    from azure.communication.identity import CommunicationIdentityClient, CommunicationUserIdentifier
    from msal.application import PublicClientApplication
    
    try:
       print("Azure Communication Services - Access Tokens Quickstart")
       # Quickstart code goes here
    except Exception as ex:
       print(f"Exception: {ex}")
    

パッケージをインストールする

引き続きアプリケーション ディレクトリで、pip install コマンドを使用して、Python 用の Azure Communication Services ID SDK パッケージをインストールします。

pip install azure-communication-identity
pip install msal

手順 1: MSAL ライブラリを使って Microsoft Entra ユーザー トークンとオブジェクト ID を受け取る

トークン交換フローの最初の手順は、Microsoft.Identity.Client を使用して、Teams ユーザーのトークンを取得することです。 Azure portal で、"モバイルおよびデスクトップ アプリケーション" のリダイレクト URI を http://localhost として構成します。 以下のコードは、環境変数 AAD_CLIENT_IDAAD_TENANT_ID から、Microsoft Entra クライアント ID とテナント ID を取得します。 Fabrikam のテナント内のユーザーに対応するオブジェクト ID (oid) 要求を取得し、user_object_id 変数を初期化できるように、AAD_TENANT_ID 環境変数に基づいて適切な権限を持つ MSAL クライアントを構成することが不可欠です。

# This code demonstrates how to fetch your Azure AD client ID and tenant ID
# from an environment variable.
client_id = os.environ["AAD_CLIENT_ID"]
tenant_id = os.environ["AAD_TENANT_ID"]
authority = "https://login.microsoftonline.com/%s" % tenant_id

# Create an instance of PublicClientApplication
app = PublicClientApplication(client_id, authority=authority)

scopes = [ 
"https://auth.msft.communication.azure.com/Teams.ManageCalls",
"https://auth.msft.communication.azure.com/Teams.ManageChats"
 ]

# Retrieve the AAD token and object ID of a Teams user
result = app.acquire_token_interactive(scopes)
aad_token =  result["access_token"]
user_object_id = result["id_token_claims"]["oid"] 

手順 2: CommunicationIdentityClient を初期化する

接続文字列を使用して CommunicationIdentityClient をインスタンス化します。 次のコードは、 COMMUNICATION_SERVICES_CONNECTION_STRING という名前の環境変数からリソースの接続文字列を取得します。 リソースの接続文字列を管理する方法について確認してください。

このコードを try ブロック内に追加します。

# This code demonstrates how to fetch your connection string
# from an environment variable.
connection_string = os.environ["COMMUNICATION_SERVICES_CONNECTION_STRING"]

# Instantiate the identity client
client = CommunicationIdentityClient.from_connection_string(connection_string)

手順 3: Teams ユーザーの Microsoft Entra アクセス トークンを通信 ID アクセス トークンに交換する

get_token_for_teams_user メソッドを使用して、Azure Communication Services SDK で使用できる Teams ユーザーのアクセス トークンを発行します。

# Exchange the Azure AD access token of the Teams User for a Communication Identity access token
token_result = client.get_token_for_teams_user(aad_token, client_id, user_object_id)
print("Token: " + token_result.token)

コードの実行

コンソール プロンプトから、exchange-teams-access-tokens.py ファイルが格納されているディレクトリに移動し、次の python コマンドを実行してアプリを実行します。

python ./exchange-communication-access-tokens.py

前提条件の設定

最終的なコード

このクイックスタートの最終的なコードは GitHub にあります。

設定

新しい Java アプリケーションを作成する

ターミナルまたはコマンド ウィンドウを開きます。 Java アプリケーションを作成するディレクトリに移動します。 次のコマンドを実行して、maven-archetype-quickstart テンプレートから Java プロジェクトを生成します。

mvn archetype:generate -DgroupId=com.communication.quickstart -DartifactId=communication-quickstart -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false

"generate" タスクによって、artifactId と同じ名前のディレクトリが作成されたことがわかります。 このディレクトリの下の src/main/java ディレクトリにはプロジェクトのソース コードが含まれており、src/test/java directory にはテスト ソースが含まれており、pom.xml ファイルはプロジェクトのプロジェクト オブジェクト モデル (POM) です。

パッケージをインストールする

テキスト エディターで pom.xml ファイルを開きます。 依存関係のグループに、次の dependency 要素を追加します。

<dependencies>
    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-communication-identity</artifactId>
        <version>[1.2.0,)</version>
    </dependency>
    <dependency>
      <groupId>com.microsoft.azure</groupId>
      <artifactId>msal4j</artifactId>
      <version>1.11.0</version>
    </dependency>
</dependencies>

アプリのフレームワークを設定する

プロジェクト ディレクトリで次の操作を行います。

  1. /src/main/java/com/communication/quickstart ディレクトリに移動します
  2. エディターで App.java ファイルを開きます
  3. System.out.println("Hello world!"); ステートメントを置き換えます
  4. import ディレクティブを追加します

次のコードを使用して開始します。

package com.communication.quickstart;

import com.azure.communication.identity.CommunicationIdentityClient;
import com.azure.communication.identity.CommunicationIdentityClientBuilder;
import com.azure.communication.identity.models.GetTokenForTeamsUserOptions;
import com.azure.core.credential.AccessToken;
import com.microsoft.aad.msal4j.IAuthenticationResult;
import com.microsoft.aad.msal4j.InteractiveRequestParameters;
import com.microsoft.aad.msal4j.PublicClientApplication;

import java.net.URI;
import java.util.HashSet;
import java.util.Set;

public class App
{
    public static void main( String[] args ) throws Exception
    {
        System.out.println("Azure Communication Services - Communication access token Quickstart");
        // Quickstart code goes here
    }
}

手順 1: MSAL ライブラリを使って Microsoft Entra ユーザー トークンとオブジェクト ID を受け取る

トークン交換フローの最初の手順は、Microsoft.Identity.Client を使用して、Teams ユーザーのトークンを取得することです。 Fabrikam のテナント内のユーザーに対応するオブジェクト ID (oid) 要求を取得し、userObjectId 変数を初期化できるように、tenantId 変数に基づいて適切な権限を持つ MSAL クライアントを構成することが不可欠です。

// You need to provide your Azure AD client ID and tenant ID
String appId = "<contoso_application_id>";
String tenantId = "<contoso_tenant_id>";
String authority = "https://login.microsoftonline.com/" + tenantId;

// Create an instance of PublicClientApplication
PublicClientApplication pca = PublicClientApplication.builder(appId)
        .authority(authority)
        .build();

String redirectUri = "http://localhost";
Set<String> scope = new HashSet<String>();
scope.add("https://auth.msft.communication.azure.com/Teams.ManageCalls");
scope.add("https://auth.msft.communication.azure.com/Teams.ManageChats");

// Create an instance of InteractiveRequestParameters for acquiring the AAD token and object ID of a Teams user
InteractiveRequestParameters parameters = InteractiveRequestParameters
                    .builder(new URI(redirectUri))
                    .scopes(scope)
                    .build();

// Retrieve the AAD token and object ID of a Teams user
IAuthenticationResult result = pca.acquireToken(parameters).get();
String teamsUserAadToken = result.accessToken();
String[] accountIds = result.account().homeAccountId().split("\\.");
String userObjectId = accountIds[0];
System.out.println("Teams token: " + teamsUserAadToken);

手順 2: CommunicationIdentityClient を初期化する

リソースのアクセス キーとエンドポイントを使用して、CommunicationIdentityClient をインスタンス化します。 リソースの接続文字列を管理する方法について確認してください。 加えて、クライアントは、com.azure.core.http.HttpClient インターフェイスを実装する任意のカスタム HTTP クライアントを使用して初期化できます。

main メソッドに次のコードを追加します。

//You can find your connection string from your resource in the Azure portal
String connectionString = "<connection_string>";

// Instantiate the identity client
CommunicationIdentityClient communicationIdentityClient = new CommunicationIdentityClientBuilder()
    .connectionString(connectionString)
    .buildClient();

手順 3: Teams ユーザーの Microsoft Entra アクセス トークンを通信 ID アクセス トークンに交換する

getTokenForTeamsUser メソッドを使用して、Azure Communication Services SDK で使用できる Teams ユーザーのアクセス トークンを発行します。

// Exchange the Azure AD access token of the Teams User for a Communication Identity access token
GetTokenForTeamsUserOptions options = new GetTokenForTeamsUserOptions(teamsUserAadToken, appId, userObjectId);
var accessToken = communicationIdentityClient.getTokenForTeamsUser(options);
System.out.println("Token: " + accessToken.getToken());

コードの実行

pom.xml ファイルが格納されているディレクトリに移動し、mvn compile コマンドを使用してプロジェクトをコンパイルします。

次に、パッケージをビルドします。

mvn package

次の mvn コマンドを実行して、アプリを実行します。

mvn exec:java -Dexec.mainClass="com.communication.quickstart.App" -Dexec.cleanupDaemonThreads=false

ユーザー操作

ユーザーは、Contoso アプリケーションの Fabrikam ユーザーを表します。 ユーザー エクスペリエンスを次の図に示します:

Teams ID に対する Azure Communication Services のサポートを有効にするユーザー アクションの図。

  1. Fabrikam のユーザーは、Contoso "クライアント アプリケーション" を使用して認証するように求められます。
  2. Contoso "クライアント アプリケーション" では MSAL を使って、Communication Services の Teams.ManageCalls および Teams.ManageChats アクセス許可を持つ Contoso アプリケーションの Fabrikam Microsoft Entra テナントに対してユーザーを認証します。
  3. 認証は、MSAL と Contoso アプリケーションのプロパティ "リダイレクト URI" で定義されているように、"サーバー" にリダイレクトされます。
  4. Contoso "サーバー" では、Communication Services Identity SDK を使って Microsoft Entra ユーザー トークンが Teams ユーザーのアクセス トークンに交換され、Teams ユーザーのアクセス トークンが "クライアント アプリケーション" に返されます。

クライアント アプリケーション で Teams ユーザーに対する有効なアクセス トークンがあれば、開発者は Communication Services Calling SDK を統合し、Teams ユーザーとして呼び出しを管理できます。

次の手順

このクイックスタートでは、次の方法について学習しました。

  • Microsoft Entra ID でアプリケーションを作成し、構成します。
  • Microsoft Authentication Library (MSAL) を使って Microsoft Entra ユーザー トークンを発行します。
  • Communication Services Identity SDK を使って、Microsoft Entra ユーザー トークンを Teams ユーザーのアクセス トークンに交換します。

次の概念について学習します。