在在线游戏服务器上认证Game Center玩家

8

“部落冲突”使用Game Center来验证并链接玩家与远程存储的游戏状态。

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


1
这个问题的答案在这里:https://dev59.com/5mUo5IYBdhLWcg3wzCBr - Nikolay Popov
2个回答

2
自从我提出这个问题以来,苹果公司推出了一个新的API,答案可以在设置第三方服务器与Game Center交互(感谢user2949759)和其他一些地方找到。
具体来说,自iOS 7以来(Apple Wayback Machine文档):
``` -[GKLocalPlayer generateIdentityVerificationSignatureWithCompletionHandler:] ```
生成一个签名,允许第三方服务器验证本地玩家身份。
相关的回调块参数包括NSURL *publicKeyUrlNSData *signatureNSData *saltuint64_t timestamp。这些参数连同玩家的playerIDbundleID应该作为“登录信息”发送到服务器。
  • 此时,应该在服务器端使用publicKeyURL获取公钥
  • 在服务器端验证此公钥是否已由Apple签名
  • 在服务器端连接UTF-8编码的playerIDbundleID,大端uint64时间戳和逐字逐句的salt
  • 在服务器端生成上述内容的SHA-256以产生digest
  • 在服务器端验证已发送到服务器的signature是否正确,使用之前下载的公钥、signaturedigest
有一个伪PHP示例,一个如何在Objective-C中实现此示例(直接使用几乎没有意义),一个Go实现,一个Ruby实现,并且在同一问题上有其他语言的各种实现。
毫不奇怪,Go中的实现似乎特别易读,但它没有验证公钥是否由苹果发行。链接到的Ruby实现包含了一个相当清晰的示例来完成这个任务。

0

由于您正在使用自己的服务器进行身份验证,因此这是客户端和服务器之间需要实现的事情。Game Center 无法帮助您。

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

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


确实,那是一种...让某人变慢的方法。越狱设备很容易被欺骗返回不同的playerID——这正是我要求更安全的原因。考虑到像《部落冲突》这样的游戏包含与Game Center账户相关联的IAPs,甚至存在金钱风险——这就是我提出疑虑的原因。听起来服务器端认证检查是一个好的radar候选项 :-/ - Ivan Vučica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接