Сервис «Google Аккаунты» позволяет через протокол OAuth 2.0 реализовать авторизацию пользователя на своем сайте. После прохождения авторизации можно получить имя, фамилию, e-mail и юзерпик пользователя.
Первым делом необходимо создать новый проект на https://console.developers.google.com/cloud-resource-manager.
Далее, прейти в раздел «API и сервисы» → «Окно запроса доступа OAuth».
И заполнить форму, в которой требуется указать: название приложения, email для связи, домен вашего сайта, ссылки на главную сайта и политику конфиденциальности.
После отправки формы будет предложено создать учетную запись, в списке нужно выбрать «Идентификатора клиента OAuth».
Тип: веб-приложение, в «URI перенаправление» нужно указать адрес вашего PHP скрипта-обработчика, например https://example.com/login_google.php
.
После этого получим индификатор клиента и ключ.
Сформируем ссылку для авторизации пользователя:
$params = array(
'client_id' => 'ИНДИФИКАТОР_КЛИЕНТА',
'redirect_uri' => 'https://example.com/login_google.php',
'response_type' => 'code',
'scope' => 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile',
'state' => '123'
);
$url = 'https://accounts.google.com/o/oauth2/auth?' . urldecode(http_build_query($params));
echo '<a href="' . $url . '">Авторизация через Google</a>';
Перейдя по такой ссылки увидим следующий запрос:
После подтверждения запроса, будет выполнен редирект на указанный PHP-скрипт, в GET-параметр добавится код авторизации, меняем его на токен и получаем данные пользователя.
<?php
if (!empty($_GET['code'])) {
// Отправляем код для получения токена (POST-запрос).
$params = array(
'client_id' => 'ИНДИФИКАТОР_КЛИЕНТА',
'client_secret' => 'СЕКРЕТ_КЛИЕНТА',
'redirect_uri' => 'https://example.com/login_google.php',
'grant_type' => 'authorization_code',
'code' => $_GET['code']
);
$ch = curl_init('https://accounts.google.com/o/oauth2/token');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$data = curl_exec($ch);
curl_close($ch);
$data = json_decode($data, true);
if (!empty($data['access_token'])) {
// Токен получили, получаем данные пользователя.
$params = array(
'access_token' => $data['access_token'],
'id_token' => $data['id_token'],
'token_type' => 'Bearer',
'expires_in' => 3599
);
$info = file_get_contents('https://www.googleapis.com/oauth2/v1/userinfo?' . urldecode(http_build_query($params)));
$info = json_decode($info, true);
print_r($info);
}
}
Результат:
array(
'id' => '123456789123456789',
'email' => 'mail@example.com',
'verified_email' => true,
'name' => 'Иван Иванов',
'given_name' => 'Иван',
'family_name' => 'Иванов',
'picture' => 'https://.../photo.jpg',
'locale' => 'ru'
}
Имя и фамилия пользователя могут быть не указаны.