{"meta":{"title":"Configuración de OAuth de GitHub","intro":"Permitir que los usuarios se autentiquen con sus cuentas de GitHub para usar Copilot a través de la aplicación. Esto admite cuentas individuales, pertenencias a la organización e identidades empresariales.","product":"GitHub Copilot","breadcrumbs":[{"href":"/es/copilot","title":"GitHub Copilot"},{"href":"/es/copilot/how-tos","title":"Procedimientos"},{"href":"/es/copilot/how-tos/copilot-sdk","title":"SDK de Copilot"},{"href":"/es/copilot/how-tos/copilot-sdk/setup","title":"Configuración del SDK de Copilot"},{"href":"/es/copilot/how-tos/copilot-sdk/setup/github-oauth","title":"OAuth de GitHub"}],"documentType":"article"},"body":"# Configuración de OAuth de GitHub\n\nPermitir que los usuarios se autentiquen con sus cuentas de GitHub para usar Copilot a través de la aplicación. Esto admite cuentas individuales, pertenencias a la organización e identidades empresariales.\n\n<!-- markdownlint-disable GHD046 GHD005 -->\n\n<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->\n\n**Best for:** aplicaciones multiusuario, herramientas internas con control de acceso de la organización, productos SaaS, aplicaciones donde los usuarios tienen cuentas de GitHub.\n\n## Cómo funciona\n\nCreas una aplicación OAuth de GitHub (o una GitHub App), los usuarios la autorizan y pasas su token de acceso al SDK. Las solicitudes de Copilot se realizan en nombre de cada usuario autenticado, usando su suscripción de Copilot.\n\n![Diagrama: diagrama de secuencia que muestra el proceso descrito.](/assets/images/help/copilot/copilot-sdk/setup-github-oauth-diagram-0.png)\n\n**Características principales:**\n\n* Cada usuario se autentica con su propia cuenta de GitHub\n* El uso de Copilot se factura a la suscripción de cada usuario.\n* Admite organizaciones de GitHub y cuentas Enterprise\n* La aplicación nunca controla las claves de API del modelo, GitHub administra todo\n\n## Architecture\n\n![Diagrama: Diagrama de flujo que muestra el proceso descrito.](/assets/images/help/copilot/copilot-sdk/setup-github-oauth-diagram-1.png)\n\n## Paso 1: crear una aplicación de GitHub OAuth\n\n1. Vaya a **GitHub Configuración → Configuración del desarrollador → Aplicaciones de OAuth → Nueva aplicación de OAuth** (o para organizaciones: **Configuración de organización → Configuración del desarrollador**)\n\n2. Rellene:\n   * **Nombre de la aplicación**: nombre de la aplicación\n   * **Dirección URL de la página principal**: dirección URL de la aplicación\n   * **URL de devolución de llamada de autorización**: su punto de conexión de devolución de llamada de OAuth (p. ej., `https://yourapp.com/auth/callback`)\n\n3. Anote el **identificador de cliente** y genere un **secreto de cliente**.\n\n> **GitHub App vs OAuth App:** Ambos funcionan. GitHub Apps ofrecen permisos más específicos y se recomiendan para los nuevos proyectos. Las aplicaciones de OAuth son más sencillas de configurar. El flujo de tokens es el mismo desde la perspectiva del SDK.\n\n## Paso 2: implementar el flujo de OAuth\n\nLa aplicación controla el flujo estándar de GitHub OAuth. Este es el intercambio de tokens del lado servidor:\n\n```typescript\n// Server-side: Exchange authorization code for user token\nasync function handleOAuthCallback(code: string): Promise<string> {\n    const response = await fetch(\"https://github.com/login/oauth/access_token\", {\n        method: \"POST\",\n        headers: {\n            \"Content-Type\": \"application/json\",\n            Accept: \"application/json\",\n        },\n        body: JSON.stringify({\n            client_id: process.env.GITHUB_CLIENT_ID,\n            client_secret: process.env.GITHUB_CLIENT_SECRET,\n            code,\n        }),\n    });\n\n    const data = await response.json();\n    return data.access_token; // gho_xxxx or ghu_xxxx\n}\n```\n\n## Paso 3: pasar el token al SDK\n\nCree un cliente del SDK para cada usuario autenticado y pase su 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 } from \"@github/copilot-sdk\";\n\n// Create a client for an authenticated user\nfunction createClientForUser(userToken: string): CopilotClient {\n    return new CopilotClient({\n        gitHubToken: userToken,\n        useLoggedInUser: false,  // Don't fall back to CLI login\n    });\n}\n\n// Usage\nconst client = createClientForUser(\"gho_user_access_token\");\nconst session = await client.createSession({\n    sessionId: `user-${userId}-session`,\n    model: \"gpt-5.4\",\n});\n\nconst response = await session.sendAndWait({ prompt: \"Hello!\" });\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\nfrom copilot import CopilotClient\nfrom copilot.session import PermissionHandler\n\ndef create_client_for_user(user_token: str) -> CopilotClient:\n    return CopilotClient({\n        \"github_token\": user_token,\n        \"use_logged_in_user\": False,\n    })\n\n# Usage\nclient = create_client_for_user(\"gho_user_access_token\")\nawait client.start()\n\nsession = await client.create_session(on_permission_request=PermissionHandler.approve_all, model=\"gpt-5.4\", session_id=f\"user-{user_id}-session\")\n\nresponse = await session.send_and_wait(\"Hello!\")\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\nfunc createClientForUser(userToken string) *copilot.Client {\n    return copilot.NewClient(&copilot.ClientOptions{\n        GitHubToken:     userToken,\n        UseLoggedInUser: copilot.Bool(false),\n    })\n}\n\n// Usage\nclient := createClientForUser(\"gho_user_access_token\")\nclient.Start(ctx)\ndefer client.Stop()\n\nsession, _ := client.CreateSession(ctx, &copilot.SessionConfig{\n    SessionID: fmt.Sprintf(\"user-%s-session\", userID),\n    Model:     \"gpt-5.4\",\n})\nresponse, _ := session.SendAndWait(ctx, copilot.MessageOptions{Prompt: \"Hello!\"})\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\nCopilotClient CreateClientForUser(string userToken) =>\n    new CopilotClient(new CopilotClientOptions\n    {\n        GitHubToken = userToken,\n        UseLoggedInUser = false,\n    });\n\n// Usage\nawait using var client = CreateClientForUser(\"gho_user_access_token\");\nawait using var session = await client.CreateSessionAsync(new SessionConfig\n{\n    SessionId = $\"user-{userId}-session\",\n    Model = \"gpt-5.4\",\n});\n\nvar response = await session.SendAndWaitAsync(\n    new MessageOptions { Prompt = \"Hello!\" });\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<!-- docs-validate: skip -->\n\n```java\nimport com.github.copilot.CopilotClient;\nimport com.github.copilot.rpc.*;\n\nCopilotClient createClientForUser(String userToken) throws Exception {\n    var client = new CopilotClient(new CopilotClientOptions()\n        .setGitHubToken(userToken)\n        .setUseLoggedInUser(false)\n    );\n    client.start().get();\n    return client;\n}\n\n// Usage — use try-with-resources to ensure cleanup\nvar userId = \"user1\";\ntry (var client = createClientForUser(\"gho_user_access_token\")) {\n    var session = client.createSession(new SessionConfig()\n        .setSessionId(String.format(\"user-%s-session\", userId))\n        .setModel(\"gpt-5.4\")\n        .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)\n    ).get();\n\n    var response = session.sendAndWait(new MessageOptions()\n        .setPrompt(\"Hello!\")).get();\n}\n```\n\n</div>\n\n</div>\n\n## Acceso empresarial y organizacional\n\nGitHub OAuth admite naturalmente escenarios empresariales. Cuando los usuarios se autentican con GitHub, sus pertenencias a la organización y las asociaciones empresariales se unen.\n\n![Diagrama: Diagrama de flujo que muestra el proceso descrito.](/assets/images/help/copilot/copilot-sdk/setup-github-oauth-diagram-2.png)\n\n### Comprobación de la pertenencia a la organización\n\nDespués de OAuth, compruebe que el usuario pertenece a su organización:\n\n```typescript\nasync function verifyOrgMembership(\n    token: string,\n    requiredOrg: string\n): Promise<boolean> {\n    const response = await fetch(\"https://api.github.com/user/orgs\", {\n        headers: { Authorization: `Bearer ${token}` },\n    });\n    const orgs = await response.json();\n    return orgs.some((org: any) => org.login === requiredOrg);\n}\n\n// In your auth flow\nconst token = await handleOAuthCallback(code);\nif (!await verifyOrgMembership(token, \"my-company\")) {\n    throw new Error(\"User is not a member of the required organization\");\n}\nconst client = createClientForUser(token);\n```\n\n### Usuarios administrados por la empresa (EMU)\n\nPara los Enterprise Managed Users de GitHub, el flujo es idéntico: los usuarios de EMU se autentican mediante GitHub OAuth como cualquier otro usuario. GitHub aplica automáticamente sus políticas empresariales (restricciones de IP, inicio de sesión único mediante SAML).\n\n```typescript\n// No special SDK configuration needed for EMU\n// Enterprise policies are enforced server-side by GitHub\nconst client = new CopilotClient({\n    gitHubToken: emuUserToken,  // Works the same as regular tokens\n    useLoggedInUser: false,\n});\n```\n\n## Tipos de token admitidos\n\n| Prefijo de token | Source                                   | ¿Trabajas? |\n| ---------------- | ---------------------------------------- | ---------- |\n| `gho_`           | Token de acceso de usuario de OAuth      | ✅          |\n| `ghu_`           | token de acceso de usuario de GitHub app | ✅          |\n| `github_pat_`    | Token de acceso personal específico      | ✅          |\n| `ghp_`           | Token de acceso personal clásico         |            |\n| ❌ (en desuso)    |                                          |            |\n\n## Ciclo de vida de los tokens\n\n![Diagrama: Diagrama de flujo que muestra el proceso descrito.](/assets/images/help/copilot/copilot-sdk/setup-github-oauth-diagram-3.png)\n\n**Importante:** La aplicación es responsable del almacenamiento de tokens, la actualización y el control de expiración. El SDK usa el token que proporcione: no administra el ciclo de vida de OAuth.\n\n### Patrón de actualización de tokens\n\n```typescript\nasync function getOrRefreshToken(userId: string): Promise<string> {\n    const stored = await tokenStore.get(userId);\n\n    if (stored && !isExpired(stored)) {\n        return stored.accessToken;\n    }\n\n    if (stored?.refreshToken) {\n        const refreshed = await refreshGitHubToken(stored.refreshToken);\n        await tokenStore.set(userId, refreshed);\n        return refreshed.accessToken;\n    }\n\n    throw new Error(\"User must re-authenticate\");\n}\n```\n\n## Patrones multiusuario\n\n### Un cliente por usuario (recomendado)\n\nCada usuario obtiene su propio cliente del SDK con su propio token. Esto proporciona el aislamiento más fuerte.\n\n```typescript\nconst clients = new Map<string, CopilotClient>();\n\nfunction getClientForUser(userId: string, token: string): CopilotClient {\n    if (!clients.has(userId)) {\n        clients.set(userId, new CopilotClient({\n            gitHubToken: token,\n            useLoggedInUser: false,\n        }));\n    }\n    return clients.get(userId)!;\n}\n```\n\n### CLI compartida con tokens por solicitud\n\nPara un menor consumo de recursos, puede ejecutar un único servidor CLI externo y pasar tokens en cada sesión. Consulte [Configuración de servicios back-end](/es/copilot/how-tos/copilot-sdk/setup/backend-services) para obtener este patrón.\n\n## Limitaciones\n\n| Limitación                                            | Detalles                                                     |\n| ----------------------------------------------------- | ------------------------------------------------------------ |\n| **Se requiere una suscripción a Copilot**             | Cada usuario necesita una suscripción de Copilot activa      |\n| **La administración de tokens es su responsabilidad** | Almacenar, actualizar y controlar la expiración              |\n| **GitHub cuenta necesaria**                           | Los usuarios deben tener cuentas de GitHub                   |\n| **Límites de velocidad por usuario**                  | Sujeto a los límites de velocidad de Copilot de cada usuario |\n\n## Cuándo seguir adelante\n\n| Requisito                                                                                     | Guía siguiente |\n| --------------------------------------------------------------------------------------------- | -------------- |\n| Usuarios sin cuentas de GitHub                                                                |                |\n| [BYOK (traiga su propia clave)](/es/copilot/how-tos/copilot-sdk/auth/byok)                    |                |\n| Ejecución del SDK en servidores                                                               |                |\n| [Configuración de servicios back-end](/es/copilot/how-tos/copilot-sdk/setup/backend-services) |                |\n| Control de muchos usuarios simultáneos                                                        |                |\n| [Escalabilidad y multitenencia](/es/copilot/how-tos/copilot-sdk/setup/scaling)                |                |\n\n## Pasos siguientes\n\n* **[Autenticación](/es/copilot/how-tos/copilot-sdk/auth/authenticate)**: Referencia completa del método de autenticación\n* **[Configuración de servicios back-end](/es/copilot/how-tos/copilot-sdk/setup/backend-services)**: Ejecutar el SDK en el servidor\n* **[Escalabilidad y multitenencia](/es/copilot/how-tos/copilot-sdk/setup/scaling)**: Gestiona muchos usuarios a gran escala"}