[Примеры] Авторизация (получение access и refresh token) OAuth 2.0 Google и работа с API Google на PHP
- Регистрация OAuth 2.0 приложения в Google API Console
- Пример получения токена (access token) для доступа к API Google на PHP
- Обновление access token’а с помощью refresh token’а
- Пример работы с API Google на PHP
1. Регистрация OAuth 2.0 приложения в Google API Console
1) Зайдите в Google Developers Console и создайте новый проект.
2) Процесс создания нового проекта может занять несколько минут. После создания проекта перейдите на страницу управления этим проектом и зайдите в панель управленя раздела «API и сервисы».
3) В панели управления включите API и сервисы, которые вы планируете использовать.
4) После этого перейдите в раздел «Учетные данные». Нажмите на «Создать учетные данные» — «Идентификатор клиента OAuth».
5) Укажите тип приложения «Веб-приложение».
6) После создания «Веб-приложения» вы получите ID клиента и секретный ключ. Сохраните эти данные.
2. Пример получения токена (access token) для доступа к API Google на PHP
Устанавливаем библиотеку для работы с API Google на PHP:
composer require google/apiclient:"^2.0"
Получаем access token:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
// Подключаем библиотеку для работы с API Google require_once 'vendor/autoload.php'; session_start(); // Токен будем хранить в сессии // Параметры приложения // ID приложения define('GOOGLE_CLIENT_ID', '161802487006-tmklc8el565rq17t2s0ba0m2ic.apps.googleusercontent.com'); // Secret приложения define('GOOGLE_CLIENT_SECRET', 'V0BuoZak6564d82URBgc'); // Адрес, на который будет переадресован пользователь после прохождения авторизации define('GOOGLE_CLIENT_REDIRECT_URL', 'http://localhost/_blog/tests/google-oauth/oauth.php'); // Области, к которым будет запрошен доступ // Подробнее https://developers.google.com/identity/protocols/googlescopes define( 'SCOPES', implode( ' ', [ Google_Service_Sheets::SPREADSHEETS, Google_Service_Webmasters::WEBMASTERS, 'https://www.googleapis.com/auth/userinfo.profile', 'https://www.googleapis.com/auth/userinfo.email', 'https://www.googleapis.com/auth/plus.me' ] ) ); // Инициализация Google Client $client = new Google_Client(); $client->setClientId( GOOGLE_CLIENT_ID ); $client->setClientSecret( GOOGLE_CLIENT_SECRET ); $client->setRedirectUri( GOOGLE_CLIENT_REDIRECT_URL ); $client->setScopes( SCOPES ); $client->setAccessType( 'offline' ); $client->setApprovalPrompt('force'); // Выводим на экран ссылку для открытия окна диалога авторизации echo '<a href="' . $client->createAuthUrl() . '">Авторизация через Google</a>'; if ( isset( $_GET['code'] ) ) { $response = $client->fetchAccessTokenWithAuthCode( $_GET['code'] ); // Если при получении токена произошла ошибка if (isset($response['error'])) { throw new Exception('При получении токена произошла ошибка. Error: ' . $response['error'] . '. Error description: ' . $response['error_description']); } $accessToken = $response['access_token']; // access токен $expiresIn = $response['expires_in']; // истекает через 3600 (сек.) (1 час) $refreshToken = $response['refresh_token']; // refresh токен - используется для обновления access токена $scope = $response['scope']; // области, к которым был получен доступ $tokenType = $response['token_type']; // тип токена $idToken = $response['id_token']; // id токена $created = $response['created']; // время создания токена 1537170421 // Сохраняем токен в сессии $_SESSION['token'] = json_encode($response); } |
3. Обновление access token’а с помощью refresh token’а
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// Извлекаем токен из сессии $accessToken = $_SESSION['token']; $client->setAccessToken( $accessToken ); // Если время жизни токена истекло, обновляем его if ( $client->isAccessTokenExpired() ) { // При обновлении токена refresh токен отсутствует // Поэтому сохраняем refresh токен в отдельную переменную $refreshTokenSaved = $client->getRefreshToken(); // Обновляем токен $client->fetchAccessTokenWithRefreshToken( $client->getRefreshToken() ); // Создаём новую переменную, в которую помещаем новый обновлённый токен $accessTokenUpdated = $client->getAccessToken(); // Добавляем в эту переменную старый refresh токен $accessTokenUpdated['refresh_token'] = $refreshTokenSaved; // Сохраняем в сессии новый токен и старый refresh токен $_SESSION['token'] = json_encode($accessTokenUpdated); // Устанавливаем новый токен $client->setAccessToken($accessTokenUpdated); } |
4. Пример работы с API Google на PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Извлекаем токен из сессии $accessToken = $_SESSION['token']; $client->setAccessToken( $accessToken ); // Получаем информацию о пользователе $oauth2 = new Google_Service_Oauth2($client); $userInfo = $oauth2->userinfo->get(); $userInfo->email; // Email $userInfo->gender; // Пол (male) $userInfo->givenName; // Имя (Alex) $userInfo->familyName; // Фамилия (Codd) $userInfo->name; // Полное имя (Alex Codd) $userInfo->id; // ID $userInfo->link; // Ссылка на профиль в google plus $userInfo->picture; // Ссылка на фотографию |