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

Документация · 04

Онлайн-пропуска на выделенных серверах

Позвольте выделенному серверу за несколько микросекунд и без обращения в сеть узнать, какой аккаунт Gameway подключается, без пароля и запроса.

4 минуты чтенияОбновлено 4 окт. 2026

Разделы документации

Онлайн-пропуска уже работают целиком: приложение выдаёт их, SDK передаёт их вашему серверу, а сервер проверяет их ключами ниже. Имена — те, что есть в пакете SDK сегодня; что изменилось, смотрите в списке изменений полученной версии.

Что такое пропуск

Когда игрок запускает вашу игру из Gameway, игра может попросить у платформы пропуск запуска для одного адреса сервера. Пропуск — маленький подписанный токен с именем игрока, приложения и сервера. Игра игрока отправляет его в запросе на подключение, а ваш сервер проверяет подпись открытым ключом, который у него уже есть. Обращаться в Gameway не нужно, а пропуск для другой игры, другого сервера или чужого адреса не пройдёт проверку.

Можно также потребовать подтверждать каждый пропуск онлайн, один раз: тогда его нельзя повторить даже в течение его короткой жизни.

Зарегистрируйте сервер

У каждого выделенного сервера есть номер, к которому привязан пропуск, и список адресов, на которые подключаются игроки.

Терминал
gw server create <app> --name eu-1 --endpoint 203.0.113.5:27777

Команда печатает номер сервера и секретный ключ, начинающийся с gws_. Ключ показывается один раз: положите его в окружение сервера и больше никуда. gw server rotate-key <app> <serverId> --yes выдаёт новый и отзывает старый.

Пропуск действует только для зарегистрированного адреса. За NAT или балансировщиком регистрируйте тот адрес, на который игроки подключаются на самом деле.

Включайте плавно

Серверы работают как раньше, пока вы сами не включите проверку. Режим задаётся переменными окружения:

ПеременнаяЗначенияПо умолчанию
GAMEWAY_TICKETSoff, optional, requiredoff
GAMEWAY_TICKETS_ONLINEoff, best_effort, requiredoff
GAMEWAY_APP_IDномер вашего приложенияобязательна, кроме off
GAMEWAY_SERVER_IDномер из server createне задана: принимаются пропуска для любого сервера
GAMEWAY_PUBLIC_ENDPOINTSадреса ip:port через запятую, на которые подключаются игрокине задана: игра может подставить свои
GAMEWAY_SERVER_KEYключ gws_, только для онлайн-подтвержденияне задан
GAMEWAY_APIадрес API для обновления открытых ключей и онлайн-подтвержденияне задан
GAMEWAY_KEYRING_FILEфайл для кэша подписанных открытых ключейне задан
Ситуация`off``optional``required`
Пропуска нетпустить, как раньшепустить как анонимаотклонить
Недействительный пропускигнорируетсяпустить как анонима, но не как заявленного игрокаотклонить с причиной
Действительный пропускигнорируетсяпустить как этого игрокапустить как этого игрока

Начните с optional: пока игроки обновляются, никого не заблокируют, а в журналах будет видно, сколько подключений приходит с действительным пропуском. Когда их почти все, переходите на required.

Онлайн-подтверждение требует, чтобы сервер мог достучаться до Gameway по HTTPS. В контейнере установите сертификаты центров сертификации.

Проверка пропуска на сервере

Для этого в пакете Unity есть GamewayServer. Те же проверки есть в виде библиотеки на C (gw_srv_*) для серверов, сделанных не на Unity.

C#
using Gameway.Sdk;
using Gameway.Sdk.Server;

static class PassCheck
{
    static GamewayServer server;

    public static void Start()
    {
        // reads the GAMEWAY_* variables below; "off" (the default) changes nothing
        var r = GamewayServer.InitFromEnvironment("203.0.113.5:27777", out server);
        if (r.IsError()) UnityEngine.Debug.LogError("Gameway server: " + r.CodeName());
    }

    // in your connection approval, with the ticket text the client put in its connect payload
    public static GwResult Check(string peerIp, string ticketText, out GwTicketInfo info)
    {
        info = default;
        var t = server.Throttle(peerIp);          // keep floods away from the signature check
        if (t.IsError()) return t;
        return server.VerifyBase64Url(ticketText, out info);   // checked offline, thread-safe
    }
}
  1. При старте InitFromEnvironment читает переменные. Неверное значение, отсутствие номера приложения или режим required без адресов, адреса API или свежих ключей — это результат с ошибкой: исправьте до приёма игроков.
  2. Для каждого подключения сначала Throttle(peerIp), затем Verify или VerifyBase64Url. Успешный результат содержит номер игрока и отображаемое имя, если игрок это разрешил.
  3. При включённом онлайн-подтверждении вызовите BeginRedeem(ticket), оставьте подключение в ожидании и опрашивайте PollEvent, пока не придёт ответ. Уже использованный пропуск или пропуск заблокированного игрока отклоняется.
  4. Связь clientId с userId храните сами и решите, что делает второй вход того же игрока. Не доверяйте номеру игрока из любого источника, кроме проверенного пропуска.

Почему пропуск не проходит

КодЗначение
TicketMissingВ подключении не было пропуска.
TicketMalformed, TicketBadSignature, TicketUnknownKidТекст повреждён, не подписан платформой или подписан ключом, которого сервер не знает. Обновите ключи.
TicketExpired, TicketNotYetValidПропуск старше срока жизни или часы сервера неверны.
TicketWrongApp, TicketWrongAudienceПропуск для другого приложения или другого адреса сервера.
TicketReplayedТот же пропуск пришёл повторно.
TicketRedeemUnavailableЗапрошено онлайн-подтверждение, а платформа недоступна.
TicketBannedИгроку сейчас нельзя играть в это приложение.

Показывайте игрокам собственные понятные тексты. Не выводите им сырые коды.

Ключи и ротация

Открытые ключи, которыми пользуется сервер, подписаны корневым ключом, встроенным в SDK. Платформа меняет ключи подписи по расписанию и публикует действующие по адресу GET /v1/keys/tickets. Сервер с заданной GAMEWAY_API обновляет их сам; без неё он пользуется ключами из файла и из сборки SDK.

  • Не копируйте ключи вручную.
  • Держите GAMEWAY_ALLOW_DEV_KEYS равной 0. Ключи для разработки нужны только локальным тестовым серверам.
  • Если ключ сервера утёк, немедленно замените его. Пропуска не секрет, но ключ сервера позволяет подтверждать пропуска от вашего имени.

Gameway · 2026-10-04