Gamevious Developers

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:

Oba są publiczne. W przykładach poniżej zastąp nimi prj_gv_… i env_gv_….

3. Zaloguj gracza jako gościa#

POST/v1/authentication/anonymous
using 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ę#

POST/v1/authentication/session-token
var 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#