Se connecter avec un Casa Estates ID

Comment un jeu ou une app identifie un joueur Casa Tookan grâce à un CEID : un compte par joueur, les adresses qu’il choisit de vous montrer, et des faits pour se défendre contre les comptes multiples.

Aperçu : disponible pour l’instant dans les builds de développement de Casa Tookan uniquement
En une phraseAppelez window.casaTookan.ceid.signIn({ nonce }) : le joueur approuve une fois, vous recevez un token de 24 heures signé par Casa Tookan avec son CEID et son username. Si vous le demandez et qu’il accepte, le token contient aussi les adresses dont vous lisez ensuite vous-même les actifs on-chain.

Le CEID

Un Casa Estates ID est un compte de joueur, public comme un identifiant Farcaster. Un joueur peut ne jamais vous montrer d’adresse : un jeu sans blockchain, ou un jeu qui n’a besoin d’une adresse que des mois plus tard pour une distribution de récompenses, fonctionne de la même façon.

Compte

Numéro + username

  • ceid : 8 chiffres tirés au hasard, qui ne changent jamais et ne sont jamais réutilisés ; le numéro ne révèle rien du nombre de joueurs. Identifiez vos joueurs par lui.
  • username : global et unique, CasaTookanUser#48213907 par défaut, modifiable au plus une fois tous les 30 jours.
  • Vous pouvez afficher votre propre nom en jeu à la place.
Adresses

Facultatives, choisies par app

  • Aucune à la connexion, sauf si vous en demandez.
  • Le joueur choisit quelles casas vous montrer, chaîne par chaîne.
  • Une adresse appartient à un seul CEID à la fois.
Appareil

Un appareil, un CEID

  • Une nouvelle phrase de récupération sur le même téléphone déplace le CEID existant vers cette phrase.
  • Le token indique si l’appareil est attesté et combien de fois le CEID a été déplacé.

Déroulé

  1. Votre serveur génère un nonceAléatoire, à usage unique, de courte durée, lié à la session qui recevra le token.
  2. La page fait la demandesignIn({ nonce }). Casa Tookan affiche une feuille avec votre nom, votre icône et votre domaine. La première fois, il crée le CEID du joueur, sans formulaire à remplir.
  3. Le joueur approuveLa clé du CEID signe autour de votre nonce dans le signataire natif de Casa Tookan. Sa phrase de récupération n’en sort jamais.
  4. Le serveur de Casa Tookan émet le tokenIl vérifie la signature et l’appareil, ajoute les faits et signe un JWT pour votre origine (aud).
  5. Votre serveur le vérifieAvec les clés publiées (JWKS), sans appeler Casa Tookan. Puis vous lisez vous-même les adresses partagées on-chain. Ne vous fiez jamais à un wallet pour savoir ce que possède un joueur.
  6. Plus tard, demandez des adressesrequestAddresses({ nonce, chains, reason }) quand vous en avez besoin : une distribution, un inventaire. Un nouveau token les transporte.

Manifest

Déclarez-le dans votre Wallet App Manifest : la capability casatookan:identity.ceid, et l’objet identity sous wallet.extensions.casatookan (propre à Casa Tookan : les autres wallets l’ignorent).

{
  "name": "Orb Quest",
  "wallet": {
    "version": "1",
    "capabilities": { "required": ["casatookan:identity.ceid"] },
    "extensions": {
      "casatookan": {
        "identity": {
          "reason": "Your CEID keeps your progress across devices.",
          "addresses": [
            { "chain": "bip122:000000000019d6689c085ae165831e93", "max": 2, "reason": "Activate the orbs you hold on Counterparty" },
            { "chain": "eip155:1", "max": 1, "reason": "Your Ethereum cards" }
          ]
        }
      }
    }
  }
}
ChampTypeRemarques
identity.reasonstring120 caractères max. Affiché sur la feuille de connexion.
identity.addressesarrayLe maximum que vous pourrez jamais demander, par chaîne. Une demande au-delà est refusée. Omettez-le si vous n’avez besoin que du compte.
…chainCAIP-2Les actifs Counterparty vivent sur Bitcoin : utilisez l’identifiant de Bitcoin (c’est l’adresse legacy qui est partagée).
…max1–5Adresses que le joueur peut cocher pour cette chaîne.
…reasonstring80 caractères max, affiché au-dessus des cases à cocher de la chaîne.

Dans la page

Disponible dans le navigateur de Casa Tookan quand le manifest déclare casatookan:identity.ceid. Les appels sont rejetés avec une erreur dont le code indique la raison :

codeQuand
rejectedLe joueur a fermé la feuille de Casa ou annulé une signature.
not_declaredVotre manifest ne déclare pas casatookan:identity.ceid.
over_limitPlus d’adresses, ou une autre chaîne, que ce que permet identity.addresses. Vérifié avant toute feuille.
invalidNonce manquant, chains mal formé.
failedLe serveur de Casa Tookan a refusé (par exemple, un autre CEID est actif sur l’appareil) ; le message dit pourquoi.
unavailableNon proposé ici (hors du navigateur, version plus ancienne).

const { nonce } = await fetch('/auth/nonce').then((r) => r.json());

// account only: no address leaves the wallet
const { token } = await window.casaTookan.ceid.signIn({ nonce });
await fetch('/auth/casa', { method: 'POST', body: token });

// months later, for the drop
const { nonce: n2 } = await fetch('/auth/nonce').then((r) => r.json());
const { token: withAddresses } = await window.casaTookan.ceid.requestAddresses({
  nonce: n2,
  chains: [{ chain: 'bip122:000000000019d6689c085ae165831e93', max: 1 }],
  reason: 'Where should we send your reward?',
});
AppelRenvoieRemarques
ceid.signIn({ nonce }){ token }Les adresses déjà partagées avec votre origine sont de nouveau incluses ; aucune n’est ajoutée.
ceid.requestAddresses({ nonce, chains, reason }){ token }Dans les limites du manifest. Les adresses déjà partagées arrivent pré-cochées ; le joueur peut les décocher, et elles quittent le token.
ceid.availablebooleanFalse hors de Casa Tookan ou dans une version plus ancienne : proposez une autre connexion.

Le token

Un JWT (ES256) signé par le serveur de Casa Tookan, valable 24 heures. Demandez-en ensuite un nouveau ; si rien n’a changé, aucune feuille ne s’affiche.

{
  "iss": "https://ctserver.everdreamsoft.com",
  "aud": "https://orbquest.game",
  "sub": "ceid:48213907",
  "env": "production",
  "ceid": 48213907,
  "username": "CasaTookanUser#48213907",
  "usernameDefault": true,
  "addresses": [
    { "chain": "bip122:000000000019d6689c085ae165831e93", "address": "1Abc…k9Z", "since": "2026-03-02" }
  ],
  "facts": {
    "deviceAttested": true,
    "deviceUnique": true,
    "transfers": 0,
    "ceidAge": 214,
    "farcaster": { "fid": 4242 }
  },
  "nonce": "…", "iat": 1791878400, "exp": 1791964800
}
ClaimSignification
ceid / subLe joueur. Il ne change jamais, même quand le username change.
envproduction, ou development pour les builds Casa Tookan Dev, les simulateurs et les appareils non attestés. Les CEID de développement forment un ensemble séparé : leurs numéros et usernames ne sont pas ceux de production.
username, usernameDefaultUsername global actuel ; true tant qu’il est encore CasaTookanUser#….
addressesSeulement celles que le joueur a partagées avec votre origine. since : date à laquelle l’adresse a rejoint ce CEID. Tableau vide s’il n’y en a aucune.
facts.deviceAttestedLa requête vient de l’authentique app Casa Tookan sur un vrai appareil (App Attest / Play Integrity).
facts.deviceUniqueAucun autre CEID n’est actif sur cet appareil.
facts.transfersNombre de fois où le CEID a été déplacé vers une nouvelle phrase de récupération.
facts.ceidAgeJours écoulés depuis la création du CEID.
facts.farcasterPrésent quand le joueur a lié un compte Farcaster.

Le vérifier sur votre serveur

Jamais dans la page seule : un token vérifié uniquement dans le navigateur peut être falsifié par le joueur.

  1. SignatureAvec les clés de https://ctserver.everdreamsoft.com/.well-known/jwks.json (mettez-les en cache, suivez kid). Elles ne signent que les tokens de production : un token de développement y échoue de lui-même.
  2. Audience et émetteuraud est exactement votre origine, iss est le serveur de Casa Tookan.
  3. NonceCelui que vous avez émis pour cette session, non utilisé. Brûlez-le.
  4. Duréeexp non dépassé (tolérez une minute de décalage d’horloge).
import { createRemoteJWKSet, jwtVerify } from 'jose';

const JWKS = createRemoteJWKSet(new URL('https://ctserver.everdreamsoft.com/.well-known/jwks.json'));

export async function verifyCasaToken(token, expectedNonce) {
  const { payload } = await jwtVerify(token, JWKS, {
    issuer: 'https://ctserver.everdreamsoft.com',
    audience: 'https://orbquest.game',
    clockTolerance: 60,
  });
  if (payload.nonce !== expectedNonce) throw new Error('nonce');
  return payload; // key the player on payload.ceid
}

Builds de développement

Testez avec Casa Tookan Dev. Ses CEID vivent à part de ceux de production et sont signés par une clé de développement publiée sur https://ctserver.everdreamsoft.com/.well-known/jwks-dev.json. Pointez votre serveur de staging dessus et vérifiez env === "development" ; votre serveur de production garde les clés de production et ne voit jamais de comptes de test. Les builds TestFlight de l’app principale s’attestent comme production : ne testez pas avec.

Comptes multiples

Le partage d’adresses par app ne protège pas contre une personne qui joue sous plusieurs identités. Le tableau ci-dessous donne la parade à chaque attaque.

AttaqueQui s’en chargeComment
Un CEID joue deux foisCasa TookanVous recevez toujours le même ceid, quelles que soient les adresses partagées.
Plusieurs CEID sur un téléphoneCasa TookanUn appareil, un CEID : une nouvelle phrase déplace le CEID existant.
Une adresse alimente deux joueursCasa TookanUne adresse appartient à un seul CEID ; une adresse dissociée attend 90 jours avant d’en rejoindre un autre.
Un actif passe d’un wallet à l’autreVousCasa Tookan ne peut pas le voir. Prenez un snapshot des avoirs, verrouillez-les, ou exigez une durée de détention.
Plusieurs téléphonesLes deuxCasa Tookan fournit les faits ; vous fixez votre seuil (par ex. des récompenses seulement pour deviceAttested et ceidAge ≥ 30).

Les règles que suivent les joueurs

RègleCe que cela signifie pour vous
Username : une fois tous les 30 joursRafraîchissez-le à chaque token ; ne l’utilisez jamais comme clé. L’ancien nom reste réservé 30 jours.
Motif par défaut réservéPersonne ne peut choisir CasaTookanUser#… : il signifie toujours « n’a pas choisi de nom ».
Dissocier une adresseElle disparaît du token suivant. Cessez alors de l’utiliser.
Token : 24 heuresRedemandez-le chaque jour, ou à chaque session ; gardez votre propre session entre-temps.
Phrase perdue, sans transfertLe joueur ne peut pas obtenir de nouveau CEID sur cet appareil. Votre support ne peut pas fusionner de comptes : il n’y a rien vers quoi fusionner.

Confidentialité

Jamais montrées

Casas privées

Une casa que le joueur n’a pas choisie pour vous n’existe pas pour vous. Ne demandez pas aux joueurs de coller d’autres adresses dans votre jeu.

Votre choix

Adresses partagées

Une fois partagées, vous savez qu’elles appartiennent à ce joueur. Si vous les publiez (classements, profils), dites-le dans votre reason.

Par origine

Rien ne circule

Les adresses partagées avec une autre app ne vous parviennent jamais, et la liste des adresses d’un CEID n’est pas publique.

L’essayer dans le playground

La mini app playground développeur a un onglet CEID qui joue chacun des scénarios ci-dessus (première connexion, jeu sans adresses, la distribution, les refus, les tokens expirés, rejoués et étrangers, un changement de nom, une nouvelle phrase, le seuil anti-Sybil), à côté d’onglets pour l’environnement, le manifest, les providers et les deep links. Ouvrez ctserver.everdreamsoft.com/playground/ dans Casa Tookan : il se connecte au serveur de Casa Tookan (un build de développement reçoit des tokens env: "development"). Dans un navigateur ordinaire, il joue contre un wallet simulé et un émetteur simulé, sous leurs propres émetteur et clé, si bien qu’un token simulé ne passe jamais pour un token de Casa Tookan.