Документация 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-запросы к partner.steam-api.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, чтобы определить, владеет ли пользователь определённым дополнительным контентом.

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

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

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

The following steps detail how to use Session Tickets to verify a user's identity between the user's game client and a secure server:
  • Клиент должен возвратить билет сессии аутентификации, вызвав ISteamUser::GetAuthSessionTicket.
  • Чтобы гарантировать действительность билета, клиент должен дождаться обратного вызова ISteamUser::GetAuthSessionTicketResponse_t.
  • Клиент должен отправить свой билет сессии на защищённый сервер.
  • Защищённый сервер должен сделать HTTPS-запрос к partner.steam-api.com и вызвать сетевой способ аутентификации ISteamUserAuth/AuthenticateUserTicket, передав билет сессии аутентификации пользователя в виде строки в формате UTF-8 в шестнадцатеричной кодировке. Обратите внимание, что для данного способа требуется ключ веб-API Steam или ключ веб-API издателя, связанный с номером приложения, чтобы запрос был передан. Дальнейшие обновления этого API будут возвращать больше информации запросившей стороне, если предоставлен ключ веб-API издателя.
  • Если билет пользователя действителен, ISteamUserAuth/AuthenticateUserTicket вернёт 64-битный SteamID пользователя.

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

Once a user's identity has been verified, a secure server can use the ISteamUser/CheckAppOwnership Web API method to check if the user owns a particular AppID, or call ISteamUser/GetPublisherAppOwnership to retrieve a list of all user owned AppIDs that are associated with the provided Publisher Key.

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

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

The following steps detail how to use Encrypted Application Tickets to verify a user's identity between the user's game client and a secure server:

An example implementation can be found in the Приложение-образец с API Steamworks (SpaceWar) project in the SDK. Specifically CSpaceWarClient::RetrieveEncryptedAppTicket and CSpaceWarClient::OnRequestEncryptedAppTicket.

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

Steam will only create Encrypted Application Tickets for users who own the AppID for which the ticket was created. After decrypting an Encrypted Application Ticket, the secure server can use SteamEncryptedAppTicket::BIsTicketForApp to verify the AppID of the ticket matches the title's AppID. The server can also use SteamEncryptedAppTicket::BUserOwnsAppInTicket to determine if the user owns a specific piece of Дополнительный контент (DLC).

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

Steam is an OpenID Provider, as described in the OpenID 2.0 specification. Inside a web browser, a third-party website can use OpenID to obtain a user's SteamID which can be used as the login credentials for the 3rd party website, or linked to an existing account on that website.

When using OpenID, the user begins in a web browser at the third-party website. When the user wishes to login/link their account to that website, using OpenID, the site directs the user to a login form on the Steam Community website. Once the user has entered their Steam login credentials, the user's web browser is automatically redirected back to the 3rd party website with some additional OpenID specific data appended to the return URL. The site's OpenID library can then use this data to verify and obtain the user's SteamID.

Steam provides the following images which may be used by 3rd party sites when linking to the Steam sign in page:
sits_large_border.png

sits_large_noborder.png

sits_small.png

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

Steam's OpenID 2.0 implementation can be used to link a users Steam account to their account on the third-party website.
A list of open source OpenID libraries can be found at the OpenID website. To use OpenID to verify a user's identity:
  • Настройте библиотеку OpenID на использование следующей ссылки в качестве ссылки конечной точки провайдера Steam: https://steamcommunity.com/openid/
  • После успешной аутентификации затребованный пользователем ID будет содержать его SteamID. Формат затребованного ID Steam: http://steamcommunity.com/openid/id/<steamid>.

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

Once a user's identity has been verified, a secure server can use the ISteamUser/CheckAppOwnership Web API method to check if the user owns a particular AppID, or call ISteamUser/GetPublisherAppOwnership to retrieve a list of all user owned AppIDs that are associated with the provided Web API Publisher Key.

Примеры

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

Third-party accounts can be linked to Steam accounts by associating a user's SteamID with the 3rd party account.

A user's SteamID can be securely retrieved either in-game or through a web browser and once the initial association has occurred, you can safely allow access to the 3rd party account by merely verifying a user's SteamID. This eliminates the need for Steam users to do any sort of secondary login to 3rd party account systems. Additionally, if new 3rd party accounts can be automatically created and linked when a new SteamID is encountered, the Steam user will never have to be aware that a secondary authentication is taking place at all. Instead, their single Steam account can grant access to all of their games, streamlining the user experience and removing potential barriers to installing and trying new games.

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

Session Tickets can be used to verify a user's identity between a game client and a secure, backend server using the Steamworks Web API:
  • Клиент должен возвратить билет сессии аутентификации, вызвав ISteamUser::GetAuthSessionTicket.
  • Чтобы гарантировать действительность билета, клиент должен дождаться обратного вызова ISteamUser::GetAuthSessionTicketResponse_t.
  • Клиент должен отправить свой билет сессии на защищённый сервер.
  • Защищённый сервер должен сделать HTTPS запрос к api.steampowered.com и вызвать сетевой способ аутентификации ISteamUserAuth/AuthenticateUserTicket, передав билет сессии аутентификации пользователя в виде строки в формате UTF-8 в шестнадцатеричной кодировке. Пожалуйста, заметьте, что данный способ требует наличия веб-API-ключа издателя, связанного с номером продукта предоставленного билета.
  • Если билет пользователя действителен, ISteamUserAuth/AuthenticateUserTicket вернёт 64-битный SteamID пользователя.

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

Steam supports the OpenID 2.0 specification so that you can allow users to securly log into their Steam accounts from your website and retrieve their SteamID. For details on how to use OpenID with Steam go to Using OpenID

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

Once a user's identity has been verified, a secure server can use the ISteamUser/CheckAppOwnership Web API method to check if the user owns a particular AppID, or call ISteamUser/GetPublisherAppOwnership to retrieve a list of all user owned AppIDs that are associated with the provided Web API Publisher Key.

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

Steam itself has a number of ways a title can authenticate a user with, removing the need for a third-party CD key. We've compiled a list of common use cases for CD Keys and how you might implement each case natively with Steam:

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

You'll want to have users login directly with their Steam account using OpenID. OpenID will return the user's 64bit SteamID which can then be used with ISteamUser/CheckAppOwnership to verify the user owns your appid. More details can be found above at Linking 3rd party accounts to Steam accounts.

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

Use OpenID and ISteamUser/CheckAppOwnership (documented above) to unlock the content on your own site. Alternatively, you could upload the DRM-free build as optional, free DLC.

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

You'll want to have users login directly with their Steam account using OpenID. OpenID will return the user's 64bit SteamID which can then be used with ISteamUser/CheckAppOwnership to verify the user owns your appid. More details can be found in Привязка сторонних аккаунтов к аккаунтам Steam above.

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

If you are using the Steam Inventory Service, make sure the item's itemdef is configured correctly as a promo item and call ISteamInventory::AddPromoItem from the client.
If you have your own item backend, you can call ISteamUser::GetAuthSessionTicket from the game client and then use ISteamUserAuth/AuthenticateUserTicket with ISteamUser/CheckAppOwnership to verify ownership. More Information...

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

Each version of your game should have its own AppID. From the game client, call ISteamUser::GetAuthSessionTicket and then use ISteamUserAuth/AuthenticateUserTicket with ISteamUser/CheckAppOwnership to verify ownership. More Information...