Документація Steamworks
Автентифікація користувачів і стан власності

Огляд

Steamworks має низку способів для перевірки особистості користувача Steam і його володіння застосунком. Цей документ описує кожен із цих способів автентифікації:

Ідентифікація користувача в Steam

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

Наступні методи автентифікації можуть використовуватися як безпечне підтвердження SteamID користувача.

Усі API, описані в цьому документі

Квитки сеансу

Квитки сеансу — це підписані квитки, які використовуються для перевірки особистості користувача, коли його ігровий клієнт підключений до будь-якої кількості інших ігрових клієнтів (наприклад у багатокористувацькому сеансі «один до одного») або до сприймального/виділеного ігрового сервера (за допомогою API ISteamGameServer). Ці квитки можна використовувати для підтвердження володіння грою й пов’язаним додатковим вмістом, а також для того, щоби перевірити наявність у користувача блокування VAC (див. Античіт Valve (VAC) та ігрові блокування).
Квитки сеансу можна використовувати для підтвердження особистості користувача, коли клієнт підключений до захищеного внутрішнього сервера, за допомогою веб-API Steamworks. Необхідно, щоби захищений сервер міг робити HTTPS-запити до partner.steam-api.com.

Зашифровані квитки застосунку

Зашифровані квитки застосунку можна використовувати для перевірки особистості користувача між ігровим клієнтом і захищеним внутрішнім сервером. На відміну від квитків сеансу, перевірка зашифрованих квитків застосунку не вимагає від захищеного сервера HTTPS-запитів. Натомість для перевірки квитка захищеним сервером використовується бібліотека C++ і приватний симетричний ключ. SDK Steamworks містить 32-бітну і 64-бітну версію цієї бібліотеки для Windows і Linux у теці public/steam/lib.

Перед використанням зашифрованих квитків застосунків потрібно згенерувати приватний ключ для кожного продукту. Це можна зробити на сторінці редагування налаштувань Steamworks для свого застосунку, якщо обрати «Авторизація SDK» із розкривного списку «Безпека». Ключ буде пов’язаний із AppID вашого продукту і всім завантажуваним вмістом до нього. Для доступу до цього розділу Steamworks користувач повинен мати дозвіл «Управління підписами» для відповідного продукту.
ПРИМІТКА: ці ключі потрібно надійно зберігати, їх не можна жодним чином розповсюджувати через ваш застосунок!

Веб-API Steamworks

Steam має вбудовний веб-API на основі HTTP, котрий можна використовувати для доступу до багатьох функцій Steamworks. API містить публічні методи, доступ до яких може отримати будь-який застосунок, що може надіслати HTTP-запит, як-от ігровий клієнт чи сервер. API також містить захищені методи, які потребують автентифікації. Доступ до них можуть отримати довірені серверні застосунки. Більше подробиць про веб-API можна знайти ось тут.

P2P або ігрові сервери

Квитки сеансу

Автентифікація користувача

Кроки нижче описують, як використовувати квитки сеансу для перевірки особистості користувача між користувацьким ігровим клієнтом (клієнт A) та іншим клієнтом або ігровим сервером (клієнт B):
  • Клієнт A повинен отримати квиток сеансу через виклик ISteamUser::GetAuthSessionTicket.
  • Клієнт A повинен надіслати свій квиток сеансу до клієнта B.
  • Клієнт B повинен передати квиток сеансу клієнта A до ISteamUser::BeginAuthSession, котрий здійснить швидку перевірку даних. Якщо квиток дійсний, то ISteamUser::BeginAuthSession передасть квиток далі на сервер Steam для перевірки, що квиток не використаний повторно й був виданий власником акаунта клієнта A. Результат цього підтвердження буде повернено у зворотному виклику ISteamUser::ValidateAuthTicketResponse_t.
  • Коли багатокористувацький сеанс закінчиться:

Кілька важливих приміток про квитки сеансу:
  • Квитки сеансу можна використовувати лише один раз. ISteamUser::GetAuthSessionTicket необхідно викликати для кожного клієнта в багатокористувацькому сеансі, котрий запитає квиток.
  • Якщо квиток використовується для автентифікації користувачів у багатокористувацькому сеансі «один до одного», то кожен ігровий клієнт має перевірити чинність кожного іншого ігрового клієнта в цьому багатокористувацькому сеансі.
  • Після завершення з квитком сеансу необхідно викликати ISteamUser::CancelAuthTicket для кожного дескриптора, що повертається від ISteamUser::GetAuthSessionTicket.
  • Коли клієнт A викликає ISteamUser::CancelAuthTicket, клієнт B отримує зворотний виклик ISteamUser::ValidateAuthTicketResponse_t з інформацією, що квиток клієнта A більше не дійсний.
  • Коли клієнт A покидає гру з клієнтом B, якщо виклик ISteamUser::CancelAuthTicket клієнтом A буде оброблено до виклику клієнтом B функції ISteamUser::EndAuthSession, то клієнт B може отримати зворотний виклик ISteamUser::ValidateAuthTicketResponse_t із повідомленням, що квиток було скасовано. Оскільки існує взаємна угода, що клієнт A залишає сеанс, то зворотний виклик буде проігноровано.
  • Стан мережі може завадити серверу Steam надати вчасний зворотний виклик стороні, що викликала ISteamUser::BeginAuthSession. Сторона, що викликала ISteamUser::BeginAuthSession (клієнт B), не повинна вважати, що має дійсну інформацію про клієнта A до отримання зворотного виклику, однак повинна дозволити продовження сеансу багатокористувацької гри.
  • Якщо сторона, що викликала ISteamUser::BeginAuthSession, отримує зворотний виклик ISteamUser::ValidateAuthTicketResponse_t із повідомленням про недійсність квитка клієнта A, то сторона виклику повинна відмовитися від продовження сеансу багатокористувацької гри з клієнтом A. Якщо інші учасники гри не відмовляться грати з клієнтом A, то сторона виклику повинна залишити сеанс.
  • ISteamGameServer надає методи квитків сеансу для здійснення автентифікації між ігровим клієнтом та ігровим сервером.

Перевірка володіння

Під час використання квитків сеансу Steam автоматично перевіряє право власності на поточний AppID. Якщо користувач не володіє поточним AppID, то поле m_eAuthSessionResponse у ISteamUser::ValidateAuthTicketResponse_t буде встановлено як k_EAuthSessionResponseNoLicenseOrExpired. Після отримання користувацького квитка сеансу й передачі його ISteamUser::BeginAuthSession слід скористатися ISteamUser::UserHasLicenseForApp для визначення, чи володіє користувач певним завантажуваним вмістом.

Внутрішній сервер

Квитки сеансу й веб-API Steamworks

Автентифікація користувача

Кроки нижче описують, як використовувати квитки сеансу для перевірки особистості користувача між користувацьким ігровим клієнтом та ігровим сервером:
  • Клієнт повинен отримати квиток сеансу через виклик ISteamUser::GetAuthSessionTicket.
  • Для гарантування дійсності квитка клієнт повинен зачекати на зворотний виклик ISteamUser::GetAuthSessionTicketResponse_t.
  • Клієнт повинен надіслати свій квиток сеансу на захищений сервер.
  • Захищений сервер повинен зробити HTTPS-запит до partner.steam-api.com і викликати веб-метод ISteamUserAuth/AuthenticateUserTicket шляхом передачі квитка сеансу користувача у вигляді рядку у форматі UTF-8 шістнадцяткового кодування. Майте на увазі, що цей метод потребує ключ веб-API Steam або ключ видавця веб-API, пов’язаний із AppID, для передачі квитка. Подальші оновлення цього API повертатимуть більше інформацію стороні запиту, якщо надано ключ веб-API видавця.
  • Якщо квиток користувача дійсний, то ISteamUserAuth/AuthenticateUserTicket поверне 64-бітний SteamID користувача.

Перевірка володіння

Після перевірки особистості користувача захищений сервер може скористатися методом веб-API ISteamUser/CheckAppOwnership для перевірки володіння користувачем вказаного AppID або може викликати ISteamUser/GetPublisherAppOwnership для отримання списку всіх AppID у володінні користувача, які пов’язані із наданим ключем видавця.

Зашифровані квитки застосунку

Автентифікація користувача

Кроки нижче описують, як використовувати зашифровані квитки застосунку для перевірки особистості користувача між користувацьким ігровим клієнтом та ігровим сервером:

Приклади впровадження можна знайти в проекті-прикладі SDK. Особливо CSpaceWarClient::RetrieveEncryptedAppTicket і CSpaceWarClient::OnRequestEncryptedAppTicket.

Перевірка володіння

Steam створюватиме зашифровані квитки застосунків лише для користувачів, які володіють AppID застосунку, для якого створюється квиток. Після розшифрування зашифрованого квитка застосунку захищений сервер може скористатися SteamEncryptedAppTicket::BIsTicketForApp для перевірки збігу AppID квитка й AppID продукту. Сервер також може скористатися SteamEncryptedAppTicket::BUserOwnsAppInTicket для визначення володіння користувачем певним елементом завантажуваного вмісту.

Автентифікація з OpenID за допомогою веб-оглядача

Steam є провайдером OpenID, що описано в специфікації OpenID 2.0. Сторонній сайт може використовувати OpenID у веб-оглядачі для отримання користувацького SteamID, який можна використовувати для входу на сторонній сайт чи для прив’язування наявного акаунта до цього сайту.

Під час використання OpenID користувач розпочинає процес у веб-оглядачі на сторонньому сайті. Коли користувач бажає ввійти чи прив’язати свій акаунт до сайту за допомогою OpenID, цей сайт спрямує користувача до входу на сайті спільноти Steam. Коли користувач входить до свого акаунта Steam, то веб-оглядач автоматично переспрямовує його назад на сторонній сайт із деякими додатковими даними OpenID, долученими до URL. Бібліотека OpenID сайту може використовувати ці дані для перевірки й отримання SteamID користувача.

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

sits_large_noborder.png

sits_small.png

Автентифікація користувача

Впровадження OpenID 2.0 у Steam можна використовувати для прив’язування користувацьких акаунтів Steam до їхніх акаунтів на сторонньому сайті.
Перелік бібліотек OpenID із відкритим кодом можна знайти на сайті OpenID. Для використання OpenID з метою ідентифікації користувача:
  • Налаштуйте бібліотеку OpenID для використання наступного посилання як посилання кінцевої точки провайдера Steam: https://steamcommunity.com/openid/
  • Після автентифікації користувача отриманий користувачем ідентифікатор міститиме його SteamID. Формат отриманого ідентифікатора Steam: http://steamcommunity.com/openid/id/.

Перевірка володіння

Після перевірки особистості користувача захищений сервер може скористатися методом веб-API ISteamUser/CheckAppOwnership для перевірки володіння користувачем вказаного AppID або може викликати ISteamUser/GetPublisherAppOwnership для отримання списку всіх AppID у володінні користувача, які пов’язані із наданим ключем веб-API видавця.

Приклади

Прив’язування сторонніх акаунтів до акаунтів Steam

Сторонні акаунти можна прив’язати до акаунтів Steam шляхом пов’язування SteamID користувача зі стороннім акаунтом.

Користувацький SteamID можна безпечно отримати в грі або через веб-оглядач, і після встановлення початкового зв’язку ви можете безпечно дозволяти доступ стороннім акаунтам через перевірку SteamID користувача. Завдяки цьому користувачам Steam не потрібно додатково входити в сторонні акаунти. Також, якщо сторонні акаунти автоматично створюються і прив’язуються при вході нового SteamID, користувачам Steam не потрібно проходити додаткову автентифікацію. Їхній єдиний акаунт Steam дає доступ до всіх їхніх ігор, що покращує користувацький досвід й усуває потенційні бар’єри для інсталяції та перевірки нових ігор.

Прив’язування в грі

Квитки сеансу можна використовувати для перевірки особистості користувача між ігровим клієнтом і захищеним внутрішнім сервером за допомогою веб-API Steamworks:
  • Клієнт повинен отримати квиток сеансу через виклик ISteamUser::GetAuthSessionTicket.
  • Для гарантування дійсності квитка клієнт повинен зачекати на зворотний виклик ISteamUser::GetAuthSessionTicketResponse_t.
  • Клієнт повинен надіслати свій квиток сеансу на захищений сервер.
  • Захищений сервер повинен зробити HTTPS-запит до api.steampowered.com і викликати веб-метод ISteamUserAuth/AuthenticateUserTicket шляхом передачі квитка сеансу користувача у вигляді рядку у форматі UTF-8 шістнадцяткового кодування. Майте на увазі, що цей метод потребує ключ видавця веб-API, пов’язаний із AppID, для передачі квитка.
  • Якщо квиток користувача дійсний, то ISteamUserAuth/AuthenticateUserTicket поверне 64-бітний SteamID користувача.

Прив’язування у веб-оглядачі

Steam підтримує специфікацію OpenID 2.0, тож ви можете дозволити користувача безпечно входити до акаунтів Steam зі свого сайту й отримувати їхні SteamID. Докладніше про використання OpenID зі Steam читайте ось тут.

Перевірка володіння

Після перевірки особистості користувача захищений сервер може скористатися методом веб-API ISteamUser/CheckAppOwnership для перевірки володіння користувачем вказаного AppID або може викликати ISteamUser/GetPublisherAppOwnership для отримання списку всіх AppID у володінні користувача, які пов’язані із наданим ключем веб-API видавця.

Перехід від сторонніх цифрових ключів до вбудованих у Steam перевірок власності

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

Доступ до закритого форуму

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

Розблокування сторонньої збірки гри без DRM

Використовуйте OpenID і ISteamUser/CheckAppOwnership (описано вище) для розблокування вмісту на вашому власному сайті. Також ви можете вивантажити збірку без DRM як необов’язковий безкоштовний завантажуваний вміст.

Програма продається на власному сайті й розблоковується ключем

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

Видача внутрішньоігрових предметів для реєстрації вашого стороннього ключа

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

Ключ контролює, яка версія програми розблокована

Кожна версія вашої гри повинна мати власний AppID. У клієнті гри викличте ISteamUser::GetAuthSessionTicket, а потім скористайтеся ISteamUserAuth/AuthenticateUserTicket з ISteamUser/CheckAppOwnership для перевірки власності. Докладніша інформація.