이 가이드에서는 Azure ID SDK의 DefaultAzureCredential API를 사용하여 Copilot SDK를 통해 Microsoft Foundry 모델로 인증하는 방법을 보여 줍니다.
작동 방식
Microsoft Foundry의 OpenAI 호환 엔드포인트는 정적 API 키 대신 Microsoft Entra ID 전달자 토큰을 허용합니다. 패턴은 다음과 같습니다.
DefaultAzureCredential범위에 대한 토큰을 얻으려면https://ai.azure.com/.default를 사용합니다.- BYOK 공급자 구성에서
bearer_token로 토큰을 전달합니다. - 토큰이 만료되기 전에 새로 고침(토큰은 일반적으로 ~1시간 동안 유효)

코드 샘플
사전 요구 사항
언어에 대한 Azure ID 및 Copilot SDK 패키지를 설치합니다.
코드 언어 navigation
dotnet add package GitHub.Copilot.SDK
dotnet add package Azure.Core
pip install github-copilot-sdk azure-identity
npm install @github/copilot-sdk @azure/identity
기본 사용법
DefaultAzureCredential를 사용하여 토큰을 가져오고 provider 구성에서 이를 Bearer 토큰으로 전달하세요:
코드 언어 navigation
using Azure.Core;
using Azure.Identity;
using GitHub.Copilot;
DefaultAzureCredential credential = new(
DefaultAzureCredential.DefaultEnvironmentVariableName);
AccessToken token = await credential.GetTokenAsync(
new TokenRequestContext(new[] { "https://ai.azure.com/.default" }));
await using CopilotClient client = new();
string? foundryUrl = Environment.GetEnvironmentVariable("FOUNDRY_RESOURCE_URL");
await using CopilotSession session = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-5.5",
Provider = new ProviderConfig
{
Type = "openai",
BaseUrl = $"{foundryUrl!.TrimEnd('/')}/openai/v1/",
BearerToken = token.Token,
WireApi = "responses",
},
});
AssistantMessageEvent? response = await session.SendAndWaitAsync(
new MessageOptions { Prompt = "Hello from Managed Identity!" });
Console.WriteLine(response?.Data.Content);
import asyncio
import os
from azure.identity import DefaultAzureCredential
from copilot import CopilotClient
from copilot.session import PermissionHandler, ProviderConfig
SCOPE = "https://ai.azure.com/.default"
async def main():
# Get a token using Managed Identity, Azure CLI, or other credential chain
credential = DefaultAzureCredential(require_envvar=True)
token = credential.get_token(SCOPE).token
foundry_url = os.environ["FOUNDRY_RESOURCE_URL"]
client = CopilotClient()
await client.start()
session = await client.create_session(
on_permission_request=PermissionHandler.approve_all,
model="gpt-5.5",
provider=ProviderConfig(
type="openai",
base_url=f"{foundry_url.rstrip('/')}/openai/v1/",
bearer_token=token, # Short-lived bearer token
wire_api="responses",
),
)
response = await session.send_and_wait("Hello from Managed Identity!")
print(response.data.content)
await client.stop()
asyncio.run(main())
import { DefaultAzureCredential } from "@azure/identity";
import { CopilotClient } from "@github/copilot-sdk";
const credential = new DefaultAzureCredential({
requiredEnvVars: ["AZURE_TOKEN_CREDENTIALS"],
});
const tokenResponse = await credential.getToken(
"https://ai.azure.com/.default"
);
const client = new CopilotClient();
const session = await client.createSession({
model: "gpt-5.5",
provider: {
type: "openai",
baseUrl: `${process.env.FOUNDRY_RESOURCE_URL}/openai/v1/`,
bearerToken: tokenResponse.token,
wireApi: "responses",
},
});
const response = await session.sendAndWait({ prompt: "Hello!" });
console.log(response?.data.content);
await client.stop();
장기 실행 애플리케이션에 대한 토큰 새로 고침
전달자 토큰은 만료됩니다(일반적으로 ~1시간 후). 서버 또는 장기 실행 에이전트의 경우 각 세션을 만들기 전에 토큰을 새로 고칩니다. 다음 Python 예제에서는 이 패턴을 보여 줍니다.
from azure.identity import DefaultAzureCredential
from copilot import CopilotClient
from copilot.session import PermissionHandler, ProviderConfig
SCOPE = "https://ai.azure.com/.default"
class ManagedIdentityCopilotAgent:
"""Copilot agent that refreshes Microsoft Entra tokens for Microsoft Foundry."""
def __init__(self, foundry_url: str, model: str = "gpt-5.5"):
self.foundry_url = foundry_url.rstrip("/")
self.model = model
self.credential = DefaultAzureCredential(require_envvar=True)
self.client = CopilotClient()
def _get_provider_config(self) -> ProviderConfig:
"""Build a ProviderConfig with a fresh bearer token."""
token = self.credential.get_token(SCOPE).token
return ProviderConfig(
type="openai",
base_url=f"{self.foundry_url}/openai/v1/",
bearer_token=token,
wire_api="responses",
)
async def chat(self, prompt: str) -> str:
"""Send a prompt and return the response text."""
# Fresh token for each session
session = await self.client.create_session(
on_permission_request=PermissionHandler.approve_all,
model=self.model,
provider=self._get_provider_config(),
)
response = await session.send_and_wait(prompt)
await session.disconnect()
return response.data.content if response else ""
환경 구성
| 변수 | Description | Example |
|---|---|---|
AZURE_TOKEN_CREDENTIALS | ||
Azure에서 실행하는 경우 Managed로 설정합니다. | ||
로컬에서 실행할 때는 이를 dev 또는 Azure와 같은 개발자 도구 자격 증명 이름으로 설정하세요. | Managed | |
FOUNDRY_RESOURCE_ | 사용자의 Microsoft Foundry 리소스 URL | https:/ |
API 키 환경 변수가 필요하지 않습니다. 인증은 자동으로 지원하는 다음을 DefaultAzureCredential통해 처리됩니다.
- Azure 호스팅 앱의 경우 관리 ID(시스템 할당 또는 사용자 할당):
- Azure CLI(
az login): 로컬 개발용 - 환경 변수 (
AZURE_CLIENT_ID,AZURE_TENANT_ID,AZURE_CLIENT_SECRET): 서비스 주체의 경우 - 워크로드 ID: Kubernetes의 경우
DefaultAzureCredential 전체 자격 증명 체인에 대한 설명서를 참조하세요.
이 패턴을 사용하는 경우
| Scenario | Recommendation |
|---|---|
| 관리 ID를 사용하는 Azure 호스팅 앱 | |
| ✅ 이 패턴 사용 | |
| 기존 Microsoft Entra 서비스 주체를 사용하는 앱 | |
| ✅ 이 패턴 사용 | |
az login를 사용한 로컬 개발 | |
| ✅ 이 패턴 사용 | |
| 정적 API 키를 사용하는 비 Azure 환경 | |
| BYOK(사용자 고유의 키 가져오기) 사용 | |
| GitHub Copilot 구독 사용 가능 | |
| GitHub OAuth 설정 사용 |
참고하십시오
- BYOK(사용자 고유의 키 가져오기): 정적 API 키 구성
- 백 엔드 서비스 설정: 서버 쪽 배포
- Azure ID 설명서