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

概览

Steamworks 公开了多个方法,用于确认 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 包含该库的 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 登录凭据后,用户的网页浏览器会自动重新定向回第三方网站,并将一些额外的 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 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 正确配置为促销物品,并从客户端调用 ISteamInventory::AddPromoItem
如果您有自己的物品后端,您可以从游戏客户端调用 ISteamUser::GetAuthSessionTicket,然后使用 ISteamUserAuth/AuthenticateUserTicketISteamUser/CheckAppOwnership 来证所有权。 了解更多

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

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