我正在考虑为我的iOS游戏添加一项功能,允许玩家创建自己的游戏关卡,与其他玩家分享,评分等等。有一个用户创建关卡的公共存储库,可排序按创建日期,评级,难度或其他标准。
这种功能需要第三方服务器。我在想我会使用Sinatra创建一个RESTful API并在Heroku上运行它。我的问题是:验证对此API的请求的最佳方法是什么?我宁愿不要求玩家创建用户名和密码。我想使用Game Center的ID系统。
有什么建议吗?我之前从未做过任何服务器端的事情,所以感谢任何帮助!
是的,我知道Apple不提供自己的系统。但它确实让开发人员可以访问唯一的游戏中心标识符(developer.apple.com/library/mac/#documentation/ ...),我希望我能以某种方式使用它来滚动我自己的身份验证系统,而无需用户通过Facebook登录/微博/等。如果可能的话。
答案 0 :(得分:11)
从iOS 7看起来,这可以通过Game Center使用:
[localPlayer generateIdentityVerificationSignatureWithCompletionHandler]
使用generateIdentity调用验证播放器的身份后,
另外作为参考,这里是我们最终根据generateIdentityVerificationSignatureWithCompletionHandler的响应发送到我们服务器的字典
NSDictionary *paramsDict = @{
@"publicKeyUrl":[publicKeyUrl absoluteString],
@"timestamp":[NSString stringWithFormat:@"%llu", timestamp],
@"signature":[signature base64EncodedStringWithOptions:0],
@"salt":[salt base64EncodedStringWithOptions:0],
@"playerID":localPlayer.playerID,
@"bundleID":[[NSBundle mainBundle] bundleIdentifier]
};
答案 1 :(得分:4)
编辑:好像我发布此消息时没有来自Apple的官方解决方案,但现在有了。请参阅其他答案,或阅读纯粹的历史/向后兼容性兴趣。
Apple不提供任何类型的系统来使用Apple ID身份验证(包括Game Center)和第三方服务。您可以自行进行身份验证,但您可以通过Facebook / Twitter /等方式查看OAuth以进行单点登录。 (请注意,不是每个人都有Facebook / Twitter /等身份,或者他们想要为您的游戏使用的身份。)
理论上,playerID
上的GKPlayer
属性是唯一的,不变的,并且其他人都不知道。所以,从理论上讲,你可以将它用于“穷人的身份验证”:将它呈现给你的服务器,这就是所有服务器需要查找并提供特定于玩家的东西。但这就像是通过UDID进行身份验证,或仅通过用户名进行身份验证 - 它提供的唯一安全措施是默默无闻。当你的用户没有登录游戏中心时会发生什么?
答案 2 :(得分:2)
Andy的回答是正确的,但要完成这个故事:在他链接到的那些文档中,有一个解释说明如何对Apple服务实际验证GameCenter用户实际上是他声称的那个人。链接到该部分文档如下。基本上,客户端调用generateIdentityVerificationSignatureWithCompletionHandler会给出一些包含URL的数据。您将该数据和URL提供给您自己的服务器,然后从服务器获取该URL,以使用对generateIdentityVerificationSignatureWithCompletionHandler的调用提供的其余数据对用户进行身份验证。
答案 3 :(得分:0)
我有一点时间搞清楚这一点。我终于使用了这个答案中的一些提示,其他一些SO答案,php文档和一些幸运的猜测来提出this complete answer.
注意:此方法似乎非常容易被黑客攻击,因为任何人都可以使用自己的证书签署他们想要的任何内容,然后将数据,签名和URL传递给服务器并返回"有效的GameCenter登录"回答这个,而这段代码"工作"在它实现GC算法的意义上,算法本身似乎存在缺陷。理想情况下,我们还会检查证书来自可信来源。对于检查它是Apple的游戏中心证书的超级偏执也会很好。