Я довольно раздражен. Я пытаюсь создать основанную на повороте многопользовательскую онлайн-игру для Android с помощью Google App Engine in 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 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. Оказалось, что мой автотокен просрочен. Первоначально реализация заработала в начале декабря (точнее, 9-го). Очевидно, что AccountManager кэширует authToken, поэтому я использовал тот же authToken с 9 декабря. Когда я вернулся с праздников, срок его действия истек.
Чтобы решить эту проблему, я звоню getAuthToken, затем вызываю invalidateAuthToken на этом маркере, а затем снова вызываю getAuthToken. Это генерирует действительный authToken и работает просто отлично, даже если он немного неуклюж и был бы ненужен, если бы AccountManager каждый раз получал свежий authToken или проверял, не истек ли срок действия кэшированного.
Обратите внимание, что нельзя путать тип токена с типом аккаунта: invalidateAuthToken нужно вызывать с помощью "com.google" вместо "ah", иначе он беззвучно выйдет из строя.
Вызов getAuthToken должен быть выполнен с помощью "com.google".