“Clash of Clans”使用Game Center对现有远程存储游戏状态的玩家进行身份验证和链接。
从我所看到的情况来看,游戏仅在客户端提供了玩家标识符。是否有一种受支持的技术来安全地验证用户,而不是仅发送标识符(这相当于仅使用用户名进行身份验证)?
答案 0 :(得分:2)
自从我提出这个问题以来,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实现包含一个相当明确的示例,说明如何执行此操作。
答案 1 :(得分:0)
由于您使用自己的服务器进行身份验证,因此您需要在客户端和服务器之间执行此操作。游戏中心无法为您提供帮助。
一个简单的想法是使用您只知道的函数从playerID
计算哈希值,并让服务器将其与客户端发送的函数进行比较。
当您的客户端第一次运行时,避免生成随机密钥,因为当重新安装客户端时,用户将被锁定。