Огляд
Steamworks має низку способів для перевірки особи користувача Steam і чи володіє він застосунком. Цей документ описує кожен із цих способів автентифікації:
- Між ігровим клієнтом та іншими клієнтами (P2P) або ігровими серверами за допомогою квитків сеансу.
- Між ігровим клієнтом та внутрішнім сервером за допомогою:
- Підключення через браузер за допомогою OpenID і веб-API Steamworks
Ідентифікація користувача в 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):
Кілька важливих приміток про квитки сеансу:
- Квитки сеансу можна використовувати лише один раз. 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
Автентифікація користувача
Кроки нижче описують, як використовувати квитки сеансу для перевірки особи користувача між користувацьким ігровим клієнтом та ігровим сервером:
Перевірка володіння
Після перевірки особи користувача захищений сервер може скористатися методом веб-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:



Автентифікація користувача
Впровадження 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:
Прив’язування в браузері
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 для перевірки володіння.
Докладніша інформація.