# BYOK を使用した Azure マネージド ID

Copilot SDK の BYOK (独自のキーを持ち込む) は静的 API キーを受け入れますが、Azureデプロイでは、有効期間の長いキーではなく、Managed Identity (Entra ID) が使用されることがよくあります。 SDK ではEntra ID認証がネイティブにサポートされていないため、bearer_token プロバイダー構成フィールドを介して有効期間の短いベアラー トークンを使用できます。

<!-- markdownlint-disable GHD046 GHD005 -->

<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->

このガイドでは、`DefaultAzureCredential` ライブラリの [](https://learn.microsoft.com/python/api/azure-identity/azure.identity.defaultazurecredential) を使用して、Copilot SDK を使用してAzure AI Foundry モデルで認証する方法について説明します。

## どのように機能するのか

Azure AI Foundry の OpenAI 互換エンドポイントは、静的 API キーの代わりに Entra ID からベアラー トークンを受け入れます。 パターンは次のとおりです。

1. `DefaultAzureCredential`を使用して、`https://cognitiveservices.azure.com/.default` スコープのトークンを取得する
2. BYOK プロバイダー構成でトークンを `bearer_token` として渡す
3. 有効期限が切れる前にトークンを更新します (通常、トークンは最大 1 時間有効です)

![図: 説明されたプロセスを示すシーケンス図。](/assets/images/help/copilot/copilot-sdk/setup-azure-managed-identity-diagram-0.png)

## Pythonの例

### Prerequisites

```bash
pip install github-copilot-sdk azure-identity
```

### 基本的な使用方法

```python
import asyncio
import os

from azure.identity import DefaultAzureCredential
from copilot import CopilotClient
from copilot.session import PermissionHandler, ProviderConfig

COGNITIVE_SERVICES_SCOPE = "https://cognitiveservices.azure.com/.default"

async def main():
    # Get a token using Managed Identity, Azure CLI, or other credential chain
    credential = DefaultAzureCredential()
    token = credential.get_token(COGNITIVE_SERVICES_SCOPE).token

    foundry_url = os.environ["AZURE_AI_FOUNDRY_RESOURCE_URL"]

    client = CopilotClient()
    await client.start()

    session = await client.create_session(
        on_permission_request=PermissionHandler.approve_all,
        model="gpt-4.1",
        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())
```

### 実行時間の長いアプリケーションのトークン更新

ベアラー トークンの有効期限が切れます (通常は約 1 時間後)。 サーバーまたは実行時間の長いエージェントの場合は、各セッションを作成する前にトークンを更新します。

```python
from azure.identity import DefaultAzureCredential
from copilot import CopilotClient
from copilot.session import PermissionHandler, ProviderConfig

COGNITIVE_SERVICES_SCOPE = "https://cognitiveservices.azure.com/.default"

class ManagedIdentityCopilotAgent:
    """Copilot agent that refreshes Entra ID tokens for Azure AI Foundry."""

    def __init__(self, foundry_url: str, model: str = "gpt-4.1"):
        self.foundry_url = foundry_url.rstrip("/")
        self.model = model
        self.credential = DefaultAzureCredential()
        self.client = CopilotClient()

    def _get_provider_config(self) -> ProviderConfig:
        """Build a ProviderConfig with a fresh bearer token."""
        token = self.credential.get_token(COGNITIVE_SERVICES_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 ""
```

## Node.js/ TypeScript の例

<!-- docs-validate: skip -->

```typescript
import { DefaultAzureCredential } from "@azure/identity";
import { CopilotClient } from "@github/copilot-sdk";

const credential = new DefaultAzureCredential();
const tokenResponse = await credential.getToken(
  "https://cognitiveservices.azure.com/.default"
);

const client = new CopilotClient();

const session = await client.createSession({
  model: "gpt-4.1",
  provider: {
    type: "openai",
    baseUrl: `${process.env.AZURE_AI_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();
```

## .NET の例

<!-- docs-validate: skip -->

```csharp
using Azure.Identity;
using GitHub.Copilot;

var credential = new DefaultAzureCredential();
var token = await credential.GetTokenAsync(
    new Azure.Core.TokenRequestContext(
        new[] { "https://cognitiveservices.azure.com/.default" }));

await using var client = new CopilotClient();
var foundryUrl = Environment.GetEnvironmentVariable("AZURE_AI_FOUNDRY_RESOURCE_URL");

await using var session = await client.CreateSessionAsync(new SessionConfig
{
    Model = "gpt-4.1",
    Provider = new ProviderConfig
    {
        Type = "openai",
        BaseUrl = $"{foundryUrl!.TrimEnd('/')}/openai/v1/",
        BearerToken = token.Token,
        WireApi = "responses",
    },
});

var response = await session.SendAndWaitAsync(
    new MessageOptions { Prompt = "Hello from Managed Identity!" });
Console.WriteLine(response?.Data.Content);
```

## 環境構成

| 変数                              | Description                | Example                               |
| ------------------------------- | -------------------------- | ------------------------------------- |
| `AZURE_AI_FOUNDRY_RESOURCE_URL` | Azure AI Foundry リソースの URL | `https://myresource.openai.azure.com` |

API キー環境変数は必要ありません。認証は `DefaultAzureCredential`によって処理され、自動的にサポートされます。

* **管理 ID** (システム割り当てまたはユーザー割り当て): Azureホストされているアプリの場合
* **Azure CLI** (`az login`): ローカル開発用
* **環境変数**（`AZURE_CLIENT_ID`、`AZURE_TENANT_ID`、`AZURE_CLIENT_SECRET`）: サービス プリンシパル用
* **ワークロード アイデンティティ**: Kubernetes 向け

完全な資格情報チェーンについては、 [DefaultAzureCredential のドキュメント](https://learn.microsoft.com/python/api/azure-identity/azure.identity.defaultazurecredential) を参照してください。

## このパターンを使用する場合

| シナリオ                                                                  | レコメンデーション |
| --------------------------------------------------------------------- | --------- |
| マネージド ID を使用した Azure でホストされるアプリ                                       |           |
| ✅ このパターンを使用する                                                         |           |
| 既存の Azure AD サービス プリンシパルを持つアプリ                                        |           |
| ✅ このパターンを使用する                                                         |           |
| `az login` を使用したローカル開発                                                |           |
| ✅ このパターンを使用する                                                         |           |
| 静的 API キーを使用する Azure 以外の環境                                            |           |
| [AUTOTITLE を](/ja/copilot/how-tos/copilot-sdk/auth/byok)使用する          |           |
| 利用可能なGitHub Copilot サブスクリプション                                         |           |
| [AUTOTITLE を](/ja/copilot/how-tos/copilot-sdk/setup/github-oauth)使用する |           |

## こちらも参照ください

* [BYOK (独自のキーを持ち込む)](/ja/copilot/how-tos/copilot-sdk/auth/byok): 静的 API キーの構成
* [バックエンド サービスのセットアップ](/ja/copilot/how-tos/copilot-sdk/setup/backend-services): サーバー側の展開
* [Azure ID のドキュメント](https://learn.microsoft.com/python/api/overview/azure/identity-readme)