{"meta":{"title":"サーバー間認証","intro":"サービスがユーザーの資格情報なしで組織に代わってCopilot要求を行う必要がある場合は、有効期間の短いインストール アクセス トークンを使用します。 GitHub Actionsでは、代わりに組み込みのGITHUB_TOKENを使用します。","product":"GitHub Copilot","breadcrumbs":[{"href":"/ja/copilot","title":"GitHub Copilot"},{"href":"/ja/copilot/how-tos","title":"方法"},{"href":"/ja/copilot/how-tos/copilot-sdk","title":"Copilot SDK"},{"href":"/ja/copilot/how-tos/copilot-sdk/auth","title":"認証"},{"href":"/ja/copilot/how-tos/copilot-sdk/auth/server-to-server-tokens","title":"サーバー間トークン"}],"documentType":"article"},"body":"# サーバー間認証\n\nサービスがユーザーの資格情報なしで組織に代わってCopilot要求を行う必要がある場合は、有効期間の短いインストール アクセス トークンを使用します。 GitHub Actionsでは、代わりに組み込みのGITHUB_TOKENを使用します。\n\n<!-- markdownlint-disable GHD046 GHD005 -->\n\n<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->\n\n## GitHub Actions\n\n組織所有のリポジトリ内のワークフローの場合は、Copilot要求を行うアクセス許可を組み込みのトークンに付与します。\n\n```yaml\npermissions:\n  contents: read\n  copilot-requests: write\n\njobs:\n  copilot:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - run: your-application\n        env:\n          GITHUB_TOKEN: $\n```\n\n組織のポリシーに**対して課金される Copilot CLI の使用を許可する**必要があります。 この方法では、GitHubアプリや保存された認証シークレットは必要ありません。 詳細については、「[GitHub Actions で GITHUB\\_TOKEN を使って Copilot CLI を使用する](/ja/copilot/how-tos/copilot-cli/use-copilot-cli-in-actions)」を参照してください。\n\n## その他のサービスと CI システム\n\nGitHub Actions外のサービスの場合:\n\n1. Copilot要求リポジトリのアクセス許可が**読み取りと書き込みに**設定**されたGitHub** アプリを作成します。\n\n2. 課金対象の組織にインストールします。 現在のCopilotアクセス許可チェックでは **、すべてのリポジトリアクセスが必要です**。\n\n3. リポジトリ ID とCopilotアクセス許可を持つ [GitHub アプリのインストール アクセス トークンの生成](/ja/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app):\n\n   ```json\n   {\n     \"repository_ids\": [123456789],\n     \"permissions\": {\n       \"copilot_requests\": \"write\"\n     }\n   }\n   ```\n\n4. 結果の `ghs_` トークンを `COPILOT_GITHUB_TOKEN`としてランタイムに渡します。\n\n組織は、GitHub アプリのインストールからのCopilot要求に対して有効にする必要があります。 インストール トークンは 1 時間後に期限切れになります。\n\n> \\[!WARNING]\n> SDK の `gitHubToken`、 `github_token`、または同等のオプションを介してインストール トークンを渡さないでください。 このオプションは、ユーザー トークン用です。 インストール トークンでは、ランタイム環境の認証パスを使用する必要があります。\n\n## ランタイムを構成する\n\n次の例では、作成されたトークンが `INSTALLATION_TOKEN`内にあるものとします。 子ランタイムにのみ渡し、保存されているユーザー資格情報へのフォールバックを無効にします。\n\n<div class=\"ghd-codetabs\">\n<div class=\"ghd-codetab\" data-lang=\"typescript\" data-label=\"TypeScript\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">TypeScript</div>\n\n```typescript\nimport { CopilotClient, RuntimeConnection } from \"@github/copilot-sdk\";\n\nconst token = process.env.INSTALLATION_TOKEN;\nif (!token) throw new Error(\"INSTALLATION_TOKEN is required\");\n\nconst client = new CopilotClient({\n    connection: RuntimeConnection.forStdio(),\n    env: {\n        ...process.env,\n        COPILOT_GITHUB_TOKEN: token,\n    },\n    useLoggedInUser: false,\n});\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"python\" data-label=\"Python\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Python</div>\n\n```python\nimport os\n\nfrom copilot import CopilotClient, RuntimeConnection\n\nclient = CopilotClient(\n    connection=RuntimeConnection.for_stdio(),\n    env={**os.environ, \"COPILOT_GITHUB_TOKEN\": os.environ[\"INSTALLATION_TOKEN\"]},\n    use_logged_in_user=False,\n)\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"go\" data-label=\"Go\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Go</div>\n\n```golang\npackage main\n\nimport (\n    \"log\"\n    \"os\"\n\n    copilot \"github.com/github/copilot-sdk/go\"\n)\n\nfunc main() {\n    token, ok := os.LookupEnv(\"INSTALLATION_TOKEN\")\n    if !ok {\n        log.Fatal(\"INSTALLATION_TOKEN is required\")\n    }\n    client := copilot.NewClient(&copilot.ClientOptions{\n        Connection:      copilot.StdioConnection{},\n        Env:             append(os.Environ(), \"COPILOT_GITHUB_TOKEN=\"+token),\n        UseLoggedInUser: copilot.Bool(false),\n    })\n    _ = client\n}\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"rust\" data-label=\"Rust\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Rust</div>\n\n```rust\nuse github_copilot_sdk::{ClientOptions, Transport};\n\nfn main() {\n    let token = std::env::var(\"INSTALLATION_TOKEN\").expect(\"INSTALLATION_TOKEN is required\");\n    let options = ClientOptions::new()\n        .with_transport(Transport::Stdio)\n        .with_env([(\"COPILOT_GITHUB_TOKEN\", token)])\n        .with_use_logged_in_user(false);\n    drop(options);\n}\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"dotnet\" data-label=\".NET\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">.NET</div>\n\n```csharp\nusing System.Collections;\nusing GitHub.Copilot;\n\nvar token = Environment.GetEnvironmentVariable(\"INSTALLATION_TOKEN\")\n    ?? throw new InvalidOperationException(\"INSTALLATION_TOKEN is required\");\nvar environment = Environment.GetEnvironmentVariables()\n    .Cast<DictionaryEntry>()\n    .ToDictionary(entry => (string)entry.Key, entry => entry.Value?.ToString() ?? \"\");\nenvironment[\"COPILOT_GITHUB_TOKEN\"] = token;\n\nawait using var client = new CopilotClient(new CopilotClientOptions\n{\n    Connection = RuntimeConnection.ForStdio(),\n    Environment = environment,\n    UseLoggedInUser = false,\n});\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"java\" data-label=\"Java\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Java</div>\n\n```java\nimport com.github.copilot.CopilotClient;\nimport com.github.copilot.rpc.CopilotClientOptions;\nimport java.util.HashMap;\nimport java.util.Objects;\n\nvar environment = new HashMap<>(System.getenv());\nvar token = Objects.requireNonNull(\n    System.getenv(\"INSTALLATION_TOKEN\"), \"INSTALLATION_TOKEN is required\");\nenvironment.put(\"COPILOT_GITHUB_TOKEN\", token);\n\ntry (var client = new CopilotClient(new CopilotClientOptions()\n        .setEnvironment(environment)\n        .setUseLoggedInUser(false))) {\n    // Use the client.\n}\n```\n\n</div>\n\n</div>\n\nインプロセス FFIは、ランタイムを読み込む前にホスト環境で `COPILOT_GITHUB_TOKEN` を設定します。クライアントごとの環境オプションはサポートされていません。 既存のランタイム URIは、そのランタイム プロセスに設定します。\n\n## 更新トークン\n\n現在のトークンの有効期限が切れる前に、新しいインストール トークンを作成します。 子プロセスの場合は、新しい環境で SDK クライアントを再起動します。 インプロセスまたは既存のランタイムの場合は、新しいトークンを使用してホスト ランタイムを再起動します。\n\n## Billing\n\n使用状況は、GitHub アプリのインストールを所有するアカウントに属性付けされ、課金されます。 組織のインストールを組織の課金に使用する。ユーザー アカウントのインストール属性は、そのユーザーの使用状況を示します。\n\n## Troubleshooting\n\n| 症状                                                                        | 検査                                                                      |\n| ------------------------------------------------------------------------- | ----------------------------------------------------------------------- |\n| `401 Unauthorized`                                                        | 組織がCopilotのアプリ インストール認証GitHubサポートを確認します。                                |\n| `403 Resource not accessible by integration` または、ユーザー情報のメンション中にエラーが発生しました | SDK の明示的なトークン オプションではなく、インストール トークンが `COPILOT_GITHUB_TOKEN`であることを確認します。 |\n| `403 Forbidden`Copilot API から                                             | トークン要求に `repository_ids` と `copilot_requests: write`が含まれていることを確認します。    |\n| `403 Forbidden` 必要なトークン要求を含む                                              | アプリのインストールに **\\[すべてのリポジトリ]** アクセス権があることを確認し、新しいトークンを作成します。              |\n| 要求されたモデルは使用できません                                                          | 組織のCopilot ポリシーでモデルが許可され、バンドルされたランタイムがモデルをサポートすることを確認します。               |\n| 誤ったアカウントの請求                                                               | インストールが目的の組織に属することを確認します。                                               |\n\n## 詳細については、次を参照してください。\n\n* [認証](/ja/copilot/how-tos/copilot-sdk/auth/authenticate): その他の認証方法と優先順位\n* [GitHub アプリのインストール アクセス トークンの生成](/ja/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app): GitHub アプリ トークンの作成"}