Вопрос

Я довольно раздражен.Я пытаюсь создать пошаговую многопользовательскую онлайн-игру для Android, используя Google App Engine на Java в качестве сервера.

Они кажутся идеально подходящими друг другу.Для Android требуется учетная запись Google, а GAE использует учетную запись Google для аутентификации, будучи при этом бесплатной и масштабируемой.

Итак, перед праздниками я смог получить аутентификацию в своем приложении GAE из моего клиента Android, используя новый AccountManager API в Android 2.0.Следующий код позволяет вам получить доступ к authToken учетной записи Google пользователя, а затем использовать его для аутентификации, чтобы пользователю не приходилось вручную вводить имя пользователя и пароль своей учетной записи:

   AccountManager mgr = AccountManager.get(this); 
   Account[] accts = mgr.getAccountsByType("com.google"); 
   Account acct = accts[0];
   AccountManagerFuture<Bundle> accountManagerFuture = mgr.getAuthToken(acct, "ah", null, this, null, null);
   Bundle authTokenBundle = accountManagerFuture.getResult(); 
   String authToken = authTokenBundle.get(AccountManager.KEY_AUTHTOKEN).toString();

Затем я смог добавить результирующую строку authToken к соответствующему URL-адресу и получить действительный файл cookie, который затем я мог бы использовать для всех дальнейших запросов.Единственное, где-то на прошлой неделе у меня это просто перестало работать.Теперь, когда я пытаюсь использовать authToken из приведенного выше кода, я не получаю возвращенный файл cookie, и мой код выдает исключение NullPointerException для отсутствующего файла cookie.

Когда я возвращаюсь к старому способу, когда пользователь вручную вводил свое имя пользователя и пароль Google, и я получаю authToken от "https://www.google.com/accounts/ClientLogin", это работает просто отлично.

Пожалуйста, скажите мне, что кто-то там создал Android-клиент для приложения Google App Engine, используя authToken из учетной записи Google на телефоне пользователя, и дайте мне какую-нибудь подсказку относительно того, почему это больше не работает.

Я бы действительно хотел, чтобы это сработало.Мои альтернативы заключаются в том, чтобы потребовать от пользователя ввести свои учетные данные (что является неуклюжим, и чего они не должны делать), или использовать другое решение для сервера.

Заранее благодарю.

Это было полезно?

Решение

Получил помощь в этом от инженера Google.Оказывается, срок действия моего authToken истек.Первоначально я запустил реализацию в начале декабря (9-го, если быть точным).Очевидно, что AccountManager выполняет кэширование authToken , поэтому я использовал тот же authToken с декабря.9-й.Когда я вернулся с каникул, срок его действия истек.

Чтобы решить проблему, я теперь вызываю getAuthToken, затем вызываю invalidateAuthToken для этого токена, затем снова вызываю getAuthToken.Это генерирует действительный authToken и работает просто отлично, даже если это немного неуклюже и было бы ненужно, если бы AccountManager каждый раз просто получал новый authToken или проверял, не истек ли срок действия кэшированного.

Обратите внимание, что вы не должны путать тип токена с типом учетной записи:invalidateAuthToken должен вызываться с помощью "com.google" вместо "ah", иначе он автоматически завершится ошибкой.

Другие советы

не ответ как таковой, но мне пришлось заменить "ah" на "android" в строке 4, чтобы получить правильный токен на Android nexus one с Android v2.2.1.не уверен насчет других устройств / версий.затем строка 4 превращается из :

... = mgr.getAuthToken(acct, "ah", null, this, null, null);

в :

... = mgr.getAuthToken(acct, "android", null, this, null, null);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top