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
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 用户的访问令牌。
为 Teams 用户构建受信任的身份验证服务以 Teams 用户身份呼叫 Teams 用户
了解以下概念:
以 Teams 用户身份进行通信的用例
Azure 通信服务支持 Teams 标识
Teams 互操作性
Teams 用户的单租户和多租户身份验证
在单页应用程序中为 Teams 用户创建和管理通信访问令牌 (SPA)