用户验证与所有权 (Steamworks 文献库) |
您所在的位置:网站首页 › steam接入账户 › 用户验证与所有权 (Steamworks 文献库) |
概览Steamworks 公开了多个方法,用于确认 Steam 用户的身份并验证应用程序的所有权。 本文描述了不同场景下使用的各验证方法。 在游戏客户端与其他客户端之间(P2P)或与游戏服务器间,使用会话票证 在游戏客户端与后端服务器之间,使用: 会话票证与 Steamworks Web API 加密的应用程序票证库 玩家使用网页浏览器时,使用 OpenID 与 Steamworks Web API 在 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 APISteam 公开了基于 HTTP 的 Web API,用于访问多个 Steamworks 功能。 从任何可进行 HTTP 请求的应用程序,如游戏客户端或服务器,均可访问该 API 所包含的公开方法。 该 API 还包含需要验证的受保护方法,需要从受信任的后端应用程序访问。 关于 Web API 的更多详情可以参见此处。P2P 或游戏服务器会话票证用户验证以下步骤详细说明了如何使用会话票证在用户游戏客户端(客户端 A)与另一个客户端或游戏服务器(客户端 B)之间验证用户身份: 客户端 A 必须调用 ISteamUser::GetAuthSessionTicket 获取一个会话票证。 客户端 A 必须将其会话票证发给客户端 B。 客户端 B 必须将客户端 A 的票证传入 ISteamUser::BeginAuthSession。这将执行快速验证检查。 如果票证有效,那么 ISteamUser::BeginAuthSession 将把票证转发至 Steam 后端,以验证该票证尚未被重新使用且由客户端 A 的帐户所有者颁发。验证结果将在 ISteamUser::ValidateAuthTicketResponse_t 回调中返回。 多人游戏会话终止时: 客户端 A 必须将最初从 ISteamUser::GetAuthSessionTicket 返回的句柄传入 ISteamUser::CancelAuthTicket。 客户端 B 必须将客户端 A 的 SteamID 传入 ISteamUser::EndAuthSession。 会话票证的重要须知: 会话票证只能使用一次。 必须为多人游戏会话中的每个请求票证的客户端调用 ISteamUser::GetAuthSessionTicket。 将会话票证用于在 P2P 多人玩家会话中验证玩家时,各游戏客户端应该验证在该多人玩家会话中的其他各个游戏客户端的身份。 完成会话票证时,必须为 ISteamUser::GetAuthSessionTicket 返回的每个句柄调用 ISteamUser::CancelAuthTicket。 当客户端 A 调用 ISteamUser::CancelAuthTicket时,客户端 B 将获取一个 ISteamUser::ValidateAuthTicketResponse_t 回调,声明客户端 A 的票证不再有效。 客户端 A 与客户端 B 一起离开游戏时,如果 A 调用的 ISteamUser::CancelAuthTicket 在 B 调用的ISteamUser::EndAuthSession 之前处理,那么 B 也许会收到 ISteamUser::ValidateAuthTicketResponse_t 回调,声明该票证已取消。 由于客户端 A 离开已有共识,此回调可以忽略。 网络条件也许会阻止 Steam 后端为 ISteamUser::BeginAuthSession 的调用方提供一个无时限的回调。 ISteamUser::BeginAuthSession的调用方(客户端 B)在获取此回调之前,不能假设已获知了客户端 A 的真实身份,而应允许多人游戏会话继续。 如果 ISteamUser::BeginAuthSession 的调用方收到 ISteamUser::ValidateAuthTicketResponse_t 回调,声明客户端 A 的票证无效,该调用方必须拒绝与客户端 A 继续多人游戏会话。如果游戏中的其他对等机不拒绝与客户端 A 玩游戏 ,调用方应该离开该多人游戏会话。 ISteamGameServer 暴露同样的会话票证,以在游戏客户端与游戏服务器之间执行验证。所有权验证使用会话票证时,Steam 将自动验证当前 AppID 的所有权。 如果用户不拥有当前的 AppID,那么 ISteamUser::ValidateAuthTicketResponse_t 的 m_eAuthSessionResponse 字段将设置为 k_EAuthSessionResponseNoLicenseOrExpired。 在收到用户的会话票证并传入 ISteamUser::BeginAuthSession 之后,ISteamUser::UserHasLicenseForApp 能用于判定用户是否拥有特定的可下载内容。后端服务器会话票证与 Steamworks Web API用户验证下列步骤详细说明了如何使用会话票证在用户游戏客户端与安全服务器之间验证用户身份: 客户端必须调用 ISteamUser::GetAuthTicketForWebApi 获取会话票证。 要保证票证有效,客户端必须等待 ISteamUser::GetTicketForWebApiResponse_t 回调。 客户端必须将其会话票证发给安全服务器。 安全服务器必须向 partner.steam-api.com 发送 HTTPS 请求,并调用 ISteamUserAuth/AuthenticateUserTicket web 方法,将用户的会话票证以十六进制编码的 UTF-8 字符串传入。 注意,此方法允许传入与所提供票证的 AppID 关联的 Steam Web API 密钥 或 Web API 发行商密钥。 未来此 API 将更新为在提供 Web API 发行商密钥时向调用方返回更多信息。 如果用户的票证有效,那么 ISteamUserAuth/AuthenticateUserTicket 将返回用户的 64 位 SteamID。所有权验证用户身份一经验证,安全服务器便可以使用 ISteamUser/CheckAppOwnership Web API 方法检查用户是否拥有特定 AppID,或者调用 ISteamUser/GetPublisherAppOwnership 以获取用户拥有的与所提供的开发商密钥关联的所有 AppID 列表。加密的应用程序票证用户验证下列步骤详细说明了如何使用加密应用程序票证在用户游戏客户端与安全服务器之间验证用户身份: 客户端必须调用 ISteamUser::RequestEncryptedAppTicket 并等待 ISteamUser::EncryptedAppTicketResponse_t 调用结果。 客户端然后必须调用 ISteamUser::GetEncryptedAppTicket 以获取用户的加密票证,并将该票证发至安全服务器。 使用加密的应用程序票证库,安全服务器接下来必须: 调用 SteamEncryptedAppTicket::BDecryptTicket 解密用户票证。 调用 SteamEncryptedAppTicket::BIsTicketForApp 验证该票证确为预期的应用程序。 调用 SteamEncryptedAppTicket::GetTicketIssueTime 验证该票证未过期(应用程序定义的过期时间)。 调用 SteamEncryptedAppTicket::GetTicketSteamID 获取用户的 SteamID。 可在 SDK 的 Steamworks API 示例应用程序(SpaceWar) 项目中找到实现实例, 具体而言,是 CSpaceWarClient::RetrieveEncryptedAppTicket 与 CSpaceWarClient::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 登录页面时使用: 用户的 SteamID 可以在游戏中或通过网页浏览器安全获取。一旦进行了初始关联 ,您只需验证用户的 SteamID 便能允许安全地访问第三方帐户。 这样,Steam 用户无需再对第三方帐户系统进行任何二次登录。 此外,如果遇到新 SteamID 时,新的第三方帐户能自动创建并与其绑定,Steam 用户将根本无需知晓发生了二次验证。 与之相反,他们的单个 Steam 帐户即可授予自己所有游戏的访问权限,使用户体验更流畅,并去除了安装试用新游戏的潜在障碍。 从游戏内绑定通过 Steamworks Web API,会话票证可用于在游戏客户端与安全后端服务器之间验证用户身份: 客户端必须调用 ISteamUser::GetAuthTicketForWebApi 获取会话票证。 要保证票证有效,客户端必须等待 ISteamUser::GetTicketForWebApiResponse_t 回调。 客户端必须将其会话票证发给安全服务器。 安全服务器必须向 api.steampowered.com 发送 HTTPS 请求,并调用 ISteamUserAuth/AuthenticateUserTicket web 方法,将用户的会话票证以十六进制编码的 UTF-8 字符串传入。 请注意此方法要求与所给票证的 AppID 绑定的 Web API 开发商密钥。 如果用户的票证有效,那么 ISteamUserAuth/AuthenticateUserTicket 将返回用户的 64 位 SteamID。从网页浏览器绑定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/AuthenticateUserTicket 和 ISteamUser/CheckAppOwnership 来证所有权。 了解更多序列号控制解锁软件的哪个版本您的游戏的各版本应该有其自己的 AppID。 从游戏客户端,调用 ISteamUser::GetAuthSessionTicket,然后使用 ISteamUserAuth/AuthenticateUserTicket 和 ISteamUser/CheckAppOwnership 来验证所有权。 了解更多 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |