다음을 통해 공유


빠른 시작: Teams 사용자를 위한 액세스 토큰 설정 및 관리

이 빠른 시작에서는 MSAL(Microsoft 인증 라이브러리)를 사용하고 Microsoft Entra 사용자 토큰을 검색하여 Microsoft 365 사용자를 인증하는 .NET 콘솔 애플리케이션을 빌드합니다. 그런 다음, Azure Communication Services ID SDK를 통해 이 토큰을 Teams 사용자의 액세스 토큰으로 교환합니다. 이후 Communication Services Calling SDK에서 Teams 사용자의 액세스 토큰을 사용하여 통화 기능을 Teams 사용자로 통합할 수 있습니다.

참고 항목

프로덕션 환경에 있는 경우 교환 요청이 비밀로 서명되기 때문에 이 교환 메커니즘은 백엔드 서비스에서 구현하는 것이 좋습니다.

필수 조건

소개

Teams ID는 Microsoft Entra ID의 테넌트에 바인딩됩니다. 애플리케이션은 동일한 테넌트의 사용자 또는 다른 테넌트의 사용자도 사용할 수 있습니다. 이 빠른 시작에서는 가상 회사인 Contoso 및 Fabrikam의 사용자, 개발자 및 관리자를 통해 다중 테넌트 사용 사례를 살펴보겠습니다. 이 사용 사례에서 Contoso는 Fabrikam에 대해 SaaS(Software as a Service)를 빌드하고 있는 회사입니다.

다음 섹션에서는 관리자, 개발자 및 사용자를 위한 단계를 안내합니다. 다이어그램에 다중 테넌트 사용 사례가 설명되어 있습니다. 단일 테넌트를 사용하는 경우 단일 테넌트에서 Contoso 및 Fabrikam의 모든 단계를 실행합니다.

관리자 작업

관리자 역할에는 Microsoft Entra ID의 확장된 권한이 있습니다. 이 역할의 멤버는 리소스를 설정할 수 있으며 Azure Portal의 정보를 읽을 수 있습니다. 다음 다이어그램에서는 관리자가 실행해야 하는 모든 작업을 볼 수 있습니다.

Teams ID에 대한 Azure Communication Services 지원을 사용하도록 설정하는 관리자 작업

  1. Contoso 관리자는 Microsoft Entra ID에 기존 애플리케이션을 만들거나 선택합니다. 지원되는 계정 유형 속성은 다양한 테넌트의 사용자가 애플리케이션에 인증할 수 있는지 여부를 정의합니다. 리디렉션 URI 속성은 성공적인 인증 요청을 Contoso 의 서버로 리디렉션합니다.
  2. Contoso 관리자는 Communication Services의 Teams.ManageCallsTeams.ManageChats에 API 권한을 추가합니다.
  3. Contoso 관리자는 애플리케이션에 대한 퍼블릭 클라이언트 흐름을 허용합니다.
  4. Contoso의 관리자는 교환 요청을 인증하는 데 사용되는 기존 Communication Services를 만들거나 선택합니다. Microsoft Entra 사용자 토큰은 Teams 사용자의 액세스 토큰으로 교환됩니다. 자세한 내용은 Communication Services 리소스 만들기 및 관리를 참조하세요.
  5. Fabrikam 관리자는 Communication Services Teams.ManageCallsTeams.ManageChats 권한을 Contoso 애플리케이션에 부여합니다. Fabrikam 관리자만 Teams.ManageCallsTeams.ManageChats 권한을 사용하여 애플리케이션에 액세스 권한을 부여할 수 있는 경우 이 단계가 필요합니다.

1단계: Microsoft Entra 애플리케이션 등록 만들기 또는 Microsoft Entra 애플리케이션 선택

사용자는 Azure Communication Service Teams.ManageCalls 및 Teams.ManageChats 권한을 사용하여 Microsoft Entra 애플리케이션에 대해 인증되어야 합니다. 이 빠른 시작에 사용할 기존 애플리케이션이 없는 경우 새 애플리케이션 등록을 만들 수 있습니다.

환경에 영향을 주는 애플리케이션 설정은 다음과 같습니다.

  • 지원되는 계정 유형 속성은 애플리케이션이 단일 테넌트(‘이 조직 디렉터리에만 있는 계정’) 또는 다중 테넌트(‘모든 조직 디렉터리의 계정’)인지 여부를 정의합니다. 이 시나리오의 경우 다중 테넌트를 사용할 수 있습니다.
  • 리디렉션 URI는 인증 후 인증 요청이 리디렉션되는 URI를 정의합니다. 이 시나리오의 경우 퍼블릭 클라이언트/네이티브(모바일 및 데스크톱)를 사용하고 URI로 http://localhost를 입력합니다.

자세한 내용은 Microsoft ID 플랫폼을 사용하여 애플리케이션 등록을 참조하세요.

애플리케이션이 등록되면 개요에 식별자가 표시됩니다. 이 식별자, 애플리케이션(클라이언트) ID는 다음 단계에 사용됩니다.

2단계: 퍼블릭 클라이언트 흐름 허용

애플리케이션의 인증 창에서 http://localhost를 가리키는 리디렉션 URI를 사용하여 퍼블릭 클라이언트/네이티브(모바일 및 데스크톱)에 대해 구성된 플랫폼을 볼 수 있습니다. 창 하단에 퍼블릭 클라이언트 흐름 허용 토글 제어가 표시되며 이에 대한 빠른 시작은 로 설정되어 있어야 합니다.

3단계: 애플리케이션에서 Communication Services 권한 추가

애플리케이션은 테넌트의 Teams 통화 기능에 액세스할 수 있도록 Teams.ManageCalls 및 Teams.ManageChats 권한을 선언해야 합니다. Teams 사용자는 토큰 교환을 위해 이 권한을 사용하여 Microsoft Entra 사용자 토큰을 요청합니다.

  1. Azure Portal에서 Microsoft Entra 앱으로 이동하고 API 권한을 선택합니다.
  2. 권한 추가를 선택합니다.
  3. 권한 추가 메뉴에서 Azure Communication Services를 선택합니다.
  4. Teams.ManageCallsTeams.ManageChats 권한을 선택한 다음, 권한 추가를 선택합니다.

이전 단계에서 만든 Microsoft Entra 애플리케이션에 Teams.ManageCalls 및 Teams.ManageChats 권한을 추가합니다.

4단계: Communication Services 리소스 만들기 또는 선택

Communication Services 리소스는 Microsoft Entra 사용자 토큰을 Teams 사용자의 액세스 토큰으로 교환하기 위한 모든 요청을 인증하는 데 사용됩니다. 액세스 키로 인증할 수 있는 Communication Services ID SDK를 사용하거나 Azure RBAC(Azure 역할 기반 액세스 제어)를 사용하여 이 교환을 트리거할 수 있습니다. 액세스 키는 Azure Portal에서 가져오거나 Communication Services 리소스를 통해 액세스 제어(IAM) 창에서 Azure RBAC를 구성하여 가져올 수 있습니다.

새 Communication Services 리소스를 만들려면 Communication Services 리소스 만들기 및 관리를 참조하세요.

애플리케이션의 Teams.ManageCalls 및 Teams.ManageChats 권한에 대한 Microsoft Entra 관리자 동의를 요구하도록 Microsoft Entra 테넌트를 구성할 수 있습니다. 이 경우 Microsoft Entra 관리자는 Communication Services Teams.ManageCalls 및 Teams.ManageChats에 대한 권한을 Contoso 애플리케이션에 부여해야 합니다. 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. 관리자가 로그인하고 조직을 대신하여 사용 권한을 부여합니다.

동의가 부여되면 Fabrikam의 테넌트에 있는 Contoso 애플리케이션의 서비스 주체가 만들어집니다. Fabrikam 관리자는 다음 단계를 수행하여 Microsoft Entra ID에서 동의를 검토할 수 있습니다.

  1. Azure Portal에 관리자 권한으로 로그인합니다.
  2. Microsoft Entra ID로 이동합니다.
  3. Enterprise 애플리케이션 창에서 애플리케이션 유형 필터를 모든 애플리케이션으로 설정합니다.
  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 애플리케이션에 대한 서비스 주체가 없습니다. 이 문제를 해결하려면 PowerShell을 Microsoft Entra 관리자로 사용하여 테넌트에 연결합니다. 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 사용자의 액세스 토큰으로 교환되고 클라이언트 애플리케이션에 반환됩니다.

개발자의 필수 작업은 다음 다이어그램에 표시됩니다.

Teams ID에 대한 Azure Communication Services 지원을 사용하도록 설정하는 개발자 작업의 다이어그램

  1. Contoso 개발자는 Communication Services Teams.ManageCalls 및 Teams.ManageChats 권한을 위해 관리자가 이전에 만든 애플리케이션에 사용자를 인증하도록 MSAL(Microsoft 인증 라이브러리) 라이브러리를 구성합니다.
  2. Contoso 개발자는 Communication Services ID SDK를 초기화하고 ID SDK통해 들어오는 Microsoft Entra 사용자 토큰을 Teams 사용자의 액세스 토큰으로 교환합니다. 그러면 Teams 사용자의 액세스 토큰이 클라이언트 애플리케이션에 반환됩니다.

MSAL을 사용하여 개발자는 사용자를 인증하고 보안 웹 API에 액세스하기 위해 Microsoft ID 플랫폼 엔드포인트에서 Microsoft Entra 사용자 토큰을 획득할 수 있습니다. Communication Services에 대한 보안 액세스를 제공하는 데 사용할 수 있습니다. MSAL은 .NET, JavaScript, Java, Python, Android 및 iOS를 비롯한 다양한 애플리케이션 아키텍처 및 플랫폼을 지원합니다.

공용 설명서의 환경 설정에 대한 자세한 내용은 Microsoft 인증 라이브러리 개요를 참조하세요.

참고 항목

다음 섹션에서는 콘솔 애플리케이션을 위해 Microsoft Entra 액세스 토큰을 Teams 사용자의 액세스 토큰으로 교환하는 방법을 설명합니다.

전제 조건 설정

  • 운영 체제에 대한 최신 버전의 .NET SDK

최종 코드

GitHub에서 이 빠른 시작에 대한 최종 코드를 찾습니다.

설정

새 C# 애플리케이션 만들기

콘솔 창(예: cmd, PowerShell 또는 Bash)에서 dotnet new 명령을 사용하여 CommunicationAccessTokensQuickstart라는 새 콘솔 앱을 만듭니다. 이 명령은 Program.cs라는 원본 파일 하나만 들어 있는 간단한 "Hello World" C# 프로젝트를 만듭니다.

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 ID 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를 검색합니다. 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

'생성' 작업에서 artifactId와 동일한 이름으로 디렉터리를 만들었습니다. 이 디렉터리 아래의 src/main/java 디렉터리는 프로젝트 소스 코드를 포함하고, src/test/java directory 디렉터리는 테스트 원본을 포함하고, pom.xml 파일은 프로젝트의 프로젝트 개체 모델 또는 POM입니다.

패키지 설치

텍스트 편집기에서 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 사용자에 대한 토큰을 가져오는 것입니다. 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 ID SDK를 사용하여 Microsoft Entra 사용자 토큰을 Teams 사용자의 액세스 토큰으로 교환하고 Teams 사용자의 액세스 토큰을 클라이언트 애플리케이션에 반환합니다.

개발자는 클라이언트 애플리케이션에서 유효한 Teams 사용자의 액세스 토큰을 사용하여 Communication Services 통화 SDK를 통합하고 Teams 사용자로 통화를 관리할 수 있습니다.

다음 단계

이 빠른 시작에서는 다음과 같은 방법을 배웠습니다.

  • Microsoft Entra ID로 애플리케이션을 만들고 구성합니다.
  • MSAL(Microsoft 인증 라이브러리)을 사용하여 Microsoft Entra 사용자 토큰을 발급합니다.
  • Communication Services ID SDK를 사용하여 Microsoft Entra 사용자 토큰을 Teams 사용자의 액세스 토큰으로 교환합니다.

다음 개념에 대해 알아봅니다.