Вход через Google

Сервис «Google Аккаунты» позволяет через протокол OAuth 2.0 реализовать авторизацию пользователя на своем сайте. После прохождения авторизации можно получить имя, фамилию, e-mail и юзерпик пользователя.

Первым делом необходимо создать новый проект на https://console.developers.google.com/cloud-resource-manager.

Новый проект на console.developers.google.com

Создание проекта на console.developers.google.com

Далее, прейти в раздел «API и сервисы» → «Окно запроса доступа OAuth».

API и сервисы

И заполнить форму, в которой требуется указать: название приложения, email для связи, домен вашего сайта, ссылки на главную сайта и политику конфиденциальности.

Окно запроса доступа OAuth

После отправки формы будет предложено создать учетную запись, в списке нужно выбрать «Идентификатора клиента OAuth».

Создание учетной записи - Идентификатора клиента OAuth

Тип: веб-приложение, в «URI перенаправление» нужно указать адрес вашего PHP скрипта-обработчика, например https://example.com/login_google.php.

Создание учетной записи - Идентификатора клиента OAuth

После этого получим индификатор клиента и ключ.

Индификатор клиента и ключ Google OAuth

Сформируем ссылку для авторизации пользователя:

$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

Перейдя по такой ссылки увидим следующий запрос:

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

После подтверждения запроса, будет выполнен редирект на указанный 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);
	}
}
PHP

Результат:

array(
	'id' => '123456789123456789',
	'email' => 'mail@example.com',
	'verified_email' => true,
	'name' => 'Иван Иванов',
	'given_name' => 'Иван',
	'family_name' => 'Иванов', 
	'picture' => 'https://.../photo.jpg', 
	'locale' => 'ru'
}

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

14.01.2020
25044

Комментарии 2

Александр Фирюбин Александр Фирюбин
28 апреля 2020 в 19:05
0
Добрый день!1. Первый вход срабатывает, а следующие нет. В чем может быть проблема?2. 'expires_in' => 3599 - что это?
Stepanoff Yuriy Stepanoff Yuriy
11 октября 2021 в 16:42
-1
Ураа заработало спасибо автору!!!

, чтобы добавить комментарий.

Другие публикации

Авторизация на сайте через Яндекс
Сервис Яндекс.Паспорт позволяет через API реализовать авторизацию пользователя на своем сайте. После разрешения доступа...
9928
+8
Бот Телеграм на PHP
Примеры как зарегистрировать бота в Телеграм, описание и взаимодействие с основными методами API.
96022
+40
Авторизация через .htaccess
У сервера apache есть возможность сделать базовую авторизацию. Чтобы закрыть директорию, в неё нужно поместить два файла – .htaccess и .htpasswd.
22290
+2
Генерация токенов в PHP
Токен – уникальная последовательность символов, используется для обеспечения информационной безопасности, используется в авторизации и защите от несанкционированного доступа. Рассмотрим возможности...
15613
+4
Авторизация через GitHub
GitHub имеет свой API для авторизации по OAuth, что позволяет сделать авторизацию зарегистрированных там пользователей на своем сайте.
3437
+2
Использование API Яндекс Диска на PHP
Можно найти множество применений Яндекс Диска на своем сайте, например, хранение бекапов и отчетов, обновление прайсов,...
42182
+15