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 на телефоне пользователя и дайте мне понять, почему это больше не работает.

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

Заранее спасибо.

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

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

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

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

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

В:

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