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:
| Claim | Valor |
|---|---|
iss | https://gamealia-api.tinchogon34.workers.dev |
aud | el id de tu juego (el gameId de init(), también figura en el portal de desarrolladores) |
sub | el id del jugador en tu juego, igual a user.id |
username, avatarUrl | el perfil público del jugador |
gameId | el id de tu juego |
iat, exp | emisió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.