Перейти к основному содержимому

Аутентификация

Онлайн-слой MCE поддерживает несколько методов аутентификации через Nakama. Все потоки аутентификации управляются AuthService (в Auth/AuthService.cs) и SessionManager, оба инициализируются автоматически NakamaManager при запуске.

Экран входа MCE Online

Этот экран поставляется с движком и охватывает три сценария ниже: почта/пароль, создание учётной записи и провайдеры SSO. Ничего здесь не макет — это работающая игра.

Состояния подключения​

Перечисление ConnectionState отслеживает полный жизненный цикл онлайн-подключения:

СостояниеОписание
DisconnectedНе подключён и не пытается подключиться
ConnectingВ процессе установки соединения
ConnectedУспешно подключён и аутентифицирован
ReconnectingСоединение потеряно, попытка автоматического переподключения
OfflineРабота в офлайн-режиме (сервер недоступен или отключён)
FailedСоединение не удалось после всех попыток

Вы можете подписаться на изменения состояния через NakamaManager.Instance.OnStateChanged.

NakamaManager.Instance.OnStateChanged += (state) =>
{
Debug.Log($"Connection state: {state}");
};

Доступны удобные свойства в NakamaManager:

  • IsConnected — возвращает true только когда состояние Connected.
  • IsOffline — возвращает true когда состояние Offline или Disconnected.

Методы аутентификации​

MCE поддерживает следующие значения AuthMethod: Email, DeviceId, Discord, Google, Apple, Facebook и Custom.

Аутентификация по устройству (автоматический вход)​

Самый простой метод. Использует SystemInfo.deviceUniqueIdentifier для автоматического создания анонимной учётной записи. Идеально подходит для мобильных устройств и первой игры.

bool success = await NakamaManager.Instance.ConnectWithDeviceAsync();

Под капотом это единый конвейер подключения NakamaManager, который вызывает Client.AuthenticateDeviceAsync(deviceId, create: true): он создаёт новую учётную запись Nakama при первом использовании и выполняет вход при последующих вызовах. (AuthService — тонкий фасад над тем же конвейером, так что способ аутентификации ровно один.) ID устройства обрезается в логах для конфиденциальности.

Аутентификация по email / паролю​

Поддерживает как регистрацию (create: true), так и вход (create: false).

// Регистрация новой учётной записи
bool registered = await NakamaManager.Instance.ConnectWithEmailAsync(
"player@example.com", "securepassword", createAccount: true);

// Вход в существующую учётную запись
bool loggedIn = await NakamaManager.Instance.ConnectWithEmailAsync(
"player@example.com", "securepassword", createAccount: false);

Вы также можете обратиться к фасаду AuthService, который возвращает сессию:

OnlineSession session = await NakamaManager.Instance.Auth.AuthenticateEmailAsync(
email, password, create: true);

Возвращаемый OnlineSession оборачивает ISession Nakama и предоставляет: UserId, DisplayName, Token, RefreshToken и ExpiresAt.

SSO аутентификация (Discord, Google, Apple)​

Поставщики SSO включаются индивидуально в OnlineConfig:

  • EnableDiscordSSO (по умолчанию: true)
  • EnableGoogleSSO (по умолчанию: true)
  • EnableAppleSSO (по умолчанию: true)

ID клиентов OAuth также настраиваются в OnlineConfig (DiscordClientId, GoogleClientId).

// Google
bool success = await NakamaManager.Instance.ConnectWithSSOAsync(
AuthMethod.Google, googleIdToken);

// Apple
bool success = await NakamaManager.Instance.ConnectWithSSOAsync(
AuthMethod.Apple, appleIdentityToken);

// Discord (использует пользовательский поток аутентификации с ID пользователя Discord)
bool success = await NakamaManager.Instance.ConnectWithSSOAsync(
AuthMethod.Discord, discordUserId);

Google и Apple используют встроенные AuthenticateGoogleAsync / AuthenticateAppleAsync Nakama. Discord и Facebook проходят через AuthenticateCustomAsync, так как Nakama не имеет родного провайдера аутентификации Discord.

Привязка учётных записей​

Игроки могут привязать несколько методов аутентификации к одной учётной записи. Это позволяет начать с аутентификации по устройству, а затем добавить email или SSO для доступа с разных устройств.

bool linked = await NakamaManager.Instance.Auth.LinkAccountAsync(
AuthMethod.Google, googleToken);

bool linked = await NakamaManager.Instance.Auth.LinkAccountAsync(
AuthMethod.Discord, discordToken);

LinkAccountAsync использует Client.LinkGoogleAsync, Client.LinkAppleAsync или Client.LinkCustomAsync в зависимости от метода.

Сохранение сессии​

SessionManager обрабатывает сохранение и восстановление токенов аутентификации с помощью PlayerPrefs:

  • Ключ токена: mce_nakama_token
  • Ключ токена обновления: mce_nakama_refresh

При успешной аутентификации SaveNakamaSession(session) сохраняет оба токена. При перезапуске приложения LoadNakamaSession(client) восстанавливает сессию через Nakama.Session.Restore(token, refresh). Если восстановленная сессия истекла, она автоматически очищается.

// Проверить, существует ли действительная сессия
bool hasSession = NakamaManager.Instance.SessionMgr.HasValidSession();

// Вручную очистить сессию (выход)
NakamaManager.Instance.SessionMgr.ClearSession();

Постаутентификационный поток​

После любой успешной аутентификации NakamaManager.FinalizeConnection() выполняет следующую последовательность:

  1. Сохраняет Session, UserId, DisplayName и SessionToken.
  2. Сохраняет сессию через SessionManager.
  3. Создаёт WebSocket через Client.NewSocket(useMainThread: true).
  4. Подключает события сокета: Closed, ReceivedError, ReceivedMatchState, ReceivedChannelMessage, ReceivedNotification, ReceivedMatchmakerMatched, ReceivedStatusPresence.
  5. Подключает сокет с помощью Socket.ConnectAsync(session).
  6. Асинхронно инициализирует онлайн-сервисы:
    • WorldSync.InitializeAsync() — присоединяется к мировому матчу.
    • Chat.JoinGlobalChannelAsync() — присоединяется к глобальному чату.
    • Friends.RefreshFriendsListAsync() — загружает друзей и отслеживает их статус.
    • Housing.InitializeAsync() — если EnableHousing включён.
    • Mods.LoadInstalledModsAsync() — если EnableModSupport включён.
  7. Запускает OnConnected и регистрирует OnlineCommandBridge.

Автоматическое переподключение​

Когда сокет неожиданно закрывается и OnlineConfig.AutoReconnect равен true, NakamaManager автоматически пытается переподключиться, используя экспоненциальную задержку:

  • Формула задержки: min(2 * 2^(попытка-1), 30) секунд.
  • Максимальное количество попыток: OnlineConfig.MaxReconnectAttempts (по умолчанию: 5).
  • Переподключение восстанавливается из сохранённой сессии. Если сессия истекла, происходит переход в офлайн-режим.

Во время попыток состояние переходит в Reconnecting.

Офлайн-резерв​

Когда OnlineConfig.AllowOfflineFallback равен true (по умолчанию), любой сбой подключения gracefully переходит в ConnectionState.Offline. Вся игра продолжает работать локально — онлайн-слой полностью опционален.

Отображаемое имя​

После аутентификации вы можете обновить отображаемое имя игрока:

bool updated = await NakamaManager.Instance.Auth.UpdateDisplayNameAsync("NewName");

Обработка ошибок​

Ошибки аутентификации отображаются через событие NakamaManager.OnConnectionError:

NakamaManager.Instance.OnConnectionError += (errorMessage) =>
{
Debug.LogError($"Connection error: {errorMessage}");
// Показать диалог ошибки игроку
};

Все методы аутентификации перехватывают исключения внутренне и логируют их с префиксом [MCE Online] или [Auth].

Справочник по конфигурации​

Ключевые настройки в OnlineConfig (ScriptableObject в Resources/OnlineConfig):

ПолеПо умолчаниюОписание
ServerHost127.0.0.1Хост сервера Nakama
ServerPort7350Порт сервера Nakama
ServerKeydefaultkeyКлюч сервера Nakama
UseSSLfalseИспользовать HTTPS/WSS
ConnectionTimeout10Таймаут в секундах
AutoReconnecttrueАвтопереподключение при отключении
MaxReconnectAttempts5Максимум попыток
AllowOfflineFallbacktrueПереход в офлайн при ошибке
EnableDiscordSSOtrueВключить аутентификацию Discord
EnableGoogleSSOtrueВключить аутентификацию Google
EnableAppleSSOtrueВключить аутентификацию Apple

Рекомендации по безопасности​

  • Никогда не раскрывайте ServerKey в сборках, предназначенных для распространения. Используйте ключи Nakama для конкретной среды.
  • Предпочитайте SSO или email-аутентификацию для продакшена. Аутентификация по устройству удобна для разработки и быстрого старта на мобильных, но не может быть восстановлена при сбросе устройства.
  • Включите EnableServerAuthority в OnlineConfig для продакшена. Это направляет все операции изменения состояния (предметы, деньги, телепорт) через проверку сервера с помощью OnlineCommandBridge.
  • Токены сессии хранятся в PlayerPrefs. На платформах, где PlayerPrefs небезопасен (например, ПК), рассмотрите шифрование токена в состоянии покоя.