[recovery mode] Авторизация через Google и проверка токена на сервере

Недавно мне захотелось создать личный проект на андроиде, и основной вопрос был такой: как однозначно идентифицировать пользователя заставляя его делать как можно меньше телодвижений? Конечно же это аккаунт Google. Я пытался пробовать множество примеров в сети — однако API несколько раз обновилось за время своего существования, многие методы не работали, мои вопросы в Google+ по этому поводу либо были вообще никак не восприняты окружением, либо были вроде «Никогда такое не делал».В этой статье я постараюсь как можно более просто для новичков (вроде меня) описать мой метод авторизации в Google на андроид, получения токена и проверке этого самого токена на сервере.Небольшая подготовкаДля начала — у вас должны быть установлены Google Play Services в SDK. После их установки можно будет импортировать все необходимые библиотеки. Статья пишется с расчетом на Android Studio — он сам подсказывает, что необходимо импортировать.У вас должно быть создано активити с кнопкой.Чтобы было привычнее пользователю можете создать стандартную кнопку Google+ Sing-InВыглядеть она будет вот так: imageПросто добавьте в ваш Layout: Добавляем действие на кнопку Пишем в нашем активити: View btn = (View) findViewById (R.id.sign_in_button); btn.setOnClickListener (new View.OnClickListener () { @Override public void onClick (View view) {

Intent intent = AccountPicker.newChooseAccountIntent (null, null, new String[]{«com.google»}, false, null, null, null, null); startActivityForResult (intent, 123);

} }); Собственно присвоим кнопке действие — вызов интенда выбора аккаунта. Если вы работаете в Android Studio он сам вам подскажет, какие библиотеки нужно импортировать, так что это подробно тут я расписывать не буду.startActivityForResult (intent, 123); — задает код с которым произойдет возврат. 123 это код возврата, он может быть каким угодно. Это необходимо, когда вы делаете несколько интендов, и вам надо обработать их по разному.Необходимые области доступа Обьявите эти переменные в классе. Это необходимые нам области доступа. Первый написано в google: «Позволяет определить аутентифицированного пользователя. Для этого при вызове API необходимо указать me вместо идентификатора пользователя Google+.» Второе разрешение нам необходимо для получения личных данных пользователя (Имя, Фамилия, адрес G+ страницы, аватар), и последнее для получения E-mail. Я посчитал это важным, ведь это вполне неизменный идентификатор для записи в бд. private final static String G_PLUS_SCOPE = «oauth2: https://www.googleapis.com/auth/plus.me»; private final static String USERINFO_SCOPE = «https://www.googleapis.com/auth/userinfo.profile»; private final static String EMAIL_SCOPE = «https://www.googleapis.com/auth/userinfo.email»; private final static String SCOPES = G_PLUS_SCOPE + » » + USERINFO_SCOPE + » » + EMAIL_SCOPE; Код получения токена protected void onActivityResult (final int requestCode, final int resultCode, final Intent data) { if (requestCode == 123 && resultCode == RESULT_OK) { final String accountName = data.getStringExtra (AccountManager.KEY_ACCOUNT_NAME); AsyncTask getToken = new AsyncTask() { @Override protected String doInBackground (Void… params) { try { String token = GoogleAuthUtil.getToken (AcrivityName.this, accountName, SCOPES); return token;

} catch (UserRecoverableAuthException userAuthEx) { startActivityForResult (userAuthEx.getIntent (), 123); } catch (IOException ioEx) { Log.d (TAG, «IOException»); } catch (GoogleAuthException fatalAuthEx) { Log.d (TAG, «Fatal Authorization Exception» + fatalAuthEx.getLocalizedMessage ()); } return token; }

@Override protected void onPostExecute (String token) { reg (token); }

}; getToken.execute (null, null, null); } } Где 123 — ваш код, который вы указали ранее, где AcrivityName — название вашего актитивити. Грубо говоря — мы скармливаем функции получения токена необходимые разрешения и имя аккаунта. И заметьте — это все происходит в фоновом режиме, после чего полученный токен передается в написанную мною функцию reg. Она уже отправляет токен и все необходимые данные на сервер.Так как разрабатываю недавно, с исключениями пока что беда, если есть предложение — напишите в личку или в комментарии.Проверяем токен на сервере. (PHP) Хочу обратить внимание, полученный нами токен имеет тип Online. И действует он лишь 10 минут. Для получения offline токена (чтобы дольше работать с ним с сервера) обратитесь к этой инструкции developers.google.com/accounts/docs/CrossClientAuth $mToken = $_POST['plusToken']; echo $userinfo = 'https://www.googleapis.com/oauth2/v1/userinfo? alt=json&access_token=' . $mToken; $json = file_get_contents ($userinfo); $userInfoArray = json_decode ($json, true); $googleEmail = $userInfoArray['email']; $tokenUserId = $userInfoArray['user_id']; Собственно скармливаем токен в googleapis и забираем полученный JSON ответ.Заключение Возможно код сырой и написан достаточно криво. Однако я целую неделю убил на поиск работающего решения. Решение это я нашел тут: android-developers.blogspot.ru/2012/09/google-play-services-and-oauth-identity.html, хотя оно и не полностью было работоспособно, в данной статье многое дополнено.Предложения по улучшению статьи готов услышать в личке или в комментариях. Надеюсь сэкономлю некоторое время новичкам.

© Habrahabr.ru