Настройка стороннего сервера для взаимодействия с Game Center
Я подумываю добавить в свою игру iOS функцию, позволяющую игрокам создавать свои собственные уровни игры, делиться ими с другими игроками, оценивать их и т.д. Будет публичный репозиторий пользовательских уровней, сортируемый по дате создания, рейтингу, сложности или другим критериям.
Такая функциональность потребует стороннего сервера. Я думал, что создаю RESTful API с помощью Sinatra и запустил его на Heroku. Мой вопрос: какой был бы лучший способ аутентификации запросов к этому API? Я бы предпочел не требовать от игроков создания имени пользователя и пароля. Я хотел бы просто использовать систему Game Center ID.
Любые предложения? Я никогда не делал никаких побочных действий на сервере, поэтому любая помощь приветствуется!
Разъяснение
Да, я знаю, что Apple не предоставляет свою собственную систему. Но это дает разработчикам доступ к уникальным идентификаторам Game Center (developer.apple.com/library/mac/#documentation/...), и я надеялся, что смогу использовать это, чтобы каким-то образом запустить мою собственную систему аутентификации, не требуя от пользователей входа в систему через Facebook/Twitter/и т.д.. Если это возможно.
Ответы
Ответ 1
Похоже на iOS 7, это возможно с Game Center, используя:
[localPlayer generateIdentityVerificationSignatureWithCompletionHandler]
Как только вы подтвердите личность игрока, используя вызов generateIdentity,
- Свяжите идентификатор игрока с пользователем на вашем сервере db
- Используйте любой шаблон токена/проверки доступа, который ваша инфраструктура REST обеспечивает для последующих вызовов.
https://developer.apple.com/library/ios/documentation/GameKit/Reference/GKLocalPlayer_Ref/Reference/Reference.html
Также для справки, вот словарь, который мы заканчиваем отправкой на наш сервер на основе ответа от 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]
};
Ответ 2
изменить: как если бы я опубликовал это, официальное решение от Apple не было, но теперь есть. См. Другие ответы для этого, или читайте исключительно для интереса к истории/обратной совместимости.
Apple не предоставляет какой-либо системы для использования проверки подлинности Apple ID (включая Game Center) со сторонними службами. Вы сами по себе проверяете подлинность, хотя можете заглянуть в OAuth за возможность однократного входа через Facebook/Twitter/и т.д. (Просто остерегайтесь, что не у всех есть идентификатор Facebook/Twitter/etc или тот, который они хотят использовать для вашей игры.)
Теоретически свойство playerID
на GKPlayer
является уникальным, постоянным и неизвестным кому-либо еще. Таким образом, теоретически вы можете использовать его для "проверки бедных людей": представить его на свой сервер и что весь сервер должен искать и предоставлять информацию, специфичную для игрока. Но это похоже на аутентификацию по UDID или только по имени пользователя - единственной гарантией, которую она предоставляет, является неясность. И что происходит, когда у вас есть пользователь, который не подписался в Game Center?
Ответ 3
Ответ Энди на правильном пути, но для завершения истории: в тех документах, на которые он ссылается, есть объяснение того, как фактически аутентифицироваться в отношении сервисов Apple, которые фактически принадлежат игроку GameCenter, которого он утверждает. Ссылка на эту часть документов приведена ниже. В принципе, вызов клиента для генерацииIdentityVerificationSignatureWithCompletionHandler дает ваши данные, включая URL. Вы даете эти данные и URL-адрес своему собственному серверу, а затем с вашего сервера вы можете ударить по этому URL-адресу, чтобы аутентифицировать пользователя с остальными данными, которые были предоставлены вызовом generateIdentityVerificationSignatureWithCompletionHandler.
https://developer.apple.com/library/ios/documentation/GameKit/Reference/GKLocalPlayer_Ref/index.html#//apple_ref/occ/instm/GKLocalPlayer/generateIdentityVerificationSignatureWithCompletionHandler:
Ответ 4
У меня было время понять это. Я наконец использовал несколько советов из этого ответа, пару других ответов SO, php docs и некоторые удачные предположения, чтобы придумать этот полный ответ.
ПРИМЕЧАНИЕ. Этот метод кажется очень открытым для взлома, так как любой может подписывать все, что захочет, с помощью своего собственного сертификата, а затем передавать серверу данные, подпись и URL-адрес в свой сертификат и возвращать "правильный вход в систему GameCenter", тогда как этот код "работает" в том смысле, что он реализует алгоритм GC, сам алгоритм кажется ошибочным. В идеале мы также должны проверить, что сертификат получен из надежного источника. Экстра-паранойя, чтобы проверить, что это сертификат Apple Game Center, тоже будет хорошим.