본문으로 건너뛰기

Microsoft Graph 애플리케이션 등록

Teams 세션 파이프라인은 앱 전용(데몬) 인증을 사용하여 Microsoft Graph에서 세션 기록, 녹음 파일 및 관련 아티팩트를 읽습니다. 즉, 사용자 로그인이나 세션당 대화형 동의가 없습니다. 이를 위해서는 관리자가 동의한 애플리케이션 권한으로 Azure AD 애플리케이션을 등록해야 합니다.

이 가이드에서는 다음 내용을 안내합니다.

  1. 앱 등록 만들기
  2. 클라이언트 비밀번호 만들기
  3. 파이프라인에 필요한 그래프 API 권한 부여
  4. 해당 권한에 대한 관리자 동의
  5. (선택 사항) 애플리케이션 액세스 정책을 사용하여 특정 사용자로 앱 범위 지정

이 작업을 완료하려면 테넌트 관리자 권한(또는 사용자를 대신하여 동의를 부여하는 관리자)이 필요합니다. 수집한 값을 북마크에 추가하세요. 값은 마지막에 ~/.hermes/.env에 들어갑니다.

전제 조건

  • 모임 기록 및 녹음을 생성하는 Teams Premium 또는 Teams 라이선스가 있는 Microsoft 365 테넌트
  • entra.microsoft.com에서 Azure Portal에 대한 관리자 액세스
  • 그래프 변경 알림을 위해 공개적으로 연결 가능한 HTTPS 엔드포인트(나중에 웹훅 리스너 단계에서 설정)

1단계: 앱 등록 생성

  1. 테넌트 관리자로 entra.microsoft.com에 로그인합니다.
  2. ID → 애플리케이션 → 앱 등록으로 이동합니다.
  3. 신규 등록을 클릭합니다.
  4. 작성:
    • 이름: Hermes Teams Meeting Pipeline(또는 사용자가 인식할 수 있는 이름).
    • 지원되는 계정 유형: 이 조직 디렉터리의 계정만 해당(단일 테넌트).
    • 리디렉션 URI: 비워두세요. 앱 전용 인증에는 필요하지 않습니다.
  5. 등록을 클릭하세요.

앱의 개요 페이지로 이동하게 됩니다. 두 값을 복사합니다.

  • 애플리케이션(클라이언트) IDMSGRAPH_CLIENT_ID
  • 디렉터리(테넌트) IDMSGRAPH_TENANT_ID

2단계: 클라이언트 비밀번호 생성

  1. 왼쪽 탐색 메뉴에서 인증서 및 비밀을 엽니다.
  2. 새 클라이언트 비밀번호를 클릭합니다.
  3. 설명:hermes-graph-secret.만료: 순환 정책과 일치하는 값을 선택합니다(일반적으로 6~24개월).
  4. 추가를 클릭합니다.
  5. 열을 즉시 복사하세요. 한 번만 표시됩니다. 해당 값은 MSGRAPH_CLIENT_SECRET입니다.

비밀 ID열은 비밀이 아닙니다. 열이 필요합니다.

3단계: 그래프 API 권한 부여

파이프라인은 최소한으로 실행 가능한 애플리케이션 권한 집합을 사용합니다. 필요한 것만 추가하세요. 각각은 앱이 테넌트 전체에서 읽을 수 있는 범위를 넓힙니다.

  1. 왼쪽 탐색 메뉴에서 API 권한을 엽니다.
  2. 권한 추가Microsoft Graph응용 프로그램 권한을 클릭합니다.
  3. 파이프라인에서 수행하려는 작업과 일치하는 권한을 아래 표에서 추가하세요.
  4. 추가한 후 <your tenant>에 대한 관리자 동의 부여를 클릭하세요. 상태 열은 모든 권한에 대해 녹색 확인 표시로 바뀌어야 합니다.

성적표 우선 요약에 필수

허가앱이 수행할 수 있는 작업
OnlineMeetings.Read.AllTeams 온라인 모임 메타데이터(제목, 참가자, 참가 URL)를 읽어보세요.
OnlineMeetingTranscript.Read.AllTeams에서 생성된 모임 기록을 읽어보세요.

대체 녹음에 필요합니다(대본을 사용할 수 없는 경우).

허가앱이 수행할 수 있는 작업
OnlineMeetingRecording.Read.All오프라인 STT 처리를 위해 Teams 모임 녹음을 다운로드하세요.
CallRecords.Read.All참여 URL만 알려진 경우 통화 기록에서 세션를 해결합니다.

아웃바운드 요약 전달에 필요(그래프 모드만 해당)

platforms.teams.extra.delivery_modegraph인 경우 파이프라인은 Teams 채널에 요약을 게시하거나 그래프 API를 통해 채팅합니다. 대신 incoming_webhook 배송 모드를 사용하는 경우에는 이 단계를 건너뛰세요.

허가앱이 수행할 수 있는 작업
ChannelMessage.Send앱을 대신하여 Teams 채널에 메시지를 게시합니다.
Chat.ReadWrite.All1:1 및 그룹 채팅에 메시지를 게시하세요(chat_id을 전달 대상으로 설정한 경우에만 해당).
  • OnlineMeetings.ReadWrite.All / Chat.ReadWrite(.All 제외) - 파이프라인 요구 사항보다 넓습니다.
  • 위임된 권한 — 파이프라인은 앱 전용(클라이언트 자격 증명) 흐름을 사용합니다. 위임된 권한은 사용자 로그인 없이는 작동하지 않습니다.

기본적으로 OnlineMeetings.Read.All과 같은 애플리케이션 권한은 테넌트의 모든 모임에 대한 액세스 권한을 앱에 부여합니다. 파트너 데모 및 개발 테넌트에게는 괜찮습니다. 프로덕션에서는 앱이 읽을 수 있는 사용자 세션를 제한하려고 할 것입니다.

Microsoft는 이를 위해 정확하게 Teams용 애플리케이션 액세스 정책을 제공합니다. 정책은 PowerShell 전용 표면입니다. 이에 대한 포털 UI가 없습니다.

MicrosoftTeams 모듈이 설치 및 연결된 관리자 PowerShell에서(Connect-MicrosoftTeams):

# Create a policy scoped to the Hermes app
New-CsApplicationAccessPolicy `
-Identity "Hermes-Meeting-Pipeline-Policy" `
-AppIds "<MSGRAPH_CLIENT_ID>" `
-Description "Restrict Hermes meeting pipeline to allow-listed users"

# Grant the policy to specific users whose meetings the pipeline may read
Grant-CsApplicationAccessPolicy `
-PolicyName "Hermes-Meeting-Pipeline-Policy" `
-Identity "alice@example.com"

Grant-CsApplicationAccessPolicy `
-PolicyName "Hermes-Meeting-Pipeline-Policy" `
-Identity "bob@example.com"

승인 후 전파에는 최대 30분이 걸릴 수 있습니다. 다음을 통해 확인하세요.

Test-CsApplicationAccessPolicy -Identity "alice@example.com" -AppId "<MSGRAPH_CLIENT_ID>"

정책이 없으면 모든 사용자의 세션를 읽을 수 있습니다. 이는 기술적으로 권한이 부여되는 것입니다. 프로덕션 테넌트에서는 이 단계를 건너뛰지 마세요.

5단계: Env 파일에 자격 증명 쓰기

수집한 세 가지 값을 ~/.hermes/.env에 입력하세요.

MSGRAPH_TENANT_ID=<directory-tenant-id>
MSGRAPH_CLIENT_ID=<application-client-id>
MSGRAPH_CLIENT_SECRET=<client-secret-value>

본인만 비밀을 읽을 수 있도록 파일 권한을 설정하세요.

chmod 600 ~/.hermes/.env

6단계: 토큰 흐름 확인

Hermes는 Graph 인증 연기 테스트를 제공합니다. Hermes 설치에서:

python -c "
import asyncio
from tools.microsoft_graph_auth import MicrosoftGraphTokenProvider
provider = MicrosoftGraphTokenProvider.from_env()
token = asyncio.run(provider.get_access_token())
print('Token acquired, length:', len(token))
print(provider.inspect_token_health())
"

성공적인 실행은 cached: True 및 3600 근처의 expires_in_seconds 값을 표시하는 긴 토큰 문자열과 상태 dict를 인쇄합니다. 실패하면 Azure 오류 코드와 함께 MicrosoftGraphTokenError이 생성됩니다. 가장 일반적인 것은 다음과 같습니다.

Azure 오류의미수정
AADSTS7000215: Invalid client secret비밀번호 값이 일치하지 않거나 만료되었습니다.2단계에서 새 비밀을 생성합니다. .env을 업데이트하세요.
AADSTS700016: Application not foundMSGRAPH_CLIENT_ID 또는 잘못된 테넌트가 잘못되었습니다.1단계의 값이 동일한 앱에서 나온 것인지 다시 확인하세요.
AADSTS90002: Tenant not foundMSGRAPH_TENANT_ID에 오타가 있습니다.앱 개요에서 디렉터리(테넌트) ID를 다시 복사합니다.
insufficient_claims 호출 시간(토큰 시간 아님)토큰을 획득했지만 그래프가 401/403을 반환합니다.3단계 관리자 동의를 건너뛰었거나 권한을 추가했지만 다시 동의하지 않았습니다. API 권한을 다시 방문하여 관리자 동의 부여를 다시 클릭하세요.

클라이언트 비밀번호 교체

Azure 클라이언트 비밀에는 강제 만료가 있습니다. 만료되기 전:

  1. 첫 번째 클라이언트 암호를 삭제하지 않고 2단계에서 두 번째 클라이언트 암호를 만듭니다.
  2. ~/.hermes/.envMSGRAPH_CLIENT_SECRET을 새 값으로 업데이트합니다.
  3. 새 비밀번호가 선택되도록 게이트웨이를 다시 시작하세요: hermes gateway restart.
  4. 위의 스모크 테스트를 통해 확인해보세요.
  5. Azure Portal에서 이전 비밀을 삭제합니다.

다음 단계

자격 증명이 완전히 확인되면 다음을 계속 진행합니다.

  • 웹훅 리스너 설정 — 그래프 변경 알림을 수신하는 msgraph_webhook 게이트웨이 플랫폼을 시작합니다.
  • 파이프라인 구성 — Teams 미팅 파이프라인 런타임 및 운영자 CLI를 구성합니다.
  • 아웃바운드 전달 - 요약을 Teams 채널이나 채팅으로 다시 전송합니다.

해당 페이지는 해당 런타임을 추가하는 PR과 함께 표시됩니다. 이 자격 증명 설정은 독립 실행형 전제 조건이며 미리 완료해도 안전합니다.