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

AuthToken из AccountManager в Android Client больше не работает

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

Они кажутся идеальными. Android требует учетную запись Google, и GAE использует учетную запись Google для аутентификации, будучи свободным и масштабируемым.

Итак, перед каникулами я смог получить аутентификацию в своем приложении GAE с моего Android-клиента, используя новый API AccountManager в 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 на телефоне пользователя, и дайте мне понять, почему это больше не работает.

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

Спасибо заранее.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

в:

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