Авторизация на сайте через Google

Авторизация на сайте через Google

Сервис «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'
}

Кстати, Имя и Фамилия пользователя могут быть не указаны.