Подтвердить что ты не робот

Настройка стороннего сервера для взаимодействия с Game Center

Я подумываю добавить в свою игру iOS функцию, позволяющую игрокам создавать свои собственные уровни игры, делиться ими с другими игроками, оценивать их и т.д. Будет публичный репозиторий пользовательских уровней, сортируемый по дате создания, рейтингу, сложности или другим критериям.

Такая функциональность потребует стороннего сервера. Я думал, что создаю RESTful API с помощью Sinatra и запустил его на Heroku. Мой вопрос: какой был бы лучший способ аутентификации запросов к этому API? Я бы предпочел не требовать от игроков создания имени пользователя и пароля. Я хотел бы просто использовать систему Game Center ID.

Любые предложения? Я никогда не делал никаких побочных действий на сервере, поэтому любая помощь приветствуется!

Разъяснение

Да, я знаю, что Apple не предоставляет свою собственную систему. Но это дает разработчикам доступ к уникальным идентификаторам Game Center (developer.apple.com/library/mac/#documentation/...), и я надеялся, что смогу использовать это, чтобы каким-то образом запустить мою собственную систему аутентификации, не требуя от пользователей входа в систему через Facebook/Twitter/и т.д.. Если это возможно.

4b9b3361

Ответ 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, тоже будет хорошим.