# サーバー間認証

サービスがユーザーの資格情報なしで組織に代わってCopilot要求を行う必要がある場合は、有効期間の短いインストール アクセス トークンを使用します。 GitHub Actionsでは、代わりに組み込みのGITHUB_TOKENを使用します。

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

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

## GitHub Actions

組織所有のリポジトリ内のワークフローの場合は、Copilot要求を行うアクセス許可を組み込みのトークンに付与します。

```yaml
permissions:
  contents: read
  copilot-requests: write

jobs:
  copilot:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - run: your-application
        env:
          GITHUB_TOKEN: $
```

組織のポリシーに**対して課金される Copilot CLI の使用を許可する**必要があります。 この方法では、GitHubアプリや保存された認証シークレットは必要ありません。 詳細については、「[GitHub Actions で GITHUB\_TOKEN を使って Copilot CLI を使用する](/ja/copilot/how-tos/copilot-cli/use-copilot-cli-in-actions)」を参照してください。

## その他のサービスと CI システム

GitHub Actions外のサービスの場合:

1. Copilot要求リポジトリのアクセス許可が**読み取りと書き込みに**設定**されたGitHub** アプリを作成します。

2. 課金対象の組織にインストールします。 現在のCopilotアクセス許可チェックでは **、すべてのリポジトリアクセスが必要です**。

3. リポジトリ ID とCopilotアクセス許可を持つ [GitHub アプリのインストール アクセス トークンの生成](/ja/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app):

   ```json
   {
     "repository_ids": [123456789],
     "permissions": {
       "copilot_requests": "write"
     }
   }
   ```

4. 結果の `ghs_` トークンを `COPILOT_GITHUB_TOKEN`としてランタイムに渡します。

組織は、GitHub アプリのインストールからのCopilot要求に対して有効にする必要があります。 インストール トークンは 1 時間後に期限切れになります。

> \[!WARNING]
> SDK の `gitHubToken`、 `github_token`、または同等のオプションを介してインストール トークンを渡さないでください。 このオプションは、ユーザー トークン用です。 インストール トークンでは、ランタイム環境の認証パスを使用する必要があります。

## ランタイムを構成する

次の例では、作成されたトークンが `INSTALLATION_TOKEN`内にあるものとします。 子ランタイムにのみ渡し、保存されているユーザー資格情報へのフォールバックを無効にします。

<div class="ghd-codetabs">
<div class="ghd-codetab" data-lang="typescript" data-label="TypeScript"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">TypeScript</div>

```typescript
import { CopilotClient, RuntimeConnection } from "@github/copilot-sdk";

const token = process.env.INSTALLATION_TOKEN;
if (!token) throw new Error("INSTALLATION_TOKEN is required");

const client = new CopilotClient({
    connection: RuntimeConnection.forStdio(),
    env: {
        ...process.env,
        COPILOT_GITHUB_TOKEN: token,
    },
    useLoggedInUser: false,
});
```

</div>

<div class="ghd-codetab" data-lang="python" data-label="Python"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Python</div>

```python
import os

from copilot import CopilotClient, RuntimeConnection

client = CopilotClient(
    connection=RuntimeConnection.for_stdio(),
    env={**os.environ, "COPILOT_GITHUB_TOKEN": os.environ["INSTALLATION_TOKEN"]},
    use_logged_in_user=False,
)
```

</div>

<div class="ghd-codetab" data-lang="go" data-label="Go"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Go</div>

```golang
package main

import (
    "log"
    "os"

    copilot "github.com/github/copilot-sdk/go"
)

func main() {
    token, ok := os.LookupEnv("INSTALLATION_TOKEN")
    if !ok {
        log.Fatal("INSTALLATION_TOKEN is required")
    }
    client := copilot.NewClient(&copilot.ClientOptions{
        Connection:      copilot.StdioConnection{},
        Env:             append(os.Environ(), "COPILOT_GITHUB_TOKEN="+token),
        UseLoggedInUser: copilot.Bool(false),
    })
    _ = client
}
```

</div>

<div class="ghd-codetab" data-lang="rust" data-label="Rust"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Rust</div>

```rust
use github_copilot_sdk::{ClientOptions, Transport};

fn main() {
    let token = std::env::var("INSTALLATION_TOKEN").expect("INSTALLATION_TOKEN is required");
    let options = ClientOptions::new()
        .with_transport(Transport::Stdio)
        .with_env([("COPILOT_GITHUB_TOKEN", token)])
        .with_use_logged_in_user(false);
    drop(options);
}
```

</div>

<div class="ghd-codetab" data-lang="dotnet" data-label=".NET"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">.NET</div>

```csharp
using System.Collections;
using GitHub.Copilot;

var token = Environment.GetEnvironmentVariable("INSTALLATION_TOKEN")
    ?? throw new InvalidOperationException("INSTALLATION_TOKEN is required");
var environment = Environment.GetEnvironmentVariables()
    .Cast<DictionaryEntry>()
    .ToDictionary(entry => (string)entry.Key, entry => entry.Value?.ToString() ?? "");
environment["COPILOT_GITHUB_TOKEN"] = token;

await using var client = new CopilotClient(new CopilotClientOptions
{
    Connection = RuntimeConnection.ForStdio(),
    Environment = environment,
    UseLoggedInUser = false,
});
```

</div>

<div class="ghd-codetab" data-lang="java" data-label="Java"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Java</div>

```java
import com.github.copilot.CopilotClient;
import com.github.copilot.rpc.CopilotClientOptions;
import java.util.HashMap;
import java.util.Objects;

var environment = new HashMap<>(System.getenv());
var token = Objects.requireNonNull(
    System.getenv("INSTALLATION_TOKEN"), "INSTALLATION_TOKEN is required");
environment.put("COPILOT_GITHUB_TOKEN", token);

try (var client = new CopilotClient(new CopilotClientOptions()
        .setEnvironment(environment)
        .setUseLoggedInUser(false))) {
    // Use the client.
}
```

</div>

</div>

インプロセス FFIは、ランタイムを読み込む前にホスト環境で `COPILOT_GITHUB_TOKEN` を設定します。クライアントごとの環境オプションはサポートされていません。 既存のランタイム URIは、そのランタイム プロセスに設定します。

## 更新トークン

現在のトークンの有効期限が切れる前に、新しいインストール トークンを作成します。 子プロセスの場合は、新しい環境で SDK クライアントを再起動します。 インプロセスまたは既存のランタイムの場合は、新しいトークンを使用してホスト ランタイムを再起動します。

## Billing

使用状況は、GitHub アプリのインストールを所有するアカウントに属性付けされ、課金されます。 組織のインストールを組織の課金に使用する。ユーザー アカウントのインストール属性は、そのユーザーの使用状況を示します。

## Troubleshooting

| 症状                                                                        | 検査                                                                      |
| ------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| `401 Unauthorized`                                                        | 組織がCopilotのアプリ インストール認証GitHubサポートを確認します。                                |
| `403 Resource not accessible by integration` または、ユーザー情報のメンション中にエラーが発生しました | SDK の明示的なトークン オプションではなく、インストール トークンが `COPILOT_GITHUB_TOKEN`であることを確認します。 |
| `403 Forbidden`Copilot API から                                             | トークン要求に `repository_ids` と `copilot_requests: write`が含まれていることを確認します。    |
| `403 Forbidden` 必要なトークン要求を含む                                              | アプリのインストールに **\[すべてのリポジトリ]** アクセス権があることを確認し、新しいトークンを作成します。              |
| 要求されたモデルは使用できません                                                          | 組織のCopilot ポリシーでモデルが許可され、バンドルされたランタイムがモデルをサポートすることを確認します。               |
| 誤ったアカウントの請求                                                               | インストールが目的の組織に属することを確認します。                                               |

## 詳細については、次を参照してください。

* [認証](/ja/copilot/how-tos/copilot-sdk/auth/authenticate): その他の認証方法と優先順位
* [GitHub アプリのインストール アクセス トークンの生成](/ja/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app): GitHub アプリ トークンの作成