《部落冲突》使用 Game Center 对玩家进行身份验证并将其链接到现有的远程存储游戏状态。
据我所知,游戏仅在客户端提供了玩家标识符。是否有一种受支持的技术可以安全地验证用户身份,而不仅仅是发送标识符(这相当于只使用用户名进行身份验证)?
《部落冲突》使用 Game Center 对玩家进行身份验证并将其链接到现有的远程存储游戏状态。
据我所知,游戏仅在客户端提供了玩家标识符。是否有一种受支持的技术可以安全地验证用户身份,而不仅仅是发送标识符(这相当于只使用用户名进行身份验证)?
自从我提出这个问题以来,Apple 已经引入了一个新的 API,并且可以在以下位置找到答案:设置第三方服务器以与 Game Center 交互(谢谢,user2949759)和其他一些地方。
具体来说,从 iOS 7(Wayback Machine 上的 Apple 文档)开始:
-[GKLocalPlayer generateIdentityVerificationSignatureWithCompletionHandler:]
生成允许第三方服务器对本地玩家进行身份验证的签名。
相关回调块的参数包括NSURL *publicKeyUrl
, NSData *signature
, NSData *salt
, uint64_t timestamp
. 这些以及玩家的playerID
和bundleID
应该作为“登录信息”发送到服务器。
publicKeyURL
来获取公钥playerID
、、bundleID
大端uint64
时间戳和逐字salt
digest
signature
发送到服务器的信息是否正确,以及signature
digest
在 pseudo-PHP中有一个例子,一个如何在 Objective-C 中实现它的例子(这对逐字使用没有什么意义),一个Go 实现,一个Ruby 实现,还有其他语言的各种实现在同一问题。
不出所料,Go 中的实现似乎特别易读,但它并没有验证公钥是由 Apple 发布的。链接的 Ruby 实现包含一个相当清晰的示例来说明如何做到这一点。
由于您使用自己的服务器进行身份验证,因此这是您的客户端和服务器之间要实现的东西。Game Center 将无法为您提供帮助。
一个简单的想法是playerID
使用只有您知道的函数计算散列,然后让服务器将其与客户端发送的内容进行比较。
避免在您的客户端第一次运行时生成随机密钥,因为当重新安装客户端时,用户将被锁定。