Аутентификация OAuth2 в приложении посредством Google Sign-In. Непрерывный доступ к API Google. Вход в Гугл аккаунт и основные настройки. Обновление Access токена
- Разработка под Android
- Recovery Mode
Недавно мне захотелось создать личный проект на андроиде, и основной вопрос был такой: как однозначно идентифицировать пользователя заставляя его делать как можно меньше телодвижений? Конечно же это аккаунт Google. Я пытался пробовать множество примеров в сети - однако API несколько раз обновилось за время своего существования, многие методы не работали, мои вопросы в Google+ по этому поводу либо были вообще никак не восприняты окружением, либо были вроде «Никогда такое не делал».
В этой статье я постараюсь как можно более просто для новичков (вроде меня) описать мой метод авторизации в Google на андроид, получения токена и проверке этого самого токена на сервере.
У вас должно быть создано активити с кнопкой.
Чтобы было привычнее пользователю можете создать стандартную кнопку 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 в нужное поле.
Как я понимаю метод временный, и для нормальной работы надо создать нормальный ключ. Но для тестирования этого достаточно.
Где 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
.
Для чтения и вставки в базу данных используется библиотека 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