在在线游戏的服务器上验证游戏中心播放器

时间:2013-01-07 18:19:26

标签: ios game-center

“Clash of Clans”使用Game Center对现有远程存储游戏状态的玩家进行身份验证和链接。

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

2 个答案:

答案 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 *publicKeyUrlNSData *signatureNSData *saltuint64_t timestamp。这些内容以及播放器playerIDbundleID应作为“登录信息”发送到服务器。

  • 此时,服务器端应该使用publicKeyURL来获取公钥
  • serverside,验证此公钥是否已由Apple签署
  • serverside,连接UTF-8编码的playerIDbundleID,big-endian uint64时间戳,以及逐字salt
  • serverside,生成以上的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实现包含一个相当明确的示例,说明如何执行此操作。

答案 1 :(得分:0)

由于您使用自己的服务器进行身份验证,因此您需要在客户端和服务器之间执行此操作。游戏中心无法为您提供帮助。

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

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