Вход через Google

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

1

Первым делом необходимо создать новый проект на 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

2

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

$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

3

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

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

Александр Фирюбин Александр Фирюбин
28 апреля 2020 в 19:05
Добрый день!1. Первый вход срабатывает, а следующие нет. В чем может быть проблема?2. 'expires_in' => 3599 - что это?
Алек Садлер Алек Садлер
11 января 2023 в 12:48
expires_in - это время жизни токена
Stepanoff Yuriy Stepanoff Yuriy
11 октября 2021 в 16:42
Ураа заработало спасибо автору!!!
Сергей Ильин Сергей Ильин
23 апреля 2023 в 18:02
Когда отправляю код получаю, не пойму в чём дело(
Array ( [error] => invalid_grant [error_description] => Malformed auth code. )
Сергей Ильин Сергей Ильин
23 апреля 2023 в 18:09
К коду из url всякая шляпа добавлялась, на пыхе получилось так
'code'          => urldecode($_GET['code'])
Андрей Мирный Андрей Мирный
24 апреля 2023 в 05:00
Не совсем понял для чего нужны параметры: 'response_type' => 'code' и 'state'=> '123'. И что в них указывать?

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

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

Авторизация на сайте через Яндекс
Сервис Яндекс.Паспорт позволяет через API реализовать авторизацию пользователя на своем сайте. После разрешения доступа...
16510
+7
Бот Телеграм на PHP
Примеры как зарегистрировать бота в Телеграм, описание и взаимодействие с основными методами API.
140357
+44
Авторизация через .htaccess
У сервера apache есть возможность сделать базовую авторизацию. Чтобы закрыть директорию, в неё нужно поместить два файла – .htaccess и .htpasswd.
35563
+3
Генерация токенов в PHP
Токен – уникальная последовательность символов, используется для обеспечения информационной безопасности, используется в авторизации и защите от несанкционированного доступа. Рассмотрим возможности...
23302
+6
Авторизация через GitHub
GitHub имеет свой API для авторизации по OAuth, что позволяет сделать авторизацию зарегистрированных там пользователей на своем сайте.
5290
+3
Использование API Яндекс Диска на PHP
Можно найти множество применений Яндекс Диска на своем сайте, например, хранение бекапов и отчетов, обновление прайсов,...
55558
+20