使用Game Center登录来引导远程服务器的登录

24
我希望允许用户使用他们的Game Center帐户在我的服务器上自动创建帐户。当我的iOS应用程序打开时,它需要与XMPP服务器进行连接和身份验证,以便与游戏服务器通信。我正在尝试查找GKLocalPlayer中一个特定于已登录设备的私有内容,用于创建/验证远程用户登录,但似乎唯一独特的是玩家ID,这相对公开。

我真的不想将GameCenter用于“所有”事情,因为这会将我的用户群分成仅限于iOS设备。

developer.apple.com

...如果您的应用程序连接到自己的网络服务,则可以使用玩家标识符将数据保存在该处。

由于玩家标识符并不是私有的,我们有多么确信它不会被伪造?


玩家ID怎么可能不是私有的? - Moshe
出于几个原因。这不是我游戏独有的,所以任何其他游戏都可以访问它。您还可以使用loadFriendsWithCompletionHandler:查询您朋友的playerID,并且我相信它们也可以通过排行榜获得。我确信GameCenter使用内部秘密来确保在进行请求时已登录,但由于我无法访问它,因此似乎没有办法从第三方服务器验证GameCenter登录。 - Kendall Hopkins
3个回答

7

GKLocalPlayer中的所有内容都可以被伪造,同样也适用于UIDevice

更好的策略是为每个连接的设备分配私有会话数据,并提供通过验证电子邮件将设备会话链接到帐户的手段。也许可以包括playerID以允许与GameKit数据交互,但不作为身份识别的手段。


2
很遗憾,对于这个问题的答案基本上是“不行”。无论如何,感谢你的建议。 - Kendall Hopkins

3

我希望在两年前我提问时有这个东西存在 :( - Kendall Hopkins
这绝对不像 Twitter OAuth 那样简单,但最终我从中得到了所需的内容。 - andyzinsser

0

我不确定玩家ID是否可以伪造,但您可以基于此生成一个密钥,以及iOS用户拥有的其他唯一ID:他们的UDID。当玩家成功登录Game Center时,基于UDID生成一个密钥。如果它与存储的值匹配,那么就没问题了。如果不匹配,则很可能是用户在另一台设备上,因为他们已经成功登录到游戏中心。在这种情况下,提供添加选项。为了防止会话劫持,通过电子邮件确认新设备。但这仅适用于iOS设备,因为它与游戏中心和UDID绑定。

另一种方法可以处理其他平台,即在第一次运行时让您的游戏联系您的服务器并从服务器获取生成的唯一ID。每当您的应用程序报告分数(或其他任何内容)时,都会发送您自己的ID。有一些加密数据的方法,但我在这个领域甚至不是业余爱好者。我对那里没有任何有用的了解。(如果您想要,可以研究在请求中发送“API密钥”或发送“盐哈希”。但我不知道那对您有什么帮助。我之前听说过这些,但怀疑它们是否有所帮助。)


如果不是这样,很可能是用户在另一台设备上登录了游戏中心。在这种情况下,建议添加它。或者这可能是一个“黑客”试图通过呈现他们的playerID来访问他们的帐户。在这种情况下,添加UDID并没有什么用,除非我愿意将他们的登录锁定在1个设备上(我真的不想这样做)。 - Kendall Hopkins
有点像。无论如何,在执行任何操作之前,您都应该检查localPlayer.isAuthenticated是否为真。Game Center会处理这个问题。第二部分呢?在服务器端生成自己的ID。始终存在会话劫持的风险。确认电子邮件可以帮助解决这个问题。 - Moshe
为了与我的服务器通信,我将对 PHP 进行 HTTP 请求,在那里我将传递所需的信息以通过 GameCenter 进行身份验证或注册。我不能依赖客户端告诉关于它自己 isAuthenticated 变量的真相。 - Kendall Hopkins

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