Не партнёр

Главная Документация и помощь
Документация Steamworks
Аутентификация и проверка владения

Введение

Steamworks обладает несколькими способами проверить личность пользователя Steam и подтвердить, что он владеет приложением. Ниже представлены все способы аутентификации, используемые в следующих сценариях:

Идентификация пользователя внутри Steam

Каждого пользователя Steam можно идентифицировать с помощью уникального 64-битного Steam ID, известного как Steam IDпользователя. В API Steamworks, написанном на C++, SteamID пользователя содержится внутри объекта CSteamID. Можно возвратить SteamID текущего пользователя, вызвав ISteamUser::GetSteamID, а затем возвратить 64-битный ID, вызвав CSteamID.ConvertToUint64() на возвращённом значении.

Следующие методы аутентификации могут использоваться в целях надёжного подтверждения Steam ID пользователя.

Все API, освещённые в этом документе

Билеты сессии аутентификации

Билеты сессии аутентификации — это подписанные билеты, которые используются для подтверждения личности пользователя, когда его игровой клиент подключён к любому числу других игровых клиентов (например, в одноранговой сессии многопользовательской игры) или слушающему/выделенному игровому серверу (с использованием API ISteamGameServer). Эти билеты можно использовать для подтверждения владения игрой и связанным дополнительным контентом, а также для того, чтобы определить, имеет ли пользователь блокировку VAC (см. Античит Valve (VAC) и игровые блокировки).
Билеты сессии аутентификации можно использовать для подтверждения личности пользователя, когда игровой клиент подключён к защищённому внутреннему серверу, используя веб-API Steamworks. Необходимо, чтобы защищённый сервер мог делать HTTPS запросы к api.steampowered.com.

Зашифрованные билеты приложений

Зашифрованные билеты приложений можно использовать для подтверждения личности пользователя, когда его игровой клиент подключён к защищённому внутреннему серверу. В отличие от билетов сессии аутентификации, подтверждение зашифрованных билетов приложений не требует от защищённого сервера HTTPS запросов. Взамен, для подтверждения билета защищённый сервер использует библиотеку C++ и закрытый симметричный ключ. SDK Steamworks включает 32-битную и 64-битную версии этой библиотеки для Windows и Linux в папке public/steam/lib.
Перед использованием зашифрованных билетов приложений необходимо сгенерировать закрытый ключ для каждого продукта. Чтобы это сделать, перейдите на страницу «Изменить настройки приложения» и выберите «Проверка подлинности SDK» в выпадающем меню «Безопасность». Сгенерированный ключ будет связан с номером AppID вашего продукта и всем прилагаемым к нему дополнительным контентом.

Обратите внимание: эти ключи должны надёжно храниться и никоим образом не должны распространяться в рамках вашего приложения!

веб-API Steamworks

В Steam встроен основанный на HTTP веб-API, который может использоваться для доступа ко многим функциям Steamworks. Этот API содержит публичные методы, доступ к которым может получить любое приложение, способное отправить HTTP-запрос, к примеру игровой клиент или сервер. Он также содержит защищённые методы, которые требуют аутентификации, к ним доступ могут получить доверенные серверные приложения. Дополнительную информацию о веб-API можно найти здесь.

P2P или игровые серверы

Билеты сессии аутентификации

Аутентификация пользователя

Инструкции ниже демонстрируют, как использовать билеты сессии аутентификации для подтверждения личности пользователя, когда его игровой клиент (клиент А) подключён к любому другому клиенту или игровому серверу (клиент Б):
  • Клиент А должен возвратить билет сессии аутентификации, вызвав ISteamUser::GetAuthSessionTicket.
  • Клиент A должен отправить свой билет сессии клиенту Б.
  • Клиент Б должен передать билет клиента А функции ISteamUser::BeginAuthSession, которая совершит краткую проверку данных. Если билет действителен, функция ISteamUser::BeginAuthSession перенаправит билет на сервер Steam, чтобы подтвердить, что он не был использован повторно и был выдан владельцем аккаунта клиента А. Результат этого подтверждения будет возвращён в обратном вызове ISteamUser::ValidateAuthTicketResponse_t.
  • Когда сессия многопользовательской игры закончится:

Несколько важных замечаний о билетах сессии аутентификации:
  • Билеты сессии аутентификации можно использовать только один раз. Функцию ISteamUser::GetAuthSessionTicket необходимо вызвать для каждого клиента в сессии многопользовательской игры, который запросит билет.
  • Если билет используется для аутентификации пользователей в одноранговой сессии многопользовательской игры, каждый игровой клиент должен подтвердить подлинность каждого второго игрового клиента в сессии.
  • После окончания работы с билетом сессии аутентификации должна быть вызвана функция ISteamUser::CancelAuthTicket для каждого дескриптора, возвращённого функцией ISteamUser::GetAuthSessionTicket.
  • Когда клиент А вызовет ISteamUser::CancelAuthTicket, клиент Б получит обратный вызов ISteamUser::ValidateAuthTicketResponse_t, заявляющий, что билет клиента А больше не действителен.
  • Когда клиент А покидает игру с клиентом Б, если вызов клиентом А функции ISteamUser::CancelAuthTicket будет обработан до вызова клиентом Б функции ISteamUser::EndAuthSession, клиент Б может получить обратный вызов ISteamUser::ValidateAuthTicketResponse_t, сообщающий, что билет был отменён. Поскольку существует взаимное соглашение о том, что клиент А покидает сессию, обратный вызов будет проигнорирован.
  • Проблемы с соединением могут помешать серверу Steam предоставить своевременный обратный вызов стороне, вызвавшей ISteamUser::BeginAuthSession. Сторона, вызвавшая ISteamUser::BeginAuthSession (клиент Б), не должна предполагать, что имеет подлинную информацию о клиенте А до получения обратного вызова, однако должна разрешить продолжение сессии многопользовательской игры.
  • Если сторона, вызвавшая ISteamUser::BeginAuthSession, получит обратный вызов ISteamUser::ValidateAuthTicketResponse_t, сообщающий, что билет клиента А недействителен, вызвавшая сторона должна отказаться от продолжения сессии многопользовательской игры с клиентом А. Если другие участники игры не откажутся играть с клиентом А, вызвавшая сторона должна покинуть сессию.
  • ISteamGameServer предоставляет аналогичные способы использования билета сессии аутентификации, чтобы подтвердить личность пользователя, когда его игровой клиент подключён к игровому серверу.

Подтверждение владения

При использовании билета сессии аутентификации Steam автоматически проверит, владеет ли пользователь текущим приложением. Если пользователь не владеет приложением, поле m_eAuthSessionResponse функции ISteamUser::ValidateAuthTicketResponse_t будет задано как k_EAuthSessionResponseNoLicenseOrExpired. После получения билета сессии аутентификации пользователя и передачи его ISteamUser::BeginAuthSession нужно воспользоваться ISteamUser::UserHasLicenseForApp, чтобы определить, владеет ли пользователь определённым дополнительным контентом.

Внутренний сервер

Внимание: этот метод аутентификации пользователя не может использоваться в играх с Античитом Valve.

Билеты сессии аутентификации и веб-API Steamworks

Аутентификация пользователя

Инструкции ниже демонстрируют, как использовать билеты сессии аутентификации для подтверждения личности пользователя, когда его игровой клиент подключён к защищённому серверу:
  • Клиент должен возвратить билет сессии аутентификации, вызвав ISteamUser::GetAuthSessionTicket.
  • Чтобы гарантировать действительность билета, клиент должен дождаться обратного вызова ISteamUser::GetAuthSessionTicketResponse_t.
  • Клиент должен отправить свой билет сессии на защищённый сервер.
  • Защищённый сервер должен сделать HTTPS запрос к api.steampowered.com и вызвать сетевой способ аутентификации ISteamUserAuth/AuthenticateUserTicket, передав билет сессии аутентификации пользователя в виде строки в формате UTF-8 в шестнадцатеричной кодировке. Пожалуйста, заметьте, что данный способ требует наличия веб-API-ключа издателя, связанного с номером продукта предоставленного билета.
  • Если билет пользователя действителен, ISteamUserAuth/AuthenticateUserTicket вернёт 64-битный SteamID пользователя.

Подтверждение владения

После того, как личность пользователя была подтверждена, защищённый сервер может воспользоваться методом WebAPI ISteamUser/CheckAppOwnership, чтобы проверить, владеет ли пользователь номером определённого продукта, или вызвать ISteamUser/GetPublisherAppOwnership, чтобы возвратить список всех номеров продуктов, которыми владеет пользователь, связанных с предоставленным ключом издателя.

Зашифрованные билеты приложений

Аутентификация пользователя

Инструкции ниже демонстрируют, как использовать зашифрованные билеты приложений для подтверждения личности пользователя, когда его игровой клиент подключён к защищённому серверу:

Пример внедрения можно найти в проекте Приложение-образец с API Steamworks (SpaceWar) в SDK. Обратите особое внимание на функции CSpaceWarClient::RetrieveEncryptedAppTicket и CSpaceWarClient::OnRequestEncryptedAppTicket.

Подтверждение владения

Steam создаст зашифрованные билеты приложений только для пользователей, которые владеют номером продукта, для которого был создан билет. После расшифровки зашифрованного билета приложения защищённый сервер может воспользоваться SteamEncryptedAppTicket::BIsTicketForApp, чтобы проверить, соответствует ли номер продукта билета номеру приложения. Сервер может использовать SteamEncryptedAppTicket::BUserOwnsAppInTicket, чтобы определить, имеется ли у пользователя определённый Дополнительный контент (DLC).

Аутентификация с OpenID при использовании веб-браузера

Steam предоставляет OpenID. Эта информация указана в характеристиках версии 2.0 OpenID. Сторонний веб-сайт внутри веб-браузера использует OpenID, чтобы получить SteamID пользователя, который можно ввести в качестве учётных данных аккаунта для стороннего веб-сайта или привязать к существующему аккаунту на этом веб-сайте.

В начале процесса пользователь находится на стороннем сайте в веб-браузере. Когда ему необходимо войти в свой аккаунт или привязать его к веб-сайту, пользователь перенаправляется на страницу с формой входа на веб-сайте сообщества Steam. После ввода данных для входа в Steam веб-браузер пользователя автоматически перенаправляется обратно на сторонний веб-сайт с дополнительными данными OpenID, добавленными к возвращённой ссылке. Библиотека OpenID сайта может затем использовать эти данные для проверки и получения SteamID пользователя.

Steam предоставляет следующие изображения, которые используются сторонними сайтами в привязке к Steam на странице:
sits_large_border.png

sits_large_noborder.png

sits_small.png

Аутентификация пользователя

Реализацию версии 2.0 OpenID Steam можно использовать для привязки аккаунта пользователя Steam к его аккаунту на стороннем веб-сайте.
Список открытых библиотек OpenID можно найти на веб-сайте OpenID. Для того, чтобы использовать OpenID для проверки личности пользователя:
  • Настройте библиотеку OpenID на использование следующей ссылки в качестве ссылки конечной точки провайдера Steam: https://steamcommunity.com/openid/
  • После успешной аутентификации затребованный пользователем ID будет содержать его SteamID. Формат затребованного ID Steam: http://steamcommunity.com/openid/id/<steamid>.

Подтверждение владения

После того, как личность пользователя была подтверждена, защищённый сервер может воспользоваться методом WebAPI ISteamUser/CheckAppOwnership, чтобы проверить, владеет ли пользователь номером определённого продукта, или вызвать ISteamUser/GetPublisherAppOwnership, чтобы возвратить список всех номеров продуктов, которыми владеет пользователь, связанных с предоставленным WebAPI-ключом издателя.

Примеры

Привязка сторонних аккаунтов к аккаунтам Steam

Сторонние аккаунты можно привязать к аккаунтам Steam, связав SteamID пользователя со сторонним аккаунтом.

SteamID пользователя можно получить либо в игре, либо через веб-браузер. После успешной исходной привязки вы можете разрешить доступ стороннему аккаунту лишь посредством подтверждения пользовательского SteamID. Это исключает необходимость вторичного входа в системы сторонних аккаунтов для пользователей Steam. Кроме того, если новые сторонние аккаунты можно автоматически создавать и привязывать к SteamID, пользователю Steam не нужно беспокоиться о вторичной аутентификации. Взамен, один аккаунт Steam может предоставить доступ ко всем играм, оптимизируя действия пользователей и устраняя потенциальные проблемы с установкой и опробованием новых игр.

Привязка в игре

Билеты сессии аутентификации можно использовать для подтверждения личности пользователя, когда игровой клиент подключён к защищённому внутреннему серверу, используя WebAPI Steamworks:
  • Клиент должен возвратить билет сессии аутентификации, вызвав ISteamUser::GetAuthSessionTicket.
  • Чтобы гарантировать действительность билета, клиент должен дождаться обратного вызова ISteamUser::GetAuthSessionTicketResponse_t.
  • Клиент должен отправить свой билет сессии на защищённый сервер.
  • Защищённый сервер должен сделать HTTPS запрос к api.steampowered.com и вызвать сетевой способ аутентификации ISteamUserAuth/AuthenticateUserTicket, передав билет сессии аутентификации пользователя в виде строки в формате UTF-8 в шестнадцатеричной кодировке. Пожалуйста, заметьте, что данный способ требует наличия веб-API-ключа издателя, связанного с номером продукта предоставленного билета.
  • Если билет пользователя действителен, ISteamUserAuth/AuthenticateUserTicket вернёт 64-битный SteamID пользователя.

Привязка в веб-браузере

Steam поддерживает версию 2.0 OpenID, чтобы вы смогли разрешить пользователям войти в свой аккаунт Steam с вашего веб-сайта и возвратить свой SteamID. Чтобы узнать больше об использовании OpenID со Steam, перейдите на страницу использования OpenID

Подтверждение владения

После того, как личность пользователя была подтверждена, защищённый сервер может воспользоваться методом WebAPI ISteamUser/CheckAppOwnership, чтобы проверить, владеет ли пользователь номером определённого продукта, или вызвать ISteamUser/GetPublisherAppOwnership, чтобы возвратить список всех номеров продуктов, которыми владеет пользователь, связанных с предоставленным WebAPI-ключом издателя.

Переход от сторонних цифровых ключей к встроенным в Steam проверкам владения

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

Доступ к закрытому форуму

Пользователям потребуется входить напрямую с помощью аккаунта Steam, используя OpenID. OpenID вернёт 64-битный SteamID пользователя, который затем можно использовать с ISteamUser/CheckAppOwnership, чтобы проверить, владеет ли пользователь вашим приложением. Дополнительную информацию см. выше в разделе «Привязка сторонних аккаунтов к аккаунтам Steam».

Разблокирование сторонней сборки игры, не имеющей защиты DRM

Используйте OpenID и ISteamUser/CheckAppOwnership, (в документации выше), чтобы разблокировать контент на своём сайте. Также вы можете загрузить сборку без защиты DRM в качестве необязательного бесплатного доп. контента.

Программа продаётся на собственном сайте разработчика, и требуется ключ для её разблокирования

Пользователям потребуется входить напрямую с помощью аккаунта Steam, используя OpenID. OpenID вернёт 64-битный SteamID пользователя, который затем можно использовать с ISteamUser/CheckAppOwnership, чтобы проверить, владеет ли пользователь вашим приложением. Дополнительную информацию см. в разделе Привязка сторонних аккаунтов к аккаунтам Steam выше.

Выдача внутриигровых предметов за регистрацию вашего стороннего ключа

Если вы используете службу инвентаря Steam, удостоверьтесь, что определение предмета верно настроено как промо-предмет, и совершите вызов ISteamInventory::AddPromoItem из клиента.
Если у вас есть собственный внутренний сервер приложения, вызовите ISteamUser::GetAuthSessionTicket из игрового клиента, а затем используйте ISteamUserAuth/AuthenticateUserTicket вместе с ISteamUser/CheckAppOwnership для проверки владения. Дополнительная информация...

Ключ контролирует, какая из версий программы будет разблокирована

Каждая версия вашей игры должна иметь свой собственный номер приложения (AppID). Вызовите ISteamUser::GetAuthSessionTicket из игрового клиента, а затем используйте ISteamUserAuth/AuthenticateUserTicket с ISteamUser/CheckAppOwnership для проверки владения. Дополнительная информация...