在本快速入门中,你将生成一个 .NET 控制台应用程序,以通过使用 Microsoft 身份验证库 (MSAL) 并检索 Microsoft Entra 用户令牌来对 Microsoft 365 用户进行身份验证。 接下来,你将使用 Azure 通信服务标识 SDK 将该令牌交换为 Teams 用户的访问令牌。 然后,通信服务调用 SDK 可使用 Teams 用户的访问令牌来集成以 Teams 用户身份使用的呼叫功能。
注意
在生产环境中,我们建议在后端服务中实现此交换机制,因为交换请求是使用机密签名的。
必备条件
- 具有活动订阅的 Azure 帐户。 免费创建帐户。
- 一个有效的 Azure 通信服务资源和连接字符串。 有关详细信息,请参阅创建 Azure 通信服务资源。
- 一个 Microsoft Entra 实例,其中的用户拥有 Teams 许可证。 有关详细信息,请参阅 Teams 许可证要求。
介绍
Teams 标识已绑定到 Microsoft Entra ID 中的租户。 来自同一租户或其他租户的用户可以使用你的应用程序。 在本快速入门中,你将与多个参与者(来自虚构公司 Contoso 和 Fabrikam 的用户、开发人员和管理员)一起完成多租户用例。 在此用例中,Contoso 是一家为 Fabrikam 构建服务型软件 (SaaS) 的公司。
以下部分将指导你完成管理员、开发人员和用户的步骤。 这些关系图演示了多租户用例。 如果使用单个租户,请从单个租户中的 Contoso 和 Fabrikam 执行所有步骤。
管理员操作
管理员角色在 Microsoft Entra ID 中拥有扩展权限。 此角色的成员可以设置资源,以及从 Azure 门户读取信息。 在下图中,可以看到必须由管理员执行的所有操作。
- Contoso 管理员在 Microsoft Entra ID 中创建或选择现有应用程序。 属性“支持的帐户类型”定义不同租户中的用户是否可以向应用程序进行身份验证。 属性“重定向 URI”将成功的身份验证请求重定向到 Contoso 的服务器 。
- Contoso 管理员从通信服务将 API 权限添加到
Teams.ManageCalls
和Teams.ManageChats
。 - Contoso 管理员允许应用程序的公共客户端流。
- Contoso 管理员创建或选择用于对交换请求进行身份验证的现有通信服务。 Microsoft Entra 用户令牌将交换为 Teams 用户的访问令牌。 有关详细信息,请参阅创建和管理通信服务资源。
- Fabrikam 管理员为 Contoso 应用程序授予通信服务
Teams.ManageCalls
和Teams.ManageChats
权限。 如果只有 Fabrikam 管理员才能为带有Teams.ManageCalls
和Teams.ManageChats
权限的应用程序授予访问权限,则此步骤是必需的。
步骤 1:创建 Microsoft Entra 应用程序注册或选择 Microsoft Entra 应用程序
用户必须向带有 Azure 通信服务 Teams.ManageCalls 和 Teams.ManageChats 权限的 Microsoft Entra 应用程序进行身份验证。 如果你没有要用于本快速入门的现有应用程序,可以创建新的应用程序注册。
以下应用程序设置会影响体验:
- “支持的帐户类型”属性定义应用程序是单租户(“仅此组织目录中的帐户”)还是多租户(“任何组织目录中的帐户”)。 对于本方案,可以使用多租户。
- “重定向 URI”定义在完成身份验证后要将身份验证请求重定向到的 URI。 对于本方案,可以使用“公共客户端/本机(移动和桌面)”并输入 作为 URI
http://localhost
。
有关详细信息,请参阅将应用程序注册到 Microsoft 标识平台。
注册应用程序后,你将在概述中看到标识符。 后续步骤中将使用此标识符,即“应用程序(客户端) ID”。
步骤 2:允许公共客户端流
在应用程序的“身份验证”窗格中,可以看到为公共客户端/本机(移动和桌面)配置的平台,其重定向 URI 指向 http://localhost。。 在该窗格的底部,可以看到“允许公共客户端流”切换控件,在本快速入门中,它应该设置为“是”。
步骤 3:在应用程序中添加通信服务权限
应用程序必须声明 Teams.ManageCalls 和 Teams.ManageChats 权限才能访问租户中的 Teams 呼叫功能。 Teams 用户将使用此权限请求 Microsoft Entra 用户令牌来交换令牌。
- 在 Azure 门户中导航到 Microsoft Entra 应用,然后选择“API 权限”
- 选择“添加权限”
- 在“添加权限”菜单中选择“Azure 通信服务”
- 选择 Teams.ManageCalls 和 Teams.ManageChats 权限,然后选择“添加权限”
步骤 4:创建或选择通信服务资源
Azure 通信服务资源用于对将 Microsoft Entra 用户令牌交换为 Teams 用户的访问令牌的所有请求进行身份验证。 可以使用通信服务标识 SDK(你可使用访问密钥或使用 Azure 基于角色的访问控制 (Azure RBAC) 对其进行身份验证)来触发这种交换。 可以在 Azure 门户中获取访问密钥,也可以通过按通信服务资源在“访问控制(IAM)”窗格配置 Azure RBAC 来获取访问密钥。
如果要创建新的通信服务资源,请参阅创建和管理通信服务资源。
步骤 5:提供管理员同意
可配置 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 管理员需执行以下步骤:
- 在 URL https://login.microsoftonline.com/{Tenant_ID}/adminconsent?client_id={Application_ID} 中,管理员将 {Tenant_ID} 替换为 Fabrikam 租户 ID,并将 {Application_ID} 替换为 Contoso 应用程序 ID。
- 管理员登录并代表组织授予权限。
如果授予了同意,则会在 Fabrikam 租户中创建 Contoso 应用程序的服务主体。 Fabrikam 管理员可通过执行以下步骤来查看 Microsoft Entra 中的同意:
- 以管理员身份登录到 Azure 门户。
- 转到 Microsoft Entra ID。
- 在“企业应用程序”窗格中,将“应用程序类型”筛选器设置为“所有应用程序” 。
- 在用于筛选应用程序的字段中,输入 Contoso 应用程序的名称。
- 选择“应用”。
- 使用所需的名称选择服务主体。
- 转到“权限”窗格。
可以看到,通信服务 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 用户的访问令牌,并返回到客户端应用程序。
下图显示了开发人员所需的操作:
- Contoso 开发人员配置 Microsoft 身份验证库 (MSAL),以便对前面由管理员针对通信服务 Teams.ManageCalls 和 Teams.ManageChats 权限创建的应用程序的用户进行身份验证。
- 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
设置应用框架
从项目目录中执行以下操作:
- 在文本编辑器中打开 Program.cs 文件
- 添加
using
指令以包括Azure.Communication.Identity
命名空间 - 更新
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_ID
和 AAD_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 文件中的依赖项列出。
设置应用框架
从项目目录中执行以下操作:
在代码编辑器中打开新文本文件
添加
require
调用以加载CommunicationIdentityClient
为程序创建结构,包括基本的异常处理
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}!`))
将新文件另存为
access-tokens-quickstart
并保存在issue-communication-access-token.js
目录中。
步骤 1:通过 MSAL 库接收 Microsoft Entra 用户令牌和对象 ID
令牌交换流的第一步是使用 Microsoft.Identity.Client 为 Teams 用户获取令牌。 以下代码将从名为 AAD_CLIENT_ID
和 AAD_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
设置先决条件
- Python 3.8+。
最终代码
在 GitHub 上查找此快速入门的最终代码。
开始参与
创建新的 Python 应用程序
打开终端或命令窗口,为应用创建一个新目录,并导航到该目录。
mkdir communication-access-tokens-quickstart && cd communication-access-tokens-quickstart
使用文本编辑器在项目根目录中创建名为
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_ID
和 AAD_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
设置先决条件
- Java 开发工具包 (JDK) 8 或更高版本。
- Apache Maven。
最终代码
在 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>
设置应用框架
从项目目录中执行以下操作:
- 导航到
/src/main/java/com/communication/quickstart
目录 - 在编辑器中打开
App.java
文件 - 替换
System.out.println("Hello world!");
语句 - 添加
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 用户。 下图显示了用户体验:
- Fabrikam 用户使用 Contoso 客户端应用程序,并会被提示进行身份验证。
- Contoso 客户端应用程序使用 MSAL 将用户身份向 Fabrikam Microsoft Entra 租户进行验证,以便用户可以访问拥有 Azure 通信服务 Teams.ManageCalls 和 Teams.ManageChats 权限的 Contoso 应用程序。
- 身份验证将根据 MSAL 和 Contoso 应用程序的“重定向 URI”属性中的定义重定向到服务器 。
- Contoso 服务器使用 Azure 通信服务标识 SDK 将 Microsoft Entra 用户令牌交换为 Teams 用户的访问令牌,并将 Teams 用户的访问令牌返回到客户端应用程序。
使用客户端应用程序中的有效 Teams 用户访问令牌,开发人员可集成通信服务呼叫 SDK 并以 Teams 用户的身份管理通话。
后续步骤
在此快速入门中,读者学习了如何:
- 在 Microsoft Entra ID 中创建和配置应用程序。
- 使用 Microsoft 身份验证库 (MSAL) 颁发 Microsoft Entra 用户令牌。
- 使用 Azure 通信服务标识 SDK 将 Microsoft Entra 用户令牌交换为 Teams 用户的访问令牌。
了解以下概念: