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

英文原文已更新

本頁原文在翻譯完成後已再次更新。\r
點擊這裡檢視最新的英文版本。

概覽

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 要求。

加密的應用程式票證

加密的應用程式票證能在遊戲用戶端與受防護的後端伺服器之間驗證使用者身份。 與工作階段票證不同,驗證加密的應用程式票證不需要安全伺服器發送 HTTPS 要求。 安全伺服器使用一個 C++ 程式庫與一個私有的對稱金鑰來驗證票證。 Steamworks SDK 在 public/steam/lib 目錄下包含 Windows 和 Linux 程式庫的 32 位元與 64 位元版本。
使用加密的應用程式票證之前,您必須為各產品製作私有的金鑰。 在您應用程式的「編輯 Steamworks 設定」中,點選「安全性」下拉選單中的「SDK 授權」即可製作金鑰。 此金鑰將與您的產品的 AppID 及其任何可下載內容綁定。

備註:這些金鑰必須存放在安全的場所,絕不能以任何方式在您的應用程式中發放!

Steamworks Web API

Steam 開放了以 HTTP 為基礎、可用來存取 Steamworks 一系列功能的 Web API 供人使用。 此 API 包含公共方法,任何可以發出 HTTP 要求的應用程式(如遊戲用戶端或伺服器)皆能存取。 此 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 範例應用程式(SpaceWar) 專案中找到實作案例, 特別是 CSpaceWarClient::RetrieveEncryptedAppTicketCSpaceWarClient::OnRequestEncryptedAppTicket 的範例。

所有權驗證

Steam 只會為擁有 AppID 的使用者建立該應用程式的加密票證。 將加密的應用程式票證解密之後,安全伺服器可使用 SteamEncryptedAppTicket::BIsTicketForApp 驗證票證的 AppID 與產品的 AppID 是否相符。 伺服器還能夠使用 SteamEncryptedAppTicket::BUserOwnsAppInTicket 判定使用者是否擁有某個特定的可下載內容(DLC)

基於網頁瀏覽器的 OpenID 驗證

如 OpenID 2.0 規格所定義,Steam 為 OpenID 供應商。 在網路瀏覽器內,第三方網站能使用 OpenID 獲取使用者的 SteamID。該 SteamID 可用於第三方網站的登入憑證,或與該網站上的既有帳戶連結。

使用 OpenID 時,使用者透過第三方網站的網頁瀏覽器開始。 當使用者希望在該網站中登入帳戶或連至該網站時,網站將使用 OpenID 將使用者轉至 Steam 社群網站上的一個登入表單。 使用者輸入 Steam 登入憑證後,使用者的網頁瀏覽器自動導回第三方網站,並將一些附加 OpenID 特定資料追加入傳回 URL。 該網站的 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 帳戶章節。

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

使用 OpenID 與 ISteamUser/CheckAppOwnership見上文),解鎖您自己網站的內容。 或者,您可以將無 DRM 組建當做可選用的免費 DLC 上傳。

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

您可能會希望透過 OpenID 讓使用者直接登入他們的 Steam 帳戶。 OpenID 將傳回使用者的 64 位元 SteamID,可搭配 ISteamUser/CheckAppOwnership 驗證使用者是否擁有您的 AppID。 詳細說明請見上文的將第三方帳戶連結至 Steam 帳戶一節。

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

如果您使用 Steam 物品庫服務,先確定物品的 itemDef 正確設定為促銷物品,然後從用戶端呼叫 ISteamInventory::AddPromoItem
如果您有自己的物品後端,您可以從遊戲用戶端呼叫 ISteamUser::GetAuthSessionTicket,然後使用 ISteamUserAuth/AuthenticateUserTicketISteamUser/CheckAppOwnership 驗證所有權。 深入閱讀

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

您的遊戲的各版本應該有各自的 AppID。 從遊戲用戶端呼叫 ISteamUser::GetAuthSessionTicket,然後使用 ISteamUserAuth/AuthenticateUserTicketISteamUser/CheckAppOwnership 驗證所有權。 深入閱讀