Integración de login de plataformas

Cliente del juego, validación en el Game Panel y configuración en Edit Game → Platform Configurations

Base URL API: https://gamepanel.idcgames.com/api/v1 — Endpoint: POST /auth/third-party/login

Login de plataformas: IDC Games, Steam y Epic



Guía para integradores: qué hace el cliente del juego con cada plataforma, qué envía al Game Panel, y qué debe configurar un admin en Edit Game → Platform Configurations.

---

Flujo general



Juego → Plataforma (login nativo) → user_id + token
Juego → POST /api/v1/auth/third-party/login → Panel valida con IDC/Steam/Epic
Panel → access_token + refresh_token (sesión del Game Panel)


El panel no sustituye el login de la plataforma: el juego obtiene credenciales en IDC/Steam/Epic y el panel solo valida y crea o enlaza un game_user.

---

Endpoint común del Game Panel



URLPOST https://gamepanel.idcgames.com/api/v1/auth/third-party/login
Content-Typeapplication/json
Auth previaNinguna (usa gamepanel_secret_token en el body)

Campos comunes del JSON



CampoObligatorioDescripción
platformSíidc, steam o epic
tokenSíToken que valida la plataforma (ver tabla por plataforma)
user_idSíID de cuenta en esa plataforma (string)
game_idSíID del juego en el Game Panel
gamepanel_secret_tokenSíSecreto del juego en el panel (Edit Game). No es el Client Secret de Epic ni la Steam Web API Key
usernameNoNombre mostrado; fallback si no hay perfil remoto
profileNoObjeto libre que se guarda en el perfil del jugador
detailsNonone, basic o extended (respuesta enriquecida)

Respuesta exitosa (resumen)



  • success: true

  • access_token / refresh_token — sesión OAuth del panel para el resto de APIs (Authorization: Bearer …)

  • user — id, username, platform, platform_user_id, game_id, progreso, etc.


  • Errores frecuentes HTTP



    CódigoCausa habitual
    401 Authentication failedToken de plataforma inválido o plataforma mal configurada
    401 Invalid GamePanel secret tokengamepanel_secret_token incorrecto
    403Plataforma no Enabled en el juego
    422JSON incompleto o platform inválido

    ---

    Secreto del juego (gamepanel_secret_token)



  • Se genera/gestiona en Games → Edit Game (campo secreto del panel).

  • Lo embebe el cliente del juego (binario/build) o un backend de confianza; no debe ir en repositorios públicos.

  • Sirve para el login inicial y otras APIs server-to-server del mismo juego (stats batch, compras externas, etc.) según configuración del proyecto.


  • > Roadmap posible: token público solo para login y token secreto para S2S. Hoy el login usa gamepanel_secret_token.

    ---

    IDC Games



    1. Cliente del juego (IDC)



    El jugador inicia sesión en auth.idcgames.com (web, widget o launcher). El juego no envía usuario/contraseña al Game Panel.

    Tipos de token



    OrigenToken en tokenValidación en auth.idcgames.com
    Launcher / IDCLibtokenUserGameId (MD5, ~1 min)GET /api/launcher/check-user-game-token?userId=&gameId=&tokenUserGameId=
    Web / legacyJWT o token empaquetadoPOST /api/web/verify-token + cabecera X-Internal-Key

  • user_id en el login del panel = useridc (ID numérico IDC del jugador).

  • gameId en el check de launcher = id_game de IDC, no el game_id del panel.


  • Recomendación



    En cada login, enviar también el ID de juego IDC:

  • idc_game_id o alias platform_game_id


  • Si en el panel tienes IDC → app_id fijo, debe coincidir con el que mandas en la petición.

    2. Login contra el Game Panel (IDC)



    {
    "platform": "idc",
    "token": "",
    "user_id": "37264",
    "game_id": 1,
    "gamepanel_secret_token": "gp_…",
    "idc_game_id": 1599,
    "username": "PlayerName",
    "details": "extended"
    }


    El panel intenta primero el check de launcher (si hay app_id IDC configurado) y luego verify-token.

    3. Configuración en el panel



    Edit Game → Platform Configurations → IDC

    CampoUso
    EnabledActivar login IDC
    app_idid_game en auth.idcgames.com (launcher check)
    secret_keyINTERNAL_API_KEY por juego (fallback web verify-token)

    .env del Game Panel (global, no por juego):

    IDC_AUTH_BASE_URL=https://auth.idcgames.com
    IDC_INTERNAL_API_KEY=


    Local opcional: IDC_GAME_ID, IDC_GAME_SECRET, IDC_PANEL_GAME_ID + php artisan idc:sync-local-game-config.

    Documentación adicional: docs/IDC_AUTH_VERIFICATION.md.

    ---

    Steam



    1. Cliente del juego (Steam)



  • 1. Steamworks inicia sesión y obtienes el Steam ID (64 bits) del jugador.

  • 2. Genera un session ticket para tu App ID, p. ej. ISteamUser::GetAuthTicketForWebApi con identidad coherente con el panel (por defecto el panel usa gamepanel si no configuras otra).


  • El ticket puede llegar en hex o base64; el panel normaliza a hex antes de llamar a Steam.

    2. Login contra el Game Panel (Steam)



    {
    "platform": "steam",
    "token": "",
    "user_id": "76561198000000000",
    "game_id": 1,
    "gamepanel_secret_token": "gp_…",
    "username": "SteamPlayer",
    "steam_app_id": 1525710,
    "steam_identity": "gamepanel",
    "details": "extended"
    }


    Campo extraDescripción
    steam_app_id / app_idApp ID Steam; si el juego lo envía y el panel tiene otro en config, rechaza (anti-spoof)
    steam_identityDebe coincidir con el usado al generar el ticket (GetAuthTicketForWebApi)

    Validación panel: ISteamUserAuth/AuthenticateUserTicket/v1/ con Web API Key + App ID + ticket; comprueba steamid = user_id.

    Opcional: GetPlayerSummaries para nombre; si falla, usa username del request.

    3. Configuración en el panel



    Edit Game → Platform Configurations → Steam

    CampoUso
    EnabledActivar login Steam
    app_idSteam App ID del juego
    secret_keySteam Web API Key (Partner)
    webapi_identityIdentidad del ticket (default interno: gamepanel)

    Errores Steam habituales:

  • Ticket for other app (102) — App ID del ticket ≠ App ID configurado.

  • Invalid ticket encoding — ticket corrupto o mal codificado.


  • Script de prueba local: php scripts/test-steam-ticket.php (si existe en el despliegue).

    ---

    Epic Games (EOS)



    1. Cliente del juego (Epic)



    Usa Epic Online Services (EOS) Auth. Para backend, Epic recomienda enviar el Id Token del jugador:

  • Unreal/C++: EOS_Auth_CopyIdToken

  • El JWT lleva en el payload "t": "id_token" (también se acepta access token "t": "epic_id").


  • Del token o de EOS obtén:

  • Epic Account ID → user_id (claim sub, 32 hex)

  • Id Token JWT completo → token (sin recortar)


  • No uses tokens mock ni JWT con firma rota; Epic responde invalid_token / firma inválida.

    2. Login contra el Game Panel (Epic)



    {
    "platform": "epic",
    "token": "",
    "user_id": "612ac3aa1cfb4ad3923ce6e239b4cd61",
    "game_id": 1,
    "gamepanel_secret_token": "gp_…",
    "username": "Ewi1992",
    "details": "extended"
    }


    Validación en el panel (doc oficial Auth Web APIs v2):

  • 1. Offline: firma JWT con https://api.epicgames.dev/epic/oauth/v2/.well-known/jwks.json, aud = Client ID del juego, sub = user_id, issuer https://api.epicgames.dev…

  • 2. Online (fallback): POST https://api.epicgames.dev/epic/oauth/v2/tokenInfo body token=


  • Tipos JWT aceptados: id_token e epic_id.

    Si el perfil remoto falla, el panel usa dn del JWT o username del request.

    3. Configuración en el panel



    Edit Game → Platform Configurations → Epic

    CampoUso
    EnabledActivar login Epic
    client_idClient ID EOS (debe igualar aud del JWT)
    client_secretClient Secret EOS (token servidor / perfil v2; no sustituye la validación JWT del Id Token)
    deployment_idDeployment ID EOS (pfdid en el token). Opcional en verify; recomendado si quieres exigir deployment o usar client_credentials
    api_urlPor defecto https://api.epicgames.dev

    Qué NO hace falta en el JSON del cliente



  • Client Secret de Epic (solo en el panel)

  • Deployment ID (ya va dentro del JWT como pfdid; en panel es opcional para validación extra)


  • Errores Epic habituales



    SíntomaCausa
    401 tras Id Token válido en clienteCódigo antiguo del panel (solo epic_id, o v1/introspect) — desplegar versión actual
    Firma inválida en EpicToken truncado, expirado o no es Id Token real
    client_id_mismatchClient ID del panel ≠ aud del JWT
    deployment_id_mismatchDeployment en panel ≠ pfdid del token (solo si configuraste deployment)

    Prueba local: php scripts/test-epic-login-once.php "" .

    ---

    Configuración resumida en el panel



  • 1. Games → Edit Game — anota game_id y gamepanel_secret_token.

  • 2. Platform Configurations — activa IDC / Steam / Epic y rellena credenciales de la tabla de cada sección.

  • 3. Guarda y prueba con Postman o scripts antes de integrar en el build del juego.


  • ---

    Checklist del desarrollador



  • [ ] game_id y gamepanel_secret_token correctos en el build

  • [ ] Plataforma Enabled en el juego del panel

  • [ ] IDC: idc_game_id alineado con app_id IDC en panel

  • [ ] Steam: mismo App ID y steam_identity al generar el ticket

  • [ ] Epic: EOS_Auth_CopyIdToken → JWT completo en token, Account ID en user_id

  • [ ] Tras login, usar access_token del panel en el resto de APIs


  • ---

    Referencias



  • Epic Auth Web APIs: https://dev.epicgames.com/docs/web-api-ref/authentication

  • Steam AuthenticateUserTicket: https://partner.steamgames.com/doc/webapi/ISteamUserAuth

  • API general del panel: Developer → API Documentation (API_COMPLETE_REFERENCE_EN.md)