Аутентификация OAuth2 в приложении посредством Google Sign-In. Непрерывный доступ к API Google. Вход в Гугл аккаунт и основные настройки. Обновление Access токена

8 июля 2014 в 00:53 Авторизация через Google в Android и проверка токена на сервере
  • Разработка под Android
  • Recovery Mode

Недавно мне захотелось создать личный проект на андроиде, и основной вопрос был такой: как однозначно идентифицировать пользователя заставляя его делать как можно меньше телодвижений? Конечно же это аккаунт Google. Я пытался пробовать множество примеров в сети - однако API несколько раз обновилось за время своего существования, многие методы не работали, мои вопросы в Google+ по этому поводу либо были вообще никак не восприняты окружением, либо были вроде «Никогда такое не делал».
В этой статье я постараюсь как можно более просто для новичков (вроде меня) описать мой метод авторизации в Google на андроид, получения токена и проверке этого самого токена на сервере.

Небольшая подготовка Для начала - у вас должны быть установлены Google Play Services в SDK. После их установки можно будет импортировать все необходимые библиотеки. Статья пишется с расчетом на Android Studio - он сам подсказывает, что необходимо импортировать.
У вас должно быть создано активити с кнопкой.
Чтобы было привычнее пользователю можете создать стандартную кнопку Google+ Sing-In
Выглядеть она будет вот так:

Просто добавьте в ваш 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; Регистрация нашего приложения. Изначально забыл этот пункт - исправляюсь.
Нам необходимо зайти на code.google.com/apis/console создать там проект, зайти в Credentials и создать новый Client ID для OAuth выбрав пункт Installed Application -> Android. Там нам необходимо ввести название нашего пакета и SHA1 сумму нашего ключа.
С этим у меня на самом деле было много проблем решил достаточно костыльным способом.
Нашел debug.keystore в %USERPROFILE%\.android\debug.keystore поместил в папку с проектом и прописал в build.grandle:

SigningConfigs { debug { storeFile file("debug.keystore") } myConfig { storeFile file("debug.keystore") storePassword "android" keyAlias "androiddebugkey" keyPassword "android" } }
После чего нам нужно выполнить команду:
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -v -list
Сам keytool можно найти в SDK. Из вывода копируем SHA1 в нужное поле.
Как я понимаю метод временный, и для нормальной работы надо создать нормальный ключ. Но для тестирования этого достаточно.

Код получения токена 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 токена (чтобы дольше работать с ним с сервера) обратитесь к этой инструкции

Знали ли Вы, что используя Google , можно сделать на своем сайте регистрацию на сайте в один клик? Каждый, у кого есть аккаунт в Google, может просто нажать на кнопку, а скрипт автоматически загрузит в приложение e-mail, имя и фотографию.
Используя этот вариант входа/регистрации, вы создадите удобство для пользователей. Вот некоторые из преимуществ:

Не нужно делать проверку формы входа, и вообще создавать форму;

Нет необходимости в функции «Забыл пароль»;

E-Mail адресы уже подтверждены Google, поэтому вам не нужно высылать подтверждение.

Конечно, это будет работать, только если у человека есть аккаунт Google, поэтому имеет смысл сделать что-то в дополнение к этой системе регистрации.

Настройка приложения

Первый шаг заключается в создании приложения через консоль Google API . Следуйте инструкциям для получения дополнительной информации. После завершения процесса, разместить полученные ключи в setup.php.
Запуск кода из schema.sql (вы можете найти его в архиве скачать) в PhpMyAdmin или ином административном MySQL инструменте. Это создаст glogin_users таблицу в базе данных, которая будет использоваться для хранения информации об учетных записях пользователей вашего приложения. После этого, напишите свои данные подключения к базе данных в setup.php .

PHP

Для чтения и вставки в базу данных используется библиотека Idiorm . Будем создавать следующие PHP страницы:

index.php – главный файл приложения;

setup.php – соединение с базой данных и ключи выданные Google;

Папки библиотеки Idiorm, PHP библиотеки Google.

Давайте взглянем на код первой части index.php :

200?"200px":""+(this.scrollHeight+5)+"px");">require "setup.php";

// Create a new Google API client
$client = new apiClient();
//$client->setApplicationName("Tutorialzine");

// Configure it
$client->setClientId($client_id);
$client->setClientSecret($client_secret);
$client->setDeveloperKey($api_key);
$client->setRedirectUri($redirect_url);
$client->setApprovalPrompt(false);
$oauth2 = new apiOauth2Service($client);

// The code parameter signifies that this is
// a redirect from google, bearing a temporary code
if (isset($_GET["code"])) {

// This method will obtain the actuall access token from Google,
// so we can request user info
$client->authenticate();

// Get the user data
$info = $oauth2->userinfo->get();

// Find this person in the database
$person = ORM::for_table("glogin_users")->where("email", $info["email"])->find_one();

If(!$person){
// No such person was found. Register!

$person = ORM::for_table("glogin_users")->create();

// Set the properties that are to be inserted in the db
$person->email = $info["email"];
$person->name = $info["name"];

If(isset($info["picture"])){
// If the user has set a public google account photo
$person->photo = $info["picture"];
}
else{
// otherwise use the default
$person->photo = "assets/img/default_avatar.jpg";
}

// insert the record to the database
$person->save();
}

// Save the user id to the session
$_SESSION["user_id"] = $person->id();

// Redirect to the base demo URL
header("Location: $redirect_url");
exit;
}

// Handle logout
if (isset($_GET["logout"])) {
unset($_SESSION["user_id"]);
}

$person = null;
if(isset($_SESSION["user_id"])){
// Fetch the person from the database
$person = ORM::for_table("glogin_users")->find_one($_SESSION["user_id"]);
}



HTML

Код HTML занимает нижнюю половину страницы index.php . После авторизации через Google сюда мы сможем выводить данные о пользователе. Сама страница является стандартным документом HTML5.


200?"200px":""+(this.scrollHeight+5)+"px");">



Google Powered Login Form | Tutorialzine Demo






Login Form




Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: