Skip to main content
Select language: current language is Russian
Поиск или запрос Copilot
Открыть меню

Использование GitHub OAuth с Copilot SDK

Позвольте пользователям аутентифицироваться через свои GitHub аккаунты для использования GitHub Copilot через ваше приложение.

Кто может использовать эту функцию?

GitHub Copilot SDK Доступна со всеми Copilot тарифными планами.

Примечание.

          Второй пилот SDK в настоящее время находится в Technical Preview. Функциональность и доступность могут меняться.

«Подключайте пользователей, GitHub Copilot предоставляя GitHub аутентификацию аккаунта непосредственно в вашем приложении.

          **Лучше всего для:** Многопользовательские приложения, внутренние инструменты с управлением доступом организации, SaaS-продукты и приложения, где у пользователей уже есть GitHub учетные записи.

Принцип работы

Вы создаёте GitHub приложение OAuth (или GitHub App), пользователи его авторизуют, и вы передаёте их токен доступа SDK. Copilot Запросы делаются от имени каждого аутентифицированного пользователя с использованием его Copilot подписки. Для подробных диаграмм последовательностей этого потока и архитектуры см. репозиторийgithub/copilot-sdk.

          **Ключевые характеристики:**
  • Каждый пользователь проходит аутентификацию через свой аккаунт 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. Запишите свой клиентский идентификатор и сгенерируйте секрет клиента.

Примечание.

И GitHub Apps то, и приложения OAuth работают с 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!"})

Вперед

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 каждого пользователя. |

Дальнейшие действия

Morty Proxy This is a proxified and sanitized view of the page, visit original site.