このガイドでは、Azure Identity SDK のDefaultAzureCredential API を使用して、Copilot SDK を使用してMicrosoft Foundry モデルで認証する方法について説明します。
どのように機能するのか
Microsoft Foundry の OpenAI 互換エンドポイントは、静的 API キーの代わりにMicrosoft Entra IDからベアラー トークンを受け入れます。 パターンは次のとおりです。
DefaultAzureCredentialを使用して、https://ai.azure.com/.defaultスコープのトークンを取得する- BYOK プロバイダー構成でトークンを
bearer_tokenとして渡す - 有効期限が切れる前にトークンを更新します (通常、トークンは最大 1 時間有効です)

コードサンプル
Prerequisites
言語の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を使用してトークンを取得し、プロバイダー構成でベアラー トークンとして渡します。
コード言語 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によって処理され、自動的にサポートされます。
- 管理 ID (システム割り当てまたはユーザー割り当て): Azureホストされているアプリの場合
- Azure CLI (
az login): ローカル開発用 - 環境変数(
AZURE_CLIENT_ID、AZURE_TENANT_ID、AZURE_CLIENT_SECRET): サービス プリンシパル用 - ワークロード アイデンティティ: Kubernetes 向け
完全な資格情報チェーンについては、 DefaultAzureCredential ドキュメントを参照してください。
このパターンを使用する場合
| シナリオ | レコメンデーション |
|---|---|
| マネージド ID を使用した Azure でホストされるアプリ | |
| ✅ このパターンを使用する | |
| 既存のMicrosoft Entra サービス プリンシパルを持つアプリ | |
| ✅ このパターンを使用する | |
az login を使用したローカル開発 | |
| ✅ このパターンを使用する | |
| 静的 API キーを使用する Azure 以外の環境 | |
| AUTOTITLE を使用する | |
| 利用可能なGitHub Copilot サブスクリプション | |
| AUTOTITLE を使用する |
こちらも参照ください
- BYOK (独自のキーを持ち込む): 静的 API キーの構成
- バックエンド サービスのセットアップ: サーバー側の展開
- Azure ID のドキュメント