Steamworks 文献库
用户验证与所有权

概览

Steamworks 公开了多个方法,用于确认 Steam 用户的身份并验证应用程序的所有权。 本文档描述了所有这些验证方法,它们用于以下场景中:

在 Steam 中标识用户

每个 Steam 用户都可以通过一个唯一的 64 位数字 ID 来标识,该 ID 称为用户的 Steam ID。 在 Steamworks C++ API 中,用户的 SteamID 包含在 CSteamID 对象中。 您可以调用 ISteamUser::GetSteamID 获取当前用户的 Steam ID,然后对返回值调用 CSteamID.ConvertToUint64() 以检索其 64 位 ID。

以下验证方法可用于安全验证用户的 Steam ID。

此文档涉及的 API

会话票证

会话票证是已签名的票证,可用于在用户的游戏客户端与其他任意数量的游戏客户端(例如在对等多人游戏会话中)之间,或与侦听服务器/专用游戏服务器(通过 ISteamGameServer API)之间验证用户身份。 这些票证也可以用于验证当前游戏与相关可下载内容的所有权,判断用户是否受到了 VAC 封禁(参见 反作弊与游戏封禁)。
会话票证也可以通过 Steamworks Web API,在游戏客户端与安全的后端服务器之间验证用户身份。 要求该安全服务器能够向 partner.steam-api.com 发送 HTTPS 请求。

加密的应用程序票证

加密的应用程序票证能用于在游戏客户端与安全的后端服务器之间验证用户身份。 与会话票证不同,验证加密的应用程序票证无需安全服务器发送 HTTPS 请求。 安全服务器使用一个 C++ 库与一个私有的对称密钥来验证票证。 Steamworks SDK 包含该库的 32 位和 64 位版本,同时支持 Windows 和 Linux,位于 public/steam/lib 目录下。

使用加密的应用程序票证之前,您必须为各产品生成私钥。 要实现此操作,您可以前往应用程序的“编辑 Steamworks 设置”,从“安全性”下拉菜单中选择 “SDK 验证”。 此私钥将与您的产品的 AppID 及其任何可下载内容绑定。 若想访问 Steamworks 的这一栏目,用户必须拥有相关应用程序的“管理签名”权限。
注意:这些私钥必须安全存放,绝不能以任何形式在您的应用程序中分发!

Steamworks Web API

Steam 公开了基于 HTTP 的 Web API,用于访问多个 Steamworks 功能。 从任何可进行 HTTP 请求的应用程序,如游戏客户端或服务器,均可访问该 API 所包含的公开方法。 该 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

所有权验证

仅在用户拥有票证所对应的 AppID 时,Steam 才会为该用户生成加密的应用程序票证。 将加密的应用程序票证解密之后,安全服务器能使用 SteamEncryptedAppTicket::BIsTicketForApp 验证票证的 AppID 是否与产品的 AppID 匹配。 服务器还能够使用 SteamEncryptedAppTicket::BUserOwnsAppInTicket 判定用户是否拥有某个特定的可下载内容(DLC)

基于网页浏览器的 OpenID 验证

如 OpenID 2.0 规范所描述,Steam 为 OpenID 提供商。 在网页浏览器内,第三方网站能使用 OpenID 获取用户的 SteamID。该 SteamID 可用作第三方网站的登录凭据或与该网站上的既有帐户绑定。

使用 OpenID 时,用户首先在网页浏览器中访问第三方网站。 当用户希望登录该网站或将自己的帐户与该网站绑定时,网站使用 OpenID 将用户转至 Steam 社区网站上的一个登录窗体。 当用户输入 Steam 登录凭据后,用户的网页浏览器会自动重新定向回第三方网站,并在返回 URL 中附加一些 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 Endpoint 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 库存服务,请确保该物品的 itemdef 已正确配置为促销物品(promo item),并在客户端调用 ISteamInventory::AddPromoItem
如果您有自己的物品后端系统,可以从游戏客户端调用 ISteamUser::GetAuthSessionTicket\,然后配合使用 ISteamUserAuth/AuthenticateUserTicket\ISteamUser/CheckAppOwnership 来验证用户的游戏所有权。 了解更多

序列号控制解锁软件的哪个版本

您的游戏的各版本应该有其自己的 AppID。 从游戏客户端,调用 ISteamUser::GetAuthSessionTicket,然后使用 ISteamUserAuth/AuthenticateUserTicketISteamUser/CheckAppOwnership 来验证所有权。 了解更多