Cuentas de jugador

Los jugadores pueden iniciar sesión en Gamealia con Google. Tu juego puede saludarlos por su nombre, sincronizar sus partidas (mirá Guardado en la nube) y, si tenés tus propios servidores, saber quiénes son sin un login propio.

Reglas

  • Los invitados tienen que poder jugar. Nunca exijas iniciar sesión para jugar.
  • Nada de login propio (Google, Facebook, email, Firebase Auth...). El revisor rechaza los juegos que lo tienen.
  • Llamá a Gamealia.user.requestLogin() solo desde un botón que tocó el jugador, por ejemplo "Iniciá sesión para guardar tu progreso".

En el juego

const { user } = await Gamealia.init();
showName(user ? user.username : "Invitado");

Gamealia.user.onChange((u) => showName(u ? u.username : "Invitado"));

saveButton.onclick = async () => {
  const u = await Gamealia.user.requestLogin(); // null si el jugador cerró el inicio de sesión
  if (u) showName(u.username);
};

user.id es estable para un jugador solo en tu juego: cada juego ve un id distinto para la misma persona.

Tu propio backend: verificá el token

Cuando tu juego habla con tu servidor (rankings, multijugador), mandale un token en lugar de un id de usuario que el cliente podría falsificar:

const token = await Gamealia.user.getToken(); // null para invitados
await fetch("https://api.example.com/session", { method: "POST", headers: { Authorization: `Bearer ${token}` } });

El token es un JWT ES256 válido por 5 minutos. Pedí uno nuevo para cada sesión o pedido en vez de guardarlo. Sus claims:

ClaimValor
isshttps://gamealia-api.tinchogon34.workers.dev
audel id de tu juego (el gameId de init(), también figura en el portal de desarrolladores)
subel id del jugador en tu juego, igual a user.id
username, avatarUrlel perfil público del jugador
gameIdel id de tu juego
iat, expemisión y vencimiento (5 min)

Verificalo con las claves públicas de https://gamealia-api.tinchogon34.workers.dev/.well-known/jwks.json (guardalas en caché; la respuesta permite una hora), y siempre chequeá iss y aud: un token emitido para otro juego no tiene que servir en tu servidor.

Node.js

import { createRemoteJWKSet, jwtVerify } from "jose";

const JWKS = createRemoteJWKSet(new URL("https://gamealia-api.tinchogon34.workers.dev/.well-known/jwks.json"));

export async function gamealiaPlayer(token) {
  const { payload } = await jwtVerify(token, JWKS, {
    issuer: "https://gamealia-api.tinchogon34.workers.dev",
    audience: process.env.GAMEALIA_GAME_ID,
    algorithms: ["ES256"],
  });
  return { id: payload.sub, username: payload.username };
}

Python

import os
import jwt  # pip install "pyjwt[crypto]"

JWKS = jwt.PyJWKClient("https://gamealia-api.tinchogon34.workers.dev/.well-known/jwks.json")

def gamealia_player(token: str) -> dict:
    key = JWKS.get_signing_key_from_jwt(token)
    claims = jwt.decode(
        token,
        key.key,
        algorithms=["ES256"],
        issuer="https://gamealia-api.tinchogon34.workers.dev",
        audience=os.environ["GAMEALIA_GAME_ID"],
    )
    return {"id": claims["sub"], "username": claims["username"]}

Creá o buscá al jugador en tu base de datos por sub e iniciale sesión automáticamente: los jugadores de Gamealia nunca se registran de nuevo en tu juego.

Declarás el host de tu servidor en backendHosts de la ficha (por ejemplo api.example.com o *.example.com, hasta 10): el autotest avisa de pedidos a hosts que no declaraste.

En el mock

user.get() es null y getToken() siempre null. requestLogin() inicia sesión con un "Mock Player" falso para que pruebes el camino con sesión; no hay token de mock, así que probá tu backend con una vista previa real del juego.