无所属单位

主页 文献与帮助
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,在游戏客户端与安全的后端服务器之间验证用户身份。要求该安全服务器能够向 api.steampowered.com 发送 HTTPS 请求。

加密的应用程序票证

加密的应用程序票证能用于在游戏客户端与安全的后端服务器之间验证用户身份。与会话票证不同,验证加密的应用程序票证不需要安全服务器发送 HTTPS 请求。安全服务器使用一个 C++ 库与一个私有的对称密钥来验证票证。Steamworks SDK 在 public/steam/lib 目录下包含 Windows 和 Linux 库的 32 位与 64 位版本。
使用加密的应用程序票证之前,您必须为各产品生成私钥。您可以在您的应用程序的“编辑 Steamworks 设置”中,从“安全性”下拉菜单中选择 “SDK Auth”。此私钥将与您的产品的 AppID 及其任何可下载内容绑定。

注意:这些私钥必须安全存放,绝不能在您的应用程序中发放!

Steamworks Web API

Steam 公开了一个基于HTTP 的 Web API,能用于访问许多 Steamworks 功能。此 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 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,验证所有权。 了解更多