【发布时间】:2015-09-24 19:52:28
【问题描述】:
《部落冲突》使用 Game Center 对玩家进行身份验证并将其与现有的远程存储游戏状态相关联。
据我所知,游戏仅在客户端提供了玩家标识符。是否有一种受支持的技术可以安全地对用户进行身份验证,而不是仅发送标识符(这相当于仅使用用户名进行身份验证)?
【问题讨论】:
标签: ios game-center
《部落冲突》使用 Game Center 对玩家进行身份验证并将其与现有的远程存储游戏状态相关联。
据我所知,游戏仅在客户端提供了玩家标识符。是否有一种受支持的技术可以安全地对用户进行身份验证,而不是仅发送标识符(这相当于仅使用用户名进行身份验证)?
【问题讨论】:
标签: ios game-center
自从我提出这个问题以来,Apple 已经引入了一个新的 API,并且可以在以下位置找到答案:Setting up third-party server to interact with Game Center(谢谢,user2949759)和其他一些地方。
Specifically,从 iOS 7 开始 (Apple documentation on Wayback Machine):
-[GKLocalPlayer generateIdentityVerificationSignatureWithCompletionHandler:]生成允许第三方服务器对本地播放器进行身份验证的签名。
相关回调块的参数包括NSURL *publicKeyUrl、NSData *signature、NSData *salt、uint64_t timestamp。这些,连同玩家的playerID 和bundleID,应该作为“登录信息”发送到服务器。
publicKeyURL 来获取公钥playerID、bundleID、big-endian uint64 时间戳和逐字 salt
digest
signature是否正确,using之前下载的公钥,signature和digest
有一个example in pseudo-PHP、一个example of how one would implement this in Objective-C(逐字使用几乎没有意义)、一个Go implementation、一个Ruby implementation,并且在同一个问题上还有其他语言的各种实现。
不出所料,Go 中的实现似乎特别易读,但它并没有验证公钥是由 Apple 颁发的。链接的 Ruby 实现包含一个相当清晰的示例来说明如何做到这一点。
【讨论】:
由于您使用自己的服务器进行身份验证,因此这是您的客户端和服务器之间要实现的东西。 Game Center 将无法为您提供帮助。
一个简单的想法是使用只有您知道的函数从 playerID 计算哈希,然后让服务器将其与客户端发送的内容进行比较。
避免在您的客户端第一次运行时生成随机密钥,因为当重新安装客户端时,用户将被锁定。
【讨论】: