18 мая 2017.
Новостная рассылка
Присоединяйтесь к нашему новостному бюллетеню и не пропускайте новости из мира Laravel, анонсы полезных пакетов и советы опытных разработчиков.

Используем Google API вместе с Socialite

Автор статьи Zac Vineyard Zac Vineyard | Using the Google API with Socialite | Виталий Николенко

Когда я начал проект, в котором пользователь должен был иметь возможность авторизации через Google эккаунт, я немедленно вышел на Laravel Socialite. Это официальный пакет Ларавел, но его возможности оказались ограничены только авторизацией, мне же было необходимо сделать больше. Помимо логина мне надо было получить список контактов Google авторизованного пользователя. В этой статье я расскажу как мне это удалось сделать, не отказываясь от Socialite.

Я подразумеваю, что у вас установлен чистый проект Laravel c пакетом Laravel Socialite. Если вы не знаете как это сделать, обратитесь к документации Socialite

Создаем приложение в Google API Консоли

Для начала надо создать приложение в в Google API Консоли. Найдите ссылку «Создать проект» вверху страницы проекта. Когда вы закончите создание нового проекта в Google API Console, необходимо будет скопировать себе 3 элемента информации о проекте: Google server key (ключ АПИ), client ID (идентификатор клиента) и app secret (ключ приложения). App secret будет доступен после создания проекта, server key и client ID можно найти в разделе «Учетные данные» консоли, если там будет пусто, то надо будет для начала создать новые учетные данные.

Когда все три ключа будут у вас, необходимо прописать их в .env файле

GOOGLE_SERVER_KEY=AIzaSyC_g8Uj5GGAqnPZaZAmlVMkUj0DXOVw0Z8 GOOGLE_CLIENT_ID=53500906325-ocfb3qbl0inpb249gnuir4988kn3ef52.apps.googleusercontent.com GOOGLE_APP_SECRET=YnceM3Bdn6JpboaFgc27B3Im GOOGLE_REDIRECT=http://localhost:8000/login/google/callback 

Установка клиента Google API

Для продолжения работы необходим будет пакет клиента АПИ гугла Просто подключим его через композер

composer require google/apiclient:^2.0

После того, как установка будет окончена, подключим клиент в нашем контроллере auth/LoginController.php Также придется подключать любой сервис, который бы будем использовать. В этом примере мы собираемся использовать Google’s People API для поиска контактов, нам потребуется сервис Google_Service_People, подключим и его в auth/LoginController.php

<?php

namespace App\Http\Controllers\Auth;

use Socialite;
use Google_Client;
use Google_Service_People;

Определим области видимости (scopes) API

В процессе установки пакета Socialite вы должны были добавить методы redirectToProvider() и handleProviderCallback(). в файл auth /LoginController.php. Убедитесь, что прописали нужные области видимости в методе redirectToProvider(). В данном примере мы будем запрашивать контакты пользователя, поэтому добавим в Google_Service_People::CONTACTS_READONLY в метод scopes объекта Socialite.

public function redirectToProvider()
{
  return Socialite::driver('google')
        ->scopes(['openid', 'profile', 'email', Google_Service_People::CONTACTS_READONLY])
        ->redirect();
}

Включим API

При любом использовании Google API, вам необходимо включить соответствующий раздел в консоли Google API. Перечень разделов находится под пунктом меню «Библиотека»

Google People API не показывается в списке популярных АПИ, поэтому его надо найти через окно поиска.

Включите Google People API для своего приложения.

Используем токен Socialite для клиента Google API

Laravel Socialite и клиент Google API имеют небольшие различия в структуре данных. Токен, который хранится в Socialite не соответствует структуре данных, которую требует Google API PHP клиент. Socialite отдает объект, а клиенту необходим массив в JSON.

В методе handleProviderCallback() класса auth /LoginController.php нам надо будет создать массив для гугло-клиента используя token, refreshToken и expiresIn параметров объекта Socialite. Затем сконвертируем все это в JSON и скормим в метод Google_Client::setAccessToken 

ublic function handleProviderCallback(Request $request)
{
    $user = Socialite::driver('google')->user();

    // Установим токен в  Google API PHP Client
    $google_client_token = [
        'access_token' => $user->token,
        'refresh_token' => $user->refreshToken,
        'expires_in' => $user->expiresIn
    ];

    $client = new Google_Client();
    $client->setApplicationName("Laravel");
    $client->setDeveloperKey(env('GOOGLE_SERVER_KEY'));
    $client->setAccessToken(json_encode($google_client_token));
}

После того, как мы установили токен в Google_Client, можно делать запросы к АПИ, которые мы включили и область видимость которых соответствует запрошенной.

public function handleProviderCallback(Request $request)
{
    $user = Socialite::driver('google')->user();

    // Установим токен в  Google API PHP Client
    $google_client_token = [
        'access_token' => $user->token,
        'refresh_token' => $user->refreshToken,
        'expires_in' => $user->expiresIn
    ];

    $client = new Google_Client();
    $client->setApplicationName("Laravel");
    $client->setDeveloperKey(env('GOOGLE_SERVER_KEY'));
    $client->setAccessToken(json_encode($google_client_token));
    // Запросим контакты пользователя
    $service = new Google_Service_People($client);

    $optParams = array('requestMask.includeField' => 'person.phone_numbers,person.names,person.email_addresses');
    $results = $service->people_connections->listPeopleConnections('people/me',$optParams);

    dd($results);
}

Важное замечание по использованию Google’s People API

Хотя документация утверждает, что email адреса приходят в ответе на обычный запрос по умолчанию, это не так. В запрос необходимо включить параметр requestMask.includeField 

Обновление токенов

Socialite должен разруливать обновление токена, если он протухает. Если токен истек, необходимо сделать новый запрос при помощи Socialite, затем передать новый токен клиенту Google API, как было показано выше.

Попробуем на практике

Если вы запустите команду  php artisan serve  в консоли своей машины. Можно перейти по адресу http://localhost:8000/login/google  и протестировать только что написанный код. Вам будет предложено войти в свой Google эккаунт и предоставить запрошенные разрешения (лист контактов и учетные данные). После того как вы кликнете «Разрешить» Лист ваших контактов должен отобразиться на экране в сыром виде, сдампленный функцией dd()

Что дальше

Код выше, конечно, очень простой пример использования Google API вместе c Socialite. Токен Socialite можно сохранить в базу или сессию и использовать в приложении. Функционал уже можно развивать исходя из ваших потребностей.




Как отправить email при возникновении ошибки (исключения) в приложении

Чтобы оперативно исправлять проявляющиеся баги, просто необходимо держать руку на пульсе приложения. Уведомления по email — один из самых эффективных способов.