【问题标题】:Authenticating a Game Center player on an online game's servers在在线游戏的服务器上对 Game Center 玩家进行身份验证
【发布时间】:2015-09-24 19:52:28
【问题描述】:

《部落冲突》使用 Game Center 对玩家进行身份验证并将其与现有的远程存储游戏状态相关联。

据我所知,游戏仅在客户端提供了玩家标识符。是否有一种受支持的技术可以安全地对用户进行身份验证,而不是仅发送标识符(这相当于仅使用用户名进行身份验证)?

【问题讨论】:

标签: ios game-center


【解决方案1】:

自从我提出这个问题以来,Apple 已经引入了一个新的 API,并且可以在以下位置找到答案:Setting up third-party server to interact with Game Center(谢谢,user2949759)和其他一些地方。

Specifically,从 iOS 7 开始 (Apple documentation on Wayback Machine):

-[GKLocalPlayer generateIdentityVerificationSignatureWithCompletionHandler:]

生成允许第三方服务器对本地播放器进行身份验证的签名。

相关回调块的参数包括NSURL *publicKeyUrlNSData *signatureNSData *saltuint64_t timestamp。这些,连同玩家的playerIDbundleID,应该作为“登录信息”发送到服务器。

  • 此时,服务器端应该使用publicKeyURL 来获取公钥
  • 服务器端,验证此公钥是否已由 Apple 签名
  • 服务器端,连接 UTF-8 编码的 playerIDbundleID、big-endian uint64 时间戳和逐字 salt
  • 服务器端,生成上面的SHA-256产生digest
  • 服务器端,验证发送到服务器的signature是否正确,using之前下载的公钥,signaturedigest

有一个example in pseudo-PHP、一个example of how one would implement this in Objective-C(逐字使用几乎没有意义)、一个Go implementation、一个Ruby implementation,并且在同一个问题上还有其他语言的各种实现。

不出所料,Go 中的实现似乎特别易读,但它并没有验证公钥是由 Apple 颁发的。链接的 Ruby 实现包含一个相当清晰的示例来说明如何做到这一点。

【讨论】:

    【解决方案2】:

    由于您使用自己的服务器进行身份验证,因此这是您的客户端和服务器之间要实现的东西。 Game Center 将无法为您提供帮助。

    一个简单的想法是使用只有您知道的函数从 playerID 计算哈希,然后让服务器将其与客户端发送的内容进行比较。

    避免在您的客户端第一次运行时生成随机密钥,因为当重新安装客户端时,用户将被锁定。

    【讨论】:

    • 确实,这是一种……让某人慢下来的方法。越狱设备很容易被欺骗返回不同的 playerID——这正是我要求更安全的原因。考虑到像《部落冲突》这样的游戏包含与游戏中心帐户相关的 IAP,甚至存在资金风险——这就是我问这个问题的原因。听起来服务器端身份验证检查是雷达的不错选择:-/
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多