Skip to main content

Copilot SDK での GitHub OAuth の使用

ユーザーが自分の GitHub アカウントで認証を行い、アプリケーションで GitHub Copilot を使用できるようにします。

この機能を使用できるユーザーについて

GitHub Copilot SDK は、すべての Copilot プランで使用できます。

メモ

          Copilot SDK は現在 テクニカル プレビューです。 機能と可用性は変更される場合があります。

"GitHub Copilot アカウント認証をアプリケーション内で直接提供することで、ユーザーをGitHubに接続します。

          **次の場合に最適です。** マルチユーザー アプリ、組織のアクセス制御を備えた内部ツール、SaaS 製品、ユーザーが既に GitHub アカウントを持っているアプリ。

どのように機能するのか

          GitHub OAuth アプリ (またはGitHub App) を作成し、ユーザーがそれを承認し、アクセス トークンを SDK に渡します。 
          Copilot 要求は、 Copilot サブスクリプションを使用して、認証された各ユーザーに代わって行われます。 このフローとアーキテクチャの詳細なシーケンス図については、 `github/copilot-sdk`[repository](https://github.com/github/copilot-sdk/blob/main/docs/setup/github-oauth.md#how-it-works) を参照してください。

          **主な特性:**
  • 各ユーザーは、独自の GitHub アカウントで認証を行います。
  •         Copilot 使用状況は、各ユーザーのサブスクリプションに課金されます。
    
  •         GitHub組織とエンタープライズ アカウントをサポートします。
    
  • アプリがモデル API キーを処理することはありません。GitHub はすべてを管理します。

手順 1: GitHub OAuth アプリを作成する

  1.        **[GitHub設定] > [開発者向け設定] > [OAuth アプリ] > [新しい OAuth アプリ**] に移動します。 組織の場合は、[ **組織の設定] > [開発者向け設定]** に移動します。
    
  2. 以下の項目に入力してください。 * アプリケーション名: アプリの名前。 * ホーム ページ URL: アプリの URL。 * 承認コールバック URL: OAuth コールバック エンドポイント ( https://YOUR-APP.com/auth/callback など)。 YOUR-APP.comをあなたのドメインに置き換えてください。
  3.        **クライアント ID を**メモし、**クライアント シークレット**を生成します。
    

メモ

          GitHub Appsと OAuth Apps の両方が SDK で動作します。 
          GitHub Apps は、よりきめ細かいアクセス許可を提供し、新しいプロジェクトに推奨されます。 OAuth アプリの設定は簡単です。 トークン フローは、SDK の観点から見ると同じです。

手順 2: OAuth フローを実装する

アプリケーションは、標準の GitHub OAuth フローを処理します。 サーバー側のトークン交換を次に示します。

// Server-side: exchange authorization code for user token
async function handleOAuthCallback(code: string): Promise<string> {
    const response = await fetch("https://github.com/login/oauth/access_token", {
        method: "POST",
        headers: {
            "Content-Type": "application/json",
            Accept: "application/json",
        },
        body: JSON.stringify({
            client_id: process.env.GITHUB_CLIENT_ID,
            client_secret: process.env.GITHUB_CLIENT_SECRET,
            code,
        }),
    });

    const data = await response.json();
    return data.access_token; // gho_xxxx or ghu_xxxx
}

手順 3: トークンを SDK に渡す

認証されたユーザーごとに SDK クライアントを作成し、トークンを渡します。

Node.js/ TypeScript

import { CopilotClient } from "@github/copilot-sdk";

// Create a client for an authenticated user
function createClientForUser(userToken: string): CopilotClient {
    return new CopilotClient({
        githubToken: userToken,
        useLoggedInUser: false,  // Don't fall back to CLI sign-in
    });
}

// Usage
const client = createClientForUser("USER-ACCESS-TOKEN");
const session = await client.createSession({
    sessionId: `user-${userId}-session`,
    model: "gpt-4.1",
});

const response = await session.sendAndWait({ prompt: "Hello!" });
          `USER-ACCESS-TOKEN`をユーザーの OAuth アクセス トークン (`gho_xxxx` など) に置き換えます。

Python

from copilot import CopilotClient, PermissionHandler

def create_client_for_user(user_token: str) -> CopilotClient:
    return CopilotClient({
        "github_token": user_token,
        "use_logged_in_user": False,
    })

# Usage
client = create_client_for_user("USER-ACCESS-TOKEN")
await client.start()

session = await client.create_session(
    on_permission_request=PermissionHandler.approve_all,
    model="gpt-4.1",
    session_id=f"user-{user_id}-session",
)

response = await session.send_and_wait({"prompt": "Hello!"})

Go

func createClientForUser(userToken string) *copilot.Client {
    return copilot.NewClient(&copilot.ClientOptions{
        GithubToken:     userToken,
        UseLoggedInUser: copilot.Bool(false),
    })
}

// Usage
client := createClientForUser("USER-ACCESS-TOKEN")
client.Start(ctx)
defer client.Stop()

session, _ := client.CreateSession(ctx, &copilot.SessionConfig{
    SessionID: fmt.Sprintf("user-%s-session", userID),
    Model:     "gpt-4.1",
})
response, _ := session.SendAndWait(ctx, copilot.MessageOptions{Prompt: "Hello!"})

.NET

CopilotClient CreateClientForUser(string userToken) =>
    new CopilotClient(new CopilotClientOptions
    {
        GithubToken = userToken,
        UseLoggedInUser = false,
    });

// Usage
await using var client = CreateClientForUser("USER-ACCESS-TOKEN");
await using var session = await client.CreateSessionAsync(new SessionConfig
{
    SessionId = $"user-{userId}-session",
    Model = "gpt-4.1",
});

var response = await session.SendAndWaitAsync(
    new MessageOptions { Prompt = "Hello!" });

エンタープライズおよび組織のアクセス

          GitHub OAuth は、エンタープライズ シナリオを自然にサポートします。 ユーザーが GitHubで認証を行うと、組織のメンバーシップと企業の関連付けが含まれます。

組織のメンバーシップを確認する

OAuth の後、ユーザーが組織に属していることを確認できます。

async function verifyOrgMembership(
    token: string,
    requiredOrg: string
): Promise<boolean> {
    const response = await fetch("https://api.github.com/user/orgs", {
        headers: { Authorization: `Bearer ${token}` },
    });
    const orgs = await response.json();
    return orgs.some((org: any) => org.login === requiredOrg);
}

// In your auth flow
const token = await handleOAuthCallback(code);
if (!await verifyOrgMembership(token, "YOUR-ORG")) {
    throw new Error("User is not a member of the required organization");
}
const client = createClientForUser(token);
          `YOUR-ORG`をGitHubの組織名に置き換えます。

エンタープライズ マネージド ユーザー (EMU)

          マネージド ユーザー アカウントの場合、フローは同じです。 EMU ユーザーは他のユーザーと同様に GitHub OAuth を使用して認証を行い、エンタープライズ ポリシー (IP 制限、SAML SSO) は GitHub によって自動的に適用されます。
// No special SDK configuration needed for EMU
const client = new CopilotClient({
    githubToken: emuUserToken,
    useLoggedInUser: false,
});

サポートされているトークンの種類

トークン プレフィックス情報源サポートされている
gho_OAuth ユーザー アクセス トークンはい
ghu_
          GitHub App ユーザー アクセス トークン | はい |

| github_pat_ | Fine-grained personal access token | はい | | ghp_ | Personal access token (classic) | いいえ (終了) |

トークンライフサイクル管理

アプリケーションは、トークンのストレージ、更新、および有効期限の処理を担当します。 SDK では、指定したトークンが使用されます。OAuth ライフサイクルは管理されません。

トークン更新パターン

async function getOrRefreshToken(userId: string): Promise<string> {
    const stored = await tokenStore.get(userId);

    if (stored && !isExpired(stored)) {
        return stored.accessToken;
    }

    if (stored?.refreshToken) {
        const refreshed = await refreshGitHubToken(stored.refreshToken);
        await tokenStore.set(userId, refreshed);
        return refreshed.accessToken;
    }

    throw new Error("User must re-authenticate");
}

マルチユーザー パターン

各ユーザーは、独自のトークンを使用して独自の SDK クライアントを取得します。 これにより、最も強力な分離が提供されます。

const clients = new Map<string, CopilotClient>();

function getClientForUser(userId: string, token: string): CopilotClient {
    if (!clients.has(userId)) {
        clients.set(userId, new CopilotClient({
            githubToken: token,
            useLoggedInUser: false,
        }));
    }
    return clients.get(userId)!;
}

制限事項

制限事項詳細情報
          **
          Copilot サブスクリプションが必要** | 各ユーザーには、アクティブな GitHub Copilot サブスクリプションが必要です。 |

| トークン管理はユーザーの責任です | トークンの有効期限を格納、更新、および処理する必要があります。 | | ** GitHub アカウントが必要** | ユーザーは GitHub アカウントを持っている必要があります。 | | ユーザーあたりのレート制限 | 使用には、各ユーザーの Copilot レート制限が適用されます。 |

次のステップ