你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:设置和管理 Teams 用户的访问令牌

在本快速入门中,你将生成一个 .NET 控制台应用程序,以通过使用 Microsoft 身份验证库 (MSAL) 并检索 Microsoft Entra 用户令牌来对 Microsoft 365 用户进行身份验证。 接下来,你将使用 Azure 通信服务标识 SDK 将该令牌交换为 Teams 用户的访问令牌。 然后,通信服务调用 SDK 可使用 Teams 用户的访问令牌来集成以 Teams 用户身份使用的呼叫功能。

注意

在生产环境中,我们建议在后端服务中实现此交换机制,因为交换请求是使用机密签名的。

必备条件

介绍

Teams 标识已绑定到 Microsoft Entra ID 中的租户。 来自同一租户或其他租户的用户可以使用你的应用程序。 在本快速入门中,你将与多个参与者(来自虚构公司 Contoso 和 Fabrikam 的用户、开发人员和管理员)一起完成多租户用例。 在此用例中,Contoso 是一家为 Fabrikam 构建服务型软件 (SaaS) 的公司。

以下部分将指导你完成管理员、开发人员和用户的步骤。 这些关系图演示了多租户用例。 如果使用单个租户,请从单个租户中的 Contoso 和 Fabrikam 执行所有步骤。

管理员操作

管理员角色在 Microsoft Entra ID 中拥有扩展权限。 此角色的成员可以设置资源,以及从 Azure 门户读取信息。 在下图中,可以看到必须由管理员执行的所有操作。

启用 Azure 通信服务对 Teams 标识的支持的管理员操作。

  1. Contoso 管理员在 Microsoft Entra ID 中创建或选择现有应用程序。 属性“支持的帐户类型”定义不同租户中的用户是否可以向应用程序进行身份验证。 属性“重定向 URI”将成功的身份验证请求重定向到 Contoso 的服务器 。
  2. Contoso 管理员从通信服务将 API 权限添加到 Teams.ManageCallsTeams.ManageChats
  3. Contoso 管理员允许应用程序的公共客户端流。
  4. Contoso 管理员创建或选择用于对交换请求进行身份验证的现有通信服务。 Microsoft Entra 用户令牌将交换为 Teams 用户的访问令牌。 有关详细信息,请参阅创建和管理通信服务资源
  5. Fabrikam 管理员为 Contoso 应用程序授予通信服务 Teams.ManageCallsTeams.ManageChats 权限。 如果只有 Fabrikam 管理员才能为带有 Teams.ManageCallsTeams.ManageChats 权限的应用程序授予访问权限,则此步骤是必需的。

步骤 1:创建 Microsoft Entra 应用程序注册或选择 Microsoft Entra 应用程序

用户必须向带有 Azure 通信服务 Teams.ManageCalls 和 Teams.ManageChats 权限的 Microsoft Entra 应用程序进行身份验证。 如果你没有要用于本快速入门的现有应用程序,可以创建新的应用程序注册。

以下应用程序设置会影响体验:

  • “支持的帐户类型”属性定义应用程序是单租户(“仅此组织目录中的帐户”)还是多租户(“任何组织目录中的帐户”)。 对于本方案,可以使用多租户。
  • “重定向 URI”定义在完成身份验证后要将身份验证请求重定向到的 URI。 对于本方案,可以使用“公共客户端/本机(移动和桌面)”并输入 作为 URIhttp://localhost

有关详细信息,请参阅将应用程序注册到 Microsoft 标识平台

注册应用程序后,你将在概述中看到标识符。 后续步骤中将使用此标识符,即“应用程序(客户端) ID”。

步骤 2:允许公共客户端流

在应用程序的“身份验证”窗格中,可以看到为公共客户端/本机(移动和桌面)配置的平台,其重定向 URI 指向 http://localhost。 在该窗格的底部,可以看到“允许公共客户端流”切换控件,在本快速入门中,它应该设置为“是”。

步骤 3:在应用程序中添加通信服务权限

应用程序必须声明 Teams.ManageCalls 和 Teams.ManageChats 权限才能访问租户中的 Teams 呼叫功能。 Teams 用户将使用此权限请求 Microsoft Entra 用户令牌来交换令牌。

  1. 在 Azure 门户中导航到 Microsoft Entra 应用,然后选择“API 权限
  2. 选择“添加权限”
  3. 在“添加权限”菜单中选择“Azure 通信服务”
  4. 选择 Teams.ManageCalls 和 Teams.ManageChats 权限,然后选择“添加权限”

向上一步中创建的 Microsoft Entra 应用程序添加 Teams.ManageCalls 和 Teams.ManageChats 权限。

步骤 4:创建或选择通信服务资源

Azure 通信服务资源用于对将 Microsoft Entra 用户令牌交换为 Teams 用户的访问令牌的所有请求进行身份验证。 可以使用通信服务标识 SDK(你可使用访问密钥或使用 Azure 基于角色的访问控制 (Azure RBAC) 对其进行身份验证)来触发这种交换。 可以在 Azure 门户中获取访问密钥,也可以通过按通信服务资源在“访问控制(IAM)”窗格配置 Azure RBAC 来获取访问密钥。

如果要创建新的通信服务资源,请参阅创建和管理通信服务资源

可配置 Microsoft Entra 租户,以要求 Microsoft Entra 管理员许可应用程序的 Teams.ManageCalls 和 Teams.ManageChats 权限。 在这种情况下,Microsoft Entra 管理员必须向 Contoso 应用程序授予对 Azure 通信服务 Teams.ManageCalls 和 Teams.ManageChats 的权限。 Fabrikam Microsoft Entra 管理员通过唯一的 URL 提供同意。

以下角色可代表公司同意:

  • 全局管理员
  • 应用程序管理员
  • 云应用程序管理员

如需在 Azure 门户中查看角色,请参阅列出 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. 管理员登录并代表组织授予权限。

如果授予了同意,则会在 Fabrikam 租户中创建 Contoso 应用程序的服务主体。 Fabrikam 管理员可通过执行以下步骤来查看 Microsoft Entra 中的同意:

  1. 以管理员身份登录到 Azure 门户。
  2. 转到 Microsoft Entra ID。
  3. 在“企业应用程序”窗格中,将“应用程序类型”筛选器设置为“所有应用程序” 。
  4. 在用于筛选应用程序的字段中,输入 Contoso 应用程序的名称。
  5. 选择“应用”。
  6. 使用所需的名称选择服务主体。
  7. 转到“权限”窗格。

可以看到,通信服务 Teams.ManageCalls 和 Teams.ManageChats 权限的状态为“已为 {Directory_name} 授予”。

如果你遇到如下问题:“应用程序正在尝试访问服务“1fd5118e-2576-4263-8130-9503064c837a(Azure 通信服务),而你的组织“{GUID}”缺少该服务的服务主体。 请与你的 IT 管理员联系,以查看服务订阅的配置或同意应用程序创建所需的服务主体”。则表示你的 Microsoft Entra 租户缺少 Azure 通信服务应用程序的服务主体。 要解决此问题,请以 Microsoft Entra 管理员身份使用 PowerShell 连接到你的租户。 将 Tenant_ID 替换为你的 Microsoft Entra 租户的 ID。

你将需要如下所示的 Application.ReadWrite.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 用户的访问令牌,并返回到客户端应用程序

下图显示了开发人员所需的操作:

启用 Azure 通信服务对 Teams 标识的支持的开发人员操作关系图。

  1. Contoso 开发人员配置 Microsoft 身份验证库 (MSAL),以便对前面由管理员针对通信服务 Teams.ManageCalls 和 Teams.ManageChats 权限创建的应用程序的用户进行身份验证。
  2. Contoso 开发人员初始化 Azure 通信服务标识 SDK,并通过标识 SDK 将传入的 Microsoft Entra 用户令牌交换为 Teams 用户的访问令牌。 Teams 用户的访问令牌随后将返回到客户端应用程序。

开发人员可以使用 MSAL 从 Microsoft 标识平台终结点获取 Microsoft Entra 用户令牌,以便对用户进行身份验证并访问安全的 Web API。 使用该库可以安全访问通信服务。 MSAL 支持许多不同的应用程序体系结构和平台,包括 .NET、JavaScript、Java、Python、Android 和 iOS。

有关设置环境的详细信息,请参阅公共文档 Microsoft 身份验证库概述

注意

以下部分介绍了如何为控制台应用程序将 Microsoft Entra 访问令牌交换为 Teams 用户的访问令牌。

设置先决条件

  • 适用于操作系统的最新版本 .NET SDK

最终代码

GitHub 上查找此快速入门的最终代码。

开始参与

新建 C# 应用程序

在控制台窗口(例如 cmd、PowerShell 或 Bash)中,使用 dotnet new 命令创建名为 CommunicationAccessTokensQuickstart 的新控制台应用。 此命令将创建包含单个源文件的简单“Hello World”C# 项目:Program.cs

dotnet new console -o CommunicationAccessTokensQuickstart

将目录更改为新创建的应用文件夹,并使用 dotnet build 命令编译应用程序。

cd CommunicationAccessTokensQuickstart
dotnet build

安装包

仍在应用程序目录中时,使用 dotnet add package 命令安装适用于 .NET 包的 Azure 通信服务标识库。

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

设置应用框架

从项目目录中执行以下操作:

  1. 在文本编辑器中打开 Program.cs 文件
  2. 添加 using 指令以包括 Azure.Communication.Identity 命名空间
  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。 必须基于 AAD_TENANT_ID 环境变量为 MSAL 客户端配置正确颁发机构,以便能够检索与 Fabrikam 租户中的用户相对应的对象 ID (oid) 声明并初始化 userObjectId 变量。

// 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 访问令牌交换为通信标识访问令牌

使用 GetTokenForTeamsUser 方法为 Teams 用户颁发可与 Azure 通信服务 SDK 一起使用的访问令牌。

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 通信服务标识 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. 添加 require 调用以加载 CommunicationIdentityClient

  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。 必须基于 AAD_TENANT_ID 环境变量为 MSAL 客户端配置正确颁发机构,以便能够检索与 Fabrikam 租户中的用户相对应的对象 ID (oid) 声明并初始化 userObjectId 变量。

// 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 访问令牌交换为通信标识访问令牌

使用 getTokenForTeamsUser 方法为 Teams 用户颁发可与 Azure 通信服务 SDK 一起使用的访问令牌。

//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 通信服务标识 SDK。

pip install azure-communication-identity
pip install msal

步骤 1:通过 MSAL 库接收 Microsoft Entra 用户令牌和对象 ID

令牌交换流的第一步是使用 Microsoft.Identity.Client 为 Teams 用户获取令牌。 在 Azure 门户中,将“移动和桌面应用程序”的重定向 URI 配置为 http://localhost。 以下代码将从名为 AAD_CLIENT_IDAAD_TENANT_ID 的环境变量中检索 Microsoft Entra 客户端 ID 和租户 ID。 必须基于 AAD_TENANT_ID 环境变量为 MSAL 客户端配置正确颁发机构,以便能够检索与 Fabrikam 租户中的用户相对应的对象 ID (oid) 声明并初始化 user_object_id 变量。

# 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 访问令牌交换为通信标识访问令牌

使用 get_token_for_teams_user 方法为 Teams 用户颁发可与 Azure 通信服务 SDK 一起使用的访问令牌。

# 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

你会注意到,“生成”任务创建了与 artifactId 名称相同的目录。 在此目录下,src/main/java 目录包含项目源代码,src/test/java directory 包含测试源,pom.xml 文件是项目的项目对象模型 (POM)。

安装包

在文本编辑器中打开 pom.xml 文件pom.xml。 将以下依赖项元素添加到依赖项组。

<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 用户获取令牌。 必须基于 tenantId 变量为 MSAL 客户端配置正确颁发机构,以便能够检索与 Fabrikam 租户中的用户相对应的对象 ID (oid) 声明并初始化 userObjectId 变量。

// 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 访问令牌交换为通信标识访问令牌

使用 getTokenForTeamsUser 方法为 Teams 用户颁发可与 Azure 通信服务 SDK 一起使用的访问令牌。

// 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 用户。 下图显示了用户体验:

启用 Azure 通信服务对 Teams 标识的支持的用户操作关系图。

  1. Fabrikam 用户使用 Contoso 客户端应用程序,并会被提示进行身份验证。
  2. Contoso 客户端应用程序使用 MSAL 将用户身份向 Fabrikam Microsoft Entra 租户进行验证,以便用户可以访问拥有 Azure 通信服务 Teams.ManageCalls 和 Teams.ManageChats 权限的 Contoso 应用程序。
  3. 身份验证将根据 MSAL 和 Contoso 应用程序的“重定向 URI”属性中的定义重定向到服务器 。
  4. Contoso 服务器使用 Azure 通信服务标识 SDK 将 Microsoft Entra 用户令牌交换为 Teams 用户的访问令牌,并将 Teams 用户的访问令牌返回到客户端应用程序

使用客户端应用程序中的有效 Teams 用户访问令牌,开发人员可集成通信服务呼叫 SDK 并以 Teams 用户的身份管理通话。

后续步骤

在此快速入门中,读者学习了如何:

  • 在 Microsoft Entra ID 中创建和配置应用程序。
  • 使用 Microsoft 身份验证库 (MSAL) 颁发 Microsoft Entra 用户令牌。
  • 使用 Azure 通信服务标识 SDK 将 Microsoft Entra 用户令牌交换为 Teams 用户的访问令牌。

了解以下概念: