Steamworks 文獻庫
使用者驗證與所有權

概覽

Steamworks 提供多個方法(Method),用於確認 Steam 使用者的身份並驗證應用程式的所有權。 本文將說明不同狀況下採用的各種驗證方法。

在 Steam 中驗證使用者

每位 Steam 使用者都能透過獨特的 64 位元數字 ID(又稱使用者的 Steam ID)進行驗證。 在 Steamworks C++ API 中,使用者的 SteamID 包含在 CSteamID 物件中。 您可以呼叫 ISteamUser::GetSteamID 獲取目前使用者的 Steam ID,然後對傳回值呼叫 CSteamID.ConvertToUint64() 獲取其 64 位元 ID。

以下驗證方法可安全驗證使用者的 Steam ID。

本文涉及的 API

工作階段票證

工作階段票證是簽名的票證,可用於在使用者遊戲用戶端與任何數量的其他遊戲用戶端之間(如 P2P 多人遊戲工作階段),或者與偵聽伺服器或專屬伺服器之間(透過 ISteamGameServer API),驗證使用者身份。 這些票證也可以用於驗證當下的遊戲與相關可下載內容的所有權,決定使用者是否遭受 VAC 封鎖(詳細解說請見 Valve 防作弊機制 (VAC) 與遊戲封鎖)。
工作階段票證也可以透過 Steamworks Web API,在遊戲用戶端與受防護的後端伺服器之間驗證使用者身份。 前提是該安全伺服器必須能夠向 partner.steam-api.com 發送 HTTPS 要求。

加密的應用程式票證

加密的應用程式票證能在遊戲用戶端與受防護的後端伺服器之間驗證使用者身份。 與工作階段票證不同,驗證加密的應用程式票證[b"]不需要[/b"]安全伺服器發送 HTTPS 要求。 安全伺服器使用一個 C++ 程式庫與一個私有的對稱金鑰來驗證票證。 Steamworks SDK 的 public/steam/lib 目錄即包含此程式庫 Windows 和 Linux 的 32 和 64 位元版本。

在使用加密的應用程式票證前,您必須為每一款作品產生私密金鑰。 進入您應用程式的「編輯 Steamworks 設定」,點選「安全性」下拉選單中的「SDK 授權」即可產生金鑰。 這個金鑰將與您作品的 AppID,以及作品的任何可下載內容關聯。 使用者必須擁有該應用程式的「管理簽章」權限方能進入上述的 Steamworks 區塊。
注意:請將這些金鑰儲存於安全之處,並且切勿以任何方式在應用程式中分發出去!

Steamworks Web API

Steam 有以 HTTP 為基礎的公開 Web API,可以用來存取多項 Steamworks 功能。 任何能夠發出 HTTP 請求的應用程式,如遊戲用戶端或伺服器,都可以使用 API 中的公開方法(Method)。 另外,API 中也有受保護的方法,使用時需要認證,也必須從受信任的後端應用程式存取。 更多有關 Web API 的詳情請見此處

P2P 或遊戲伺服器

工作階段票證

使用者驗證

以下為在使用者的遊戲用戶端(用戶端 A),與另一個用戶端或遊戲伺服器(用戶端 B)間,使用工作階段票證來驗證使用者身分的詳細步驟說明:

一些有關工作階段票證的重要注意事項如下:

所有權驗證

使用工作階段票證時,Steam 將自動驗證目前 AppID 的所有權。 如果使用者並未擁有目前的 AppID,那麼 ISteamUser::ValidateAuthTicketResponse_tm_eAuthSessionResponse 欄位就會被設為 k_EAuthSessionResponseNoLicenseOrExpired。 收到使用者的工作階段票證,並傳入 ISteamUser::BeginAuthSession 後,就可以使用 ISteamUser::UserHasLicenseForApp 來確認使用者是否擁有某些特定的可下載內容。

後端伺服器

工作階段票證與 Steamworks Web API

使用者驗證

以下為在使用者的遊戲用戶端,與安全伺服器間,使用工作階段票證來驗證使用者身分的詳細步驟說明:

所有權驗證

驗證使用者身分後,安全伺服器可以使用 ISteamUser/CheckAppOwnership Web API 方法來檢查使用者是否擁有特定的 AppID,或呼叫 ISteamUser/GetPublisherAppOwnership 來獲取使用者擁有的所有與發行商金鑰關聯的 AppID。

加密的應用程式票證

使用者驗證

以下為在使用者的遊戲用戶端,與安全伺服器間,使用加密的應用程式票證來驗證使用者身分的詳細步驟說明:

SDK 中的 Steamworks API Example Application (SpaceWar)專案即有實作範例。 具體範例請見 CSpaceWarClient::RetrieveEncryptedAppTicketCSpaceWarClient::OnRequestEncryptedAppTicket

所有權驗證

Steam 只會在使用者擁有要建立票證的 AppID 的情況下,才會建立加密應用程式票證。 將加密的應用程式票證解密後,安全伺服器可以使用 SteamEncryptedAppTicket::BIsTicketForApp 來驗證票證的 AppID 是否與作品的 AppID 相符, 也可以使用 SteamEncryptedAppTicket::BUserOwnsAppInTicket 來判斷使用者是否擁有某特定的可下載內容(DLC)

基於網頁瀏覽器的 OpenID 驗證

Steam 是一個符合 OpenID 2.0 規範的 OpenID 提供者。 在網頁瀏覽器中,第三方網站可以使用 OpenID 取得使用者的 SteamID,用作第三方網站的登入憑證,或連結至該網站的既有帳戶。

使用 OpenID 時,使用者會在網路瀏覽器中,從第三方網站開始。 當使用者希望以 OpenID 來登入或連結至自己在該網站的帳戶時,網站會將使用者引導至 Steam 社群網站的登入表單。 使用者輸入 Steam 登入憑證後,網路瀏覽器就會自動重新導向至第三方網站,並在傳回的網址中額外附加一些特定的 OpenID 資料。 接著,該網站的 OpenID 程式庫就能用這些資料來驗證並取得使用者的 SteamID。

Steam 提供以下圖像,讓第三方網站在連結 Steam 登入頁面時使用:
sits_large_border.png

sits_large_noborder.png

sits_small.png

使用者驗證

Steam 實作出的 OpenID 2.0 可以將使用者的 Steam 帳戶與第三方網站的帳戶連結。
開源的 OpenID 程式庫列表請見 OpenID 的網站。 要使用 OpenID 來驗證使用者的身分:
  • 設定您的 OpenID 程式庫,使用以下 URL 為 Steam 的 OP 端點 URL: https://steamcommunity.com/openid/
  • 使用者經過驗證後,使用者的 Claimed ID 將包含其 Steam ID。 Steam Claimed ID 格式為:http://steamcommunity.com/openid/id/<steamid>

所有權驗證

驗證使用者身分後,安全伺服器可以使用 ISteamUser/CheckAppOwnership Web API 方法來檢查使用者是否擁有特定的 AppID,或呼叫 ISteamUser/GetPublisherAppOwnership 來獲取使用者擁有的所有與 Web API 發行商金鑰關聯的 AppID。

範例

將第三方帳戶連結至 Steam 帳戶

將使用者的 SteamID 與第三方帳戶關聯,即可將第三方帳戶連結至 Steam 帳戶。

遊戲內或網頁瀏覽器中皆可安全地擷取使用者的 SteamID ,而在完成初始的關聯後,您只要驗證使用者的 SteamID,就能安全地給出第三方帳戶的使用權限。 如此一來,Steam 使用者就不需要二次登入任何第三方帳戶系統。 此外,若遇到新的 SteamID 時系統即會自動建立並連結新的第三方帳戶,那麼 Steam 使用者就根本不需要知道正在進行二次驗證。 而他們單一一個 Steam 帳戶就可以授予他們所有遊戲的存取權限,從而讓使用者體驗更為流暢,並消除了安裝和嘗試新遊戲的潛在障礙。

從遊戲內連結

透過 Steamworks Web API,工作階段票證可以用來在遊戲用戶端和安全的後端伺服器之間驗證使用者的身分:

從網頁瀏覽器連結

Steam 支援 OpenID 2.0 規範,讓使用者能夠安全地從您的網站登入他們的 Steam 帳戶,並擷取他們的 SteamID。 有關如何在 Steam 使用 OpenID 的詳情,請至使用 OpenID

所有權驗證

驗證使用者身分後,安全伺服器可以使用 ISteamUser/CheckAppOwnership Web API 方法來檢查使用者是否擁有特定的 AppID,或呼叫 ISteamUser/GetPublisherAppOwnership 來獲取使用者擁有的所有與 Web API 發行商金鑰關聯的 AppID。

從第三方產品序號遷移至原生 Steam 所有權檢查

Steam 本身提供多種方法讓產品用來驗證使用者,無需使用第三方產品序號。 我們整理了一份產品序號的常見使用案例列表,以及如何在 Steam 中以原生方式實作每個案例:

存取私人論壇

最好讓使用者透過 OpenID 直接登入他們的 Steam 帳戶。 OpenID 將回傳使用者的 64 位元 SteamID,然後將其用於 ISteamUser/CheckAppOwnership 即可驗證使用者是否擁有您的 AppID。 進一步詳情請見上文的將第三方帳戶連結至 Steam 帳戶

解鎖非 Steam、無 DRM 組建的遊戲

使用 OpenID 和 ISteamUser/CheckAppOwnership見上文)來解鎖您自己網站上的內容。 或著,您可以上傳無 DRM 的組建,作為可選用的免費 DLC。

軟體可使用序號解鎖,於我自己的網站上出售

最好讓使用者透過 OpenID 直接登入他們的 Steam 帳戶。 OpenID 將回傳使用者的 64 位元 SteamID,然後將其用於 ISteamUser/CheckAppOwnership 即可驗證使用者是否擁有您的 AppID。 進一步詳情請見上文的將第三方帳戶連結至 Steam 帳戶

為註冊您的第三方序號掉落遊戲內物品

如果您有使用 Steam 物品庫服務,請確定物品的物品定義有正確設定為促銷物品,並從用戶端呼叫 ISteamInventory::AddPromoItem
如果您有自己的後端,您可以從遊戲用戶端呼叫 ISteamUser::GetAuthSessionTicket,然後使用 ISteamUserAuth/AuthenticateUserTicketISteamUser/CheckAppOwnership 來驗證所有權。 更多資訊……

序號控制將解鎖軟體的哪個版本

您遊戲的每個版本應有各自的 AppID。 從遊戲用戶端呼叫 ISteamUser::GetAuthSessionTicket,然後使用 ISteamUserAuth/AuthenticateUserTicketISteamUser/CheckAppOwnership 來驗證所有權。 更多資訊……