Документація 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::GetAuthTicketForWebApi.
  • Для гарантування дійсності квитка клієнт повинен зачекати на зворотний виклик ISteamUser::GetTicketForWebApiResponse_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/<steamid>.

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

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

Приклади

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

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

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

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

Квитки сеансу можна використовувати для перевірки особи користувача між ігровим клієнтом і захищеним внутрішнім сервером за допомогою веб-API Steamworks:
  • Клієнт повинен отримати квиток сеансу через виклик ISteamUser::GetAuthTicketForWebApi.
  • Для гарантування дійсності квитка клієнт повинен зачекати на зворотний виклик ISteamUser::GetTicketForWebApiResponse_t.
  • Клієнт повинен надіслати свій квиток сеансу на захищений сервер.
  • Захищений сервер повинен зробити HTTPS-запит до api.steampowered.com і викликати веб-метод ISteamUserAuth/AuthenticateUserTicket шляхом передачі квитка сеансу користувача у вигляді рядку у форматі UTF-8 шістнадцяткового кодування. Майте на увазі, що для цього методу потрібен пов’язаний з AppID ключ видавця веб-API для наданого квитка.
  • Якщо квиток користувача дійсний, то 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 для перевірки володіння. Докладніша інформація.