Spieler und Anmeldung
Gastkonten, die Neustarts überstehen, Anzeigenamen und das Verknüpfen von Gästen mit E-Mail oder Google.
Codekommentare und API-Namen bleiben auf Englisch, damit sie zu den SDKs passen.
Gast-Anmeldung#
Rufen Sie dies einmal beim Start auf. Die gespeicherte Sitzung wird wiederhergestellt (und bei Bedarf erneuert) oder ein neuer Gast angelegt, sodass derselbe Spieler seinen Fortschritt behält.
var signIn = await Majacloud.Auth.SignInAnonymouslyAsync();
if (signIn.Ok)
{
var player = signIn.Value;
Debug.Log(player.PlayerId + " " + player.DisplayName + " guest: " + player.IsGuest);
}var signed_in := await Majacloud.auth.sign_in_anonymously()
if signed_in.ok:
var player: Dictionary = signed_in.value
print(player.player_id, " ", player.display_name, " ", player.auth_type)const signIn = await mc.auth.signInAnonymously();
if (signIn.ok) {
const player = signIn.value;
console.log(player.player_id, player.display_name, player.auth_type);
}curl -X POST https://majacloud.majanite.com/v1/auth/guest -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Content-Type: application/json" -d '{"device_id": "install-7f2c"}'
# Before the access token expires (1 hour), rotate the session:
curl -X POST https://majacloud.majanite.com/v1/auth/refresh -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Content-Type: application/json" -d '{"refresh_token": "<refresh_token>"}'Anzeigenamen#
Gäste erhalten einen generierten Namen wie Guest 4821. Spieler können einen eigenen wählen; Bestenlisten zeigen ihn an.
var renamed = await Majacloud.Auth.SetDisplayNameAsync("Nova");
if (!renamed.Ok) Debug.Log(renamed.Error.Message); // e.g. Validation: too longvar renamed := await Majacloud.auth.set_display_name("Nova")
if not renamed.ok:
print(renamed.message) # e.g. validation: too longconst renamed = await mc.auth.setDisplayName('Nova');
if (!renamed.ok) console.log(renamed.error.message); // e.g. validation: too longcurl -X PATCH https://majacloud.majanite.com/v1/players/me -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" -d '{"display_name": "Nova"}'Mit E-Mail oder Google verknüpfen#
Beim Verknüpfen öffnet sich eine sichere Webseite auf Ihrem MAJACLOUD-Server, auf der sich der Spieler mit E-Mail und Passwort oder mit Google anmeldet oder registriert. Der Fortschritt des Gasts (Punktzahlen, Speicherstände, Wallet) wird auf dieses Konto übertragen, und das Spiel erhält die neue Sitzung – auf jedem Gerät.
// Opens the sign-in page, waits for the player, then switches the session
var linked = await Majacloud.Auth.LinkAccountAsync(new MajacloudLinkOptions { ReturnUrl = "mygame://auth" });
if (linked.Ok) Debug.Log("Signed in as " + linked.Value.DisplayName);
// WebGL: browsers only open tabs from a click, so start first and open inside the handler
var flow = await Majacloud.Auth.StartLinkAsync(new MajacloudLinkOptions { OpenBrowser = false });
linkButton.onClick.AddListener(() => flow.Value.OpenInBrowser());
var result = await flow.Value.WaitForCompletionAsync();# Opens the sign-in page, waits for the player, then switches the session
var linked := await Majacloud.auth.link_account("mygame://auth")
if linked.ok:
print("Signed in as ", linked.value.display_name)
# Or step by step (e.g. to open the page from a button)
var started := await Majacloud.auth.start_link()
var flow: MajacloudLinkFlow = started.value
flow.open_in_browser()
var result := await flow.wait_for_completion()// Call it from a click handler: the browser only allows the new tab after a user gesture
document.querySelector('#link').addEventListener('click', async () => {
const linked = await mc.auth.linkAccount();
if (linked.ok) console.log('Signed in as ' + linked.value.display_name);
});# 1. Start (send the guest's Bearer token so its progress is merged)
curl -X POST https://majacloud.majanite.com/v1/auth/link/start -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" -d '{"code_challenge": "<base64url(sha256(verifier))>", "code_challenge_method": "S256"}'
# 2. Open auth_url for the player, then poll until status is "completed"
curl "https://majacloud.majanite.com/v1/auth/link/status?flow_id=<flow_id>&flow_token=<flow_token>" -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY"
# 3. Exchange for the new session
curl -X POST https://majacloud.majanite.com/v1/auth/link/exchange -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Content-Type: application/json" -d '{"flow_id": "<flow_id>", "exchange_code": "<exchange_code>", "code_verifier": "<verifier>"}'So funktioniert die Verknüpfung#
- Das SDK erzeugt ein einmaliges Geheimnis (PKCE) und startet einen Anmeldeablauf.
- Der Spieler schließt die Anmeldung auf der Webseite ab; das SDK fragt den Status ab, bis der Ablauf abgeschlossen ist.
- Das SDK tauscht den Ablauf mithilfe des Geheimnisses gegen eine Sitzung ein, sodass ein gestohlener Link nutzlos ist.
- Abläufe verfallen nach 15 Minuten (verlängert, solange die Seite geöffnet ist).
Rückkehr ins Spiel#
Ohne Rücksprung-URL fordert die Seite Spieler auf, zum Spiel zurückzukehren. Um sie automatisch zurückzuschicken, fügen Sie Ihr eigenes URL-Schema (zum Beispiel mygame) unter API-Schlüssel ▸ Rücksprung-URLs der Spieleranmeldung hinzu und übergeben mygame://auth als Rücksprung-URL.
Events#
Reagieren Sie, wenn der Spieler wechselt, sich abmeldet oder die Sitzung nicht mehr erneuert werden kann:
Majacloud.Auth.PlayerChanged += player => nameLabel.text = player?.DisplayName;
Majacloud.Auth.SignedOut += () => ShowTitleScreen();
Majacloud.Auth.SessionExpired += () => ShowSignIn();Majacloud.auth.player_changed.connect(func(player): $NameLabel.text = player.get("display_name", ""))
Majacloud.auth.signed_out.connect(show_title_screen)
Majacloud.auth.session_expired.connect(show_sign_in)mc.auth.on('playerChanged', (player) => render(player));
mc.auth.on('signedOut', () => showTitleScreen());
mc.auth.on('sessionExpired', () => showSignIn());Abmelden#
Beim Abmelden wird die Sitzung auf dem Server widerrufen und auf dem Gerät verworfen. Die nächste Anmeldung legt einen neuen Gast an.
await Majacloud.Auth.SignOutAsync(); // revokes the session on the server
Majacloud.Auth.ClearLocalSession(); // or only forget it on this deviceawait Majacloud.auth.sign_out() # revokes the session on the server
Majacloud.auth.clear_local_session() # or only forget it on this deviceawait mc.auth.signOut(); // revokes the session on the server
mc.auth.clearLocalSession(); // or only forget it on this devicecurl -X POST https://majacloud.majanite.com/v1/auth/logout -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Content-Type: application/json" -d '{"refresh_token": "<refresh_token>"}'Spieler vom Server lesen#
Mit dem geheimen Schlüssel kann Ihr Server jeden Spieler lesen, einschließlich E-Mail-Adresse und Wallet-Guthaben:
// Node.js, created with secretKey
const found = await admin.server.getPlayer('player_3f9c…');
if (found.ok) console.log(found.value.player.email, found.value.player.wallets);curl https://majacloud.majanite.com/v1/players/player_3f9c… \
-H "X-Project-ID: $PROJECT_ID" -H "X-Secret-Key: $SECRET_KEY"Im Dashboard#
Die Seite Spieler listet jeden Spieler mit Anmeldemethode, Punktzahlen, Speicherständen und Wallet auf. Dort können Sie einen Spieler umbenennen oder deaktivieren, überall abmelden, ihm einen Link zum Zurücksetzen des Passworts senden oder ihn löschen.