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 uniquementwindow.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.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.
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.signIn({ 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.aud).requestAddresses({ nonce, chains, reason }) quand vous en avez besoin : une distribution, un inventaire. Un nouveau token les transporte.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" }
]
}
}
}
}
}
| Champ | Type | Remarques |
|---|---|---|
identity.reason | string | 120 caractères max. Affiché sur la feuille de connexion. |
identity.addresses | array | Le 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. |
…chain | CAIP-2 | Les actifs Counterparty vivent sur Bitcoin : utilisez l’identifiant de Bitcoin (c’est l’adresse legacy qui est partagée). |
…max | 1–5 | Adresses que le joueur peut cocher pour cette chaîne. |
…reason | string | 80 caractères max, affiché au-dessus des cases à cocher de la chaîne. |
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 :
| code | Quand |
|---|---|
rejected | Le joueur a fermé la feuille de Casa ou annulé une signature. |
not_declared | Votre manifest ne déclare pas casatookan:identity.ceid. |
over_limit | Plus d’adresses, ou une autre chaîne, que ce que permet identity.addresses. Vérifié avant toute feuille. |
invalid | Nonce manquant, chains mal formé. |
failed | Le serveur de Casa Tookan a refusé (par exemple, un autre CEID est actif sur l’appareil) ; le message dit pourquoi. |
unavailable | Non 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?',
});
| Appel | Renvoie | Remarques |
|---|---|---|
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.available | boolean | False hors de Casa Tookan ou dans une version plus ancienne : proposez une autre connexion. |
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
}
| Claim | Signification |
|---|---|
ceid / sub | Le joueur. Il ne change jamais, même quand le username change. |
env | production, 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, usernameDefault | Username global actuel ; true tant qu’il est encore CasaTookanUser#…. |
addresses | Seulement 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.deviceAttested | La requête vient de l’authentique app Casa Tookan sur un vrai appareil (App Attest / Play Integrity). |
facts.deviceUnique | Aucun autre CEID n’est actif sur cet appareil. |
facts.transfers | Nombre de fois où le CEID a été déplacé vers une nouvelle phrase de récupération. |
facts.ceidAge | Jours écoulés depuis la création du CEID. |
facts.farcaster | Présent quand le joueur a lié un compte Farcaster. |
Jamais dans la page seule : un token vérifié uniquement dans le navigateur peut être falsifié par le joueur.
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.aud est exactement votre origine, iss est le serveur de Casa Tookan.exp 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
}
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.
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.
| Attaque | Qui s’en charge | Comment |
|---|---|---|
| Un CEID joue deux fois | Casa Tookan | Vous recevez toujours le même ceid, quelles que soient les adresses partagées. |
| Plusieurs CEID sur un téléphone | Casa Tookan | Un appareil, un CEID : une nouvelle phrase déplace le CEID existant. |
| Une adresse alimente deux joueurs | Casa Tookan | Une 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’autre | Vous | Casa Tookan ne peut pas le voir. Prenez un snapshot des avoirs, verrouillez-les, ou exigez une durée de détention. |
| Plusieurs téléphones | Les deux | Casa Tookan fournit les faits ; vous fixez votre seuil (par ex. des récompenses seulement pour deviceAttested et ceidAge ≥ 30). |
| Règle | Ce que cela signifie pour vous |
|---|---|
| Username : une fois tous les 30 jours | Rafraî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 adresse | Elle disparaît du token suivant. Cessez alors de l’utiliser. |
| Token : 24 heures | Redemandez-le chaque jour, ou à chaque session ; gardez votre propre session entre-temps. |
| Phrase perdue, sans transfert | Le 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. |
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.
Une fois partagées, vous savez qu’elles appartiennent à ce joueur. Si vous les publiez (classements, profils), dites-le dans votre reason.
Les adresses partagées avec une autre app ne vous parviennent jamais, et la liste des adresses d’un CEID n’est pas publique.
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.