Szybki start
Od pustego projektu do zalogowanego gracza w pięciu krokach.
1. Włącz metodę logowania#
W panelu Nunox otwórz projekt, wybierz środowisko (np. Development) i przejdź do Gracze → Uwierzytelnianie. Kliknij Dodaj metodę logowania i dodaj Anonimowe (gość) - to najprostszy start. Możesz od razu dodać też E-mail i hasło.
2. Skopiuj identyfikatory#
Gra wskazuje projekt i środowisko dwoma identyfikatorami:
- identyfikator projektu (
prj_gv_…) - w ustawieniach projektu w panelu, - identyfikator środowiska (
env_gv_…) - na liście środowisk projektu.
Oba są publiczne. W przykładach poniżej zastąp nimi prj_gv_… i env_gv_….
3. Zaloguj gracza jako gościa#
/v1/authentication/anonymoususing System;
using System.Collections;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
public class NunoxAuth : MonoBehaviour
{
const string BaseUrl = "https://player-auth.services.api.sandbox.gamevious.com/v1/authentication";
const string ProjectId = "prj_gv_…";
const string EnvironmentId = "env_gv_…";
[Serializable] public class Player { public string id; public string displayName; public string email; public bool emailVerified; public string accountState; }
[Serializable] public class AuthResponse { public Player player; public string idToken; public int expiresIn; public string sessionToken; public string sessionExpiresAt; }
public IEnumerator Post(string path, string json, string idToken, Action<string> onSuccess, Action<long, string> onError)
{
using var request = new UnityWebRequest(BaseUrl + path, "POST");
request.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(json ?? "{}"));
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
request.SetRequestHeader("X-Project-Id", ProjectId);
request.SetRequestHeader("X-Environment", EnvironmentId);
if (!string.IsNullOrEmpty(idToken)) request.SetRequestHeader("Authorization", "Bearer " + idToken);
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success) onSuccess(request.downloadHandler.text);
else onError(request.responseCode, request.downloadHandler.text);
}
IEnumerator Start()
{
yield return Post("/anonymous", "{}", null, body =>
{
var auth = JsonUtility.FromJson<AuthResponse>(body);
PlayerPrefs.SetString("nunox_session", auth.sessionToken);
Debug.Log("Zalogowano gracza " + auth.player.id);
}, (status, body) => Debug.LogError($"Błąd {status}: {body}"));
}
}
const BASE_URL = "https://player-auth.services.api.sandbox.gamevious.com/v1/authentication";
const HEADERS = {
"Content-Type": "application/json",
"X-Project-Id": "prj_gv_…",
"X-Environment": "env_gv_…",
};
async function call(path, body, idToken) {
const response = await fetch(BASE_URL + path, {
method: "POST",
headers: { ...HEADERS, ...(idToken ? { Authorization: `Bearer ${idToken}` } : {}) },
body: JSON.stringify(body || {}),
});
const data = await response.json();
if (!response.ok) {
throw Object.assign(new Error(data.error?.message), { code: data.error?.code, status: response.status });
}
return data;
}
const auth = await call("/anonymous");
localStorage.setItem("nunox_session", auth.sessionToken);
console.log("Zalogowano gracza", auth.player.id);
curl -X POST https://player-auth.services.api.sandbox.gamevious.com/v1/authentication/anonymous \
-H "Content-Type: application/json" \
-H "X-Project-Id: prj_gv_…" \
-H "X-Environment: env_gv_…" \
-d '{}'
W panelu, na stronie Gracze, pojawi się nowy gracz ze stanem konta „Gość”.
4. Przechowuj sesję#
Zapisz sessionToken na urządzeniu. Przy następnym uruchomieniu gry nie twórz nowego gościa, tylko odnów sesję - inaczej gracz za każdym razem dostanie nowe, puste konto.
Bezpieczne miejsce na token. PlayerPrefs i localStorage wystarczą na start, ale nie są szyfrowane. W wersji produkcyjnej gry na telefony użyj pęku kluczy (iOS Keychain) albo Android Keystore.
5. Odnawiaj sesję#
/v1/authentication/session-tokenvar session = PlayerPrefs.GetString("nunox_session", "");
yield return Post("/session-token", JsonUtility.ToJson(new SessionRequest { sessionToken = session }), null, body =>
{
var auth = JsonUtility.FromJson<AuthResponse>(body);
PlayerPrefs.SetString("nunox_session", auth.sessionToken); // zawsze zapisuj nowy token
}, (status, body) =>
{
if (status == 401) { /* sesja wygasła - zaloguj gracza ponownie */ }
});
[Serializable] public class SessionRequest { public string sessionToken; }
const refreshed = await call("/session-token", { sessionToken: localStorage.getItem("nunox_session") });
localStorage.setItem("nunox_session", refreshed.sessionToken); // zawsze zapisuj nowy token
curl -X POST https://player-auth.services.api.sandbox.gamevious.com/v1/authentication/session-token \
-H "Content-Type: application/json" \
-H "X-Project-Id: prj_gv_…" \
-H "X-Environment: env_gv_…" \
-d '{"sessionToken":"…"}'
Każde odnowienie zwraca nowy sessionToken, a poprzedni przestaje działać. Jeśli dwa miejsca w grze odnowią sesję jednocześnie tym samym tokenem, jedno z nich dostanie 401 session_invalid - odnawiaj sesję w jednym miejscu kodu.
Co dalej#
- Zamień gościa na konto e-mail, zanim gracz zrobi pierwszy zakup.
- Rejestracja i logowanie e-mailem, weryfikacja adresu i reset hasła.