Получение информации о пользователе в Android Google Authentication с настройкой проверки на стороне сервера

У меня возникли проблемы с работой аутентификации Google в моем приложении для Android с использованием сервисов Google Play. Во-первых, я использовал образцы, предоставленные библиотекой, чтобы получить токен, используя область ниже.

GoogleAuthUtil.getToken(getActivity(), mEmail,"oauth2:https://www.googleapis.com/auth/userinfo.profile");

затем я использовал токен, чтобы получить больше информации о пользователе:

URL url = new URL("https://www.googleapis.com/oauth2/v1/userinfo?access_token=" + token);
HttpURLConnection con = (HttpURLConnection) url.openConnection();

Это сработало. Затем я использовал Проверка внутренних вызовов из приложений Android в блоге разработчиков Google для аутентификации пользователей приложения на моем веб-сервере. Поэтому я заменил область действия getToken на

audience:server:client_id:<webapp_clientId_for_localhost>.apps.googleusercontent.com

и использовал аналогичный чекер с тем, что в статье, для проверки аудитории и clientId (Android Client Id) на стороне сервера. Это также сработало, но если я попытаюсь получить больше информации о пользователе (имя и фамилия) либо из приложения для Android, либо из веб-приложения, используя API-интерфейс userinfo, я получаю:

{ "ошибка": { "ошибки": [ { "домен": "глобальный", "причина": "authError", "сообщение": "Неверные учетные данные", "locationType": "заголовок", "местоположение": " Авторизация" } ], "код": 401, "сообщение": "Неверные учетные данные" } }

Код, который я использую:

URL url = new URL("https://www.googleapis.com/oauth2/v1/userinfo");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestProperty("Authorization", "OAuth " + token);
con.setRequestProperty("ContentType", "application/json; charset=UTF-8");

Любая идея, почему userinfo не работает? Есть ли что-то еще, что я должен добавить к объему?


person Victor G    schedule 17.02.2013    source источник


Ответы (1)


Токен, который вы используете для проверки серверной части, предназначен для вашего сервера, а токен с oauth2: предназначен для Google. На данный момент нет механизма для одновременного запроса обоих токенов, поэтому вам нужно сделать два вызова GoogleAuthUtil. Вы должны иметь возможность запрашивать оба (по одному) после одного шага согласия. На практике токен oauth2: требуется реже, так как вы можете связать данные профиля пользователя с учетной записью, которая у вас есть от них на вашем домашнем сервере.

person breno    schedule 18.02.2013
comment
Да, это то, что я в итоге сделал. - person Victor G; 18.02.2013
comment
Привет, @breno, раньше у меня это работало, но всего несколько дней назад оно перестало работать и теперь выдает эту ошибку com.google.android.gms.auth.GoogleAuthException: Unknown. Есть идеи, почему? Что-то не так с моими прицелами? gist.github.com/lawloretienne/7351151 - person toobsco42; 07.11.2013
comment
Упс, не заметил этого вопроса. Вы все еще испытываете проблему? - person breno; 09.02.2014