Авторизація через Google в Android і перевірка токену на сервері

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

Невелика підготовка

Для початку — у вас повинні бути встановлені Google Play Services в SDK. Після їх установки можна буде імпортувати всі необхідні бібліотеки. Стаття пишеться з розрахунком на Android Studio — він сам підказує, що необхідно імпортувати.
У вас має бути створено активують з кнопкою.
Щоб було звичніше користувачеві можете створити стандартну кнопку Google+ Sing-In
Виглядати вона буде ось так:
 image
Просто додайте в ваш Layout:
 
<com.google.android.gms.common.SignInButton
                android:id="@+id/sign_in_button"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingEnd="10px" />

 
 

Додаємо дію на кнопку

Пишемо в нашому активують:
 
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<Void, Void, String> getToken = new AsyncTask<Void, Void, String>() {
                @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 , хоча воно і не повністю було працездатне, в даній статті багато доповнено.
Пропозиції щодо поліпшення статті готовий почути в личке або в коментарях. Сподіваюся заощаджу деякий час новачкам.
    
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.