Аутентификация через Google
Приветствую Вас, пользователи руселлера! Сегодня мы сделаем ещё один шаг на пути реализации аутентификации через социальные сети. На этот раз возьмёмся за Google.
Прежде чем мы начнём, хочу поблагодарить всех, кто оставляет комментарии к данным статьям! Я принимаю во внимание все пожелания и в последующем постараюсь оправдать Ваши ожидания.
Если кто пропустил предыдущие части, то их можно найти тут:
Заметка. Пример, созданный в данном уроке, предназначен для работы на локальном сервере.
Шаг 1. Регистрация нового приложения
Для начала нам необходимо создать новое приложение на сайте Google Console.
В меню, расположенном слева, выбираем пункт "API Access". На открывшейся странице нажимаем на крупную синюю кнопку "Create an OAuth 2.0 client ID...".
Далее нам нужно прописать название нашего приложения:
Product name будет "Google Auth". Далее кликаем "Next".
После этого приступаем к более детальной настройке приложения:
Тип приложения (Application Type) выбираем Web Application. Your site and hostname формируем следующим образом: в выподающем списке выбираем http, адрес пишем localhost/google-auth
. После того как вы кликните за предел данного текстового поля, введённые нами данные несколько поменяются, так и должно быть. В результате, Google автоматически сформирует Redirect URI.
Далее, всю нужную для аутентификации информацию можем найти на той же странице в Google Console:
Запишем нужные нам данные в файл index.php:
<?php $client_id = '321934335118-fhpi6i4cpvp3643tvb7ipaha7qb48j3r.apps.googleusercontent.com'; // Client ID $client_secret = 'hHQRLbR6RJzHPSBPaF4T-Hk0'; // Client secret $redirect_uri = 'http://localhost/google-auth'; // Redirect URI
Шаг 2. Генерация ссылки для аутентификации
Для генерации ссылки нам потребуется адрес аутентификации и специальные параметры:
$url = 'https://accounts.google.com/o/oauth2/auth'; $params = array( 'redirect_uri' => $redirect_uri, 'response_type' => 'code', 'client_id' => $client_id, 'scope' => 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile' );
С помощью функции http_build_query, передав туда массив параметров, получим чередование ключей и значений, как в url адресе. Итак, генерируем ссылку и выводим на экран:
echo $link = '<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация через Google</a></p>'; // https://accounts.google.com/o/oauth2/auth?redirect_uri=http://localhost/google-auth&response_type=code&client_id=333937315318-fhpi4i6cp36vp43b7tvipaha7qb48j3r.apps.googleusercontent.com&scope=https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile
Итак, ссылка для аутентификации готова. Если мы сформировали все параметры правильным образом и получили верный url, то пройдя по ссылке, будем перенаправлены по адресу, указанному в настройках приложения ('http://localhost/google-auth'). Только теперь к этому адресу будет прикреплён специальный параметр code:
// Пример. В вашем случае код будет другой http://localhost/google-auth/?code=4/UTIIYyKbcYV8ruGsLsLqeg-tA3hp.Ys3PTfXQxhUYOl05ti8ZT3b110wOewI
Шаг 3. Получение токена
Начинать процедуру аутентификации мы можем в том случае, если к нам пришёл параметр code. Он нам нужен для того, чтобы получить специальный токен доступа, с помощью которого, в дальнейшем, мы достанем информацию о пользователе.
В первую очередь, снова сформируем параметры для этого запроса. Нам потребуется передать параметры: `client_id` - id приложения; `client_secret` - секретный ключ; `redirect_uri` - страница, на которую будет возвращён пользователь; `grand_type`, равный значению "authorization_code" - код активации; `code` - url параметр, пришедший от Google:
if (isset($_GET['code'])) { $result = false; $params = array( 'client_id' => $client_id, 'client_secret' => $client_secret, 'redirect_uri' => $redirect_uri, 'grant_type' => 'authorization_code', 'code' => $_GET['code'] ); $url = 'https://accounts.google.com/o/oauth2/token'; }
Далее нам нужно отправить POST запрос на адрес https://accounts.google.com/o/oauth2/token, передав перечисленные параметры. В PHP выполнить POST запрос можно с помощью создания curl запроса:
$curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, urldecode(http_build_query($params))); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $result = curl_exec($curl); curl_close($curl); $tokenInfo = json_decode($result, true);
В результате, при успешном выполнении запроса в переменную $tokenInfo будет записан ответ от Google в JSON формате. Данная строка содержит 4 параметра: access_token, который мы будем использовать в следующих запросах для извлечения информации о пользователе; token_type - тип токена; expires_in - время жизни токена; id_token - id токена:
{ "access_token" : "ya29.AHES6ZTGg0TYv6x-FIGNB438AlH4sTu54C8_6jCJ-GY6b8AeD7NSOxQ", "token_type" : "Bearer", "expires_in" : 3599, "id_token" : "eyJhbGciOiJSUzI1NiIsImtpZCI6IjQwODg0NDZmZjY2YjVjNjY4ZmE5MGJjYTEzZGJhMGI5NjhmMzc3ZGYifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiaWQiOiIxMDExMDMzMDM1ODE1NjEyNzMwMTQiLCJzdWIiOiIxMDExMDMzMDM1ODE1NjEyNzMwMTQiLCJ0b2tlbl9oYXNoIjoiTlVJU0R6T2lCeGlWQ3hkODM5RGRJZyIsImF0X2hhc2giOiJOVUlTRHpPaUJ4aVZDeGQ4MzlEZElnIiwiZW1haWwiOiJzdGFuaXNsYXYucHJvdGFzZXZpY2hAZ21haWwuY29tIiwiYXVkIjoiMzMzOTM3MzE1MzE4LWZocGk0aTZjcDM2dnA0M2I3dHZpcGFoYTdxYjQ4ajNyLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiY2lkIjoiMzMzOTM3MzE1MzE4LWZocGk0aTZjcDM2dnA0M2I3dHZpcGFoYTdxYjQ4ajNyLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiYXpwIjoiMzMzOTM3MzE1MzE4LWZocGk0aTZjcDM2dnA0M2I3dHZpcGFoYTdxYjQ4ajNyLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwidmVyaWZpZWRfZW1haWwiOiJ0cnVlIiwiZW1haWxfdmVyaWZpZWQiOiJ0cnVlIiwiaWF0IjoxMzYzNzcyOTM4LCJleHAiOjEzNjM3NzY4Mzh9.ZFkCkV5HIlQ-IefdCHtRLk0yCu5HRmaI90lmd57GMfxjLRiyjZ3pRUrbSngfwVww0d7RErvemKHJSsHQPk1A0IcVd64JpcR50WNcz7Qxq6SJyzsiHsAQtwvS-xms_Kw8kdoctl_7ZeE9tCD71vtczL429-pNihVY50goaZs5R14" }
Для того чтобы мы далее могли работать с данными параметрами, декодируем JSON строку с помощью функции json_decode и помещаем данные в массив, передав в качестве второго аргумента true.
Шаг 4. Получение информации о пользователе
Далее делаем запрос к Google API для получения информации о пользователе. Для этого к параметрам, которые мы сформировали на предыдущем шаге, добавим ещё один - access_token:
if (isset($tokenInfo['access_token'])) { $params['access_token'] = $tokenInfo['access_token']; $userInfo = json_decode(file_get_contents('https://www.googleapis.com/oauth2/v1/userinfo' . '?' . urldecode(http_build_query($params))), true); if (isset($userInfo['id'])) { $userInfo = $userInfo; $result = true; } }
Отправляем GET запрос по адресу https://www.googleapis.com/oauth2/v1/userinfo
.
В результате, если всё было сделано правильно, то получим JSON ответ примерно следующего вида:
{ "id": "101103303581561273014", "email": " Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript ", "verified_email": true, "name": "Станислав Протасевич", "given_name": "Станислав", "family_name": "Протасевич", "link": "https://plus.google.com/101103303581561273014", "picture": "https://lh6.googleusercontent.com/-11v2dm14whE/AAAAAAAAAAI/AAAAAAAAAGk/KGrBbK8SGJU/photo.jpg", "gender": "male", "locale": "ru" }
Полный код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/> <title>Аутентификация через Google</title> </head> <body> <?php $client_id = '321934335118-fhpi6i4cpvp3643tvb7ipaha7qb48j3r.apps.googleusercontent.com'; // Client ID $client_secret = 'hHQRLbR6RJzHPSBPaF4T-Hk0'; // Client secret $redirect_uri = 'http://localhost/google-auth'; // Redirect URIs $url = 'https://accounts.google.com/o/oauth2/auth'; $params = array( 'redirect_uri' => $redirect_uri, 'response_type' => 'code', 'client_id' => $client_id, 'scope' => 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile' ); echo $link = '<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация через Google</a></p>'; if (isset($_GET['code'])) { $result = false; $params = array( 'client_id' => $client_id, 'client_secret' => $client_secret, 'redirect_uri' => $redirect_uri, 'grant_type' => 'authorization_code', 'code' => $_GET['code'] ); $url = 'https://accounts.google.com/o/oauth2/token'; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, urldecode(http_build_query($params))); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $result = curl_exec($curl); curl_close($curl); $tokenInfo = json_decode($result, true); if (isset($tokenInfo['access_token'])) { $params['access_token'] = $tokenInfo['access_token']; $userInfo = json_decode(file_get_contents('https://www.googleapis.com/oauth2/v1/userinfo' . '?' . urldecode(http_build_query($params))), true); if (isset($userInfo['id'])) { $userInfo = $userInfo; $result = true; } } } ?> </body> </html>
Шаг 5. Извлечение информации о пользователе
Для просмотра большего количества полей загляните в содержание переменной $userInfo:
if ($result) { echo "Социальный ID пользователя: " . $userInfo['id'] . '<br />'; echo "Имя пользователя: " . $userInfo['name'] . '<br />'; echo "Email: " . $userInfo['email'] . '<br />'; echo "Ссылка на профиль пользователя: " . $userInfo['link'] . '<br />'; echo "Пол пользователя: " . $userInfo['gender'] . '<br />'; echo '<img src="' . $userInfo['picture'] . '" />'; echo "<br />"; }
Шаг 6. И снова дело за вами
Тут всё как и в предыдущих случаях. Если у нас есть такая информация, как ID пользователя, в первую очередь, нам необходимо проверить его наличие в нашей базе данных. Если пользователя с таким ID не существует, то значит он авторизовался с нашего сайта впервые, и мы внесём его в базу. Если пользователь уже есть, можем проверить, не изменились ли какие-то данные о нём, например, имя или ещё что-то. Если да, обновим запись.
После этого всё, что нам осталось сделать, так это создать сессию и поместить в неё информацию о нашем пользователе.
$_SESSION['user'] = $userInfo;
На странице выхода из системы просто удаляем сессию с помощью функции unset
.
Итог
Всё. Нам осталось разобрать процесс аутентификации через Facebook, и далее мы рассмотрим общий пример с прикруткой к БД.
Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/FveJSg7nUHU/lessons.php
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2024-09-30 » Как быстро запустить Laravel на Windows
- 2024-09-25 » Next.js
- 2024-09-05 » OpenAI рассказал, как запретить ChatGPT использовать содержимое сайта для обучения
- 2024-08-28 » Чек-лист: как увеличить конверсию интернет-магазина на примере спортпита
- 2024-08-01 » WebSocket
- 2024-07-26 » Интеграция с Яндекс Еда
- 2024-07-26 » Интеграция с Эквайринг
- 2024-07-26 » Интеграция с СДЕК
- 2024-07-26 » Интеграция с Битрикс-24
- 2024-07-26 » Интеграция с Travelline
- 2024-07-26 » Интеграция с Iiko
- 2024-07-26 » Интеграция с Delivery Club
- 2024-07-26 » Интеграция с CRM
- 2024-07-26 » Интеграция с 1C-Бухгалтерия
- 2024-07-24 » Что такое сторителлинг: техники и примеры
- 2024-07-17 » Ошибка 404: что это такое и как ее использовать для бизнеса
- 2024-07-03 » Размещайте прайс-листы на FarPost.ru и продавайте товары быстро и выгодно
- 2024-07-01 » Профилирование кода в PHP
- 2024-06-28 » Изучаем ABC/XYZ-анализ: что это такое и какие решения с помощью него принимают
- 2024-06-17 » Зачем вам знать потребности клиента
- 2024-06-11 » Что нового в работе Яндекс Метрики: полный обзор обновления
- 2024-06-11 » Поведенческие факторы ранжирования в Яндексе
- 2024-06-11 » Скорость загрузки сайта: почему это важно и как влияет на ранжирование
- 2024-05-27 » Подборка сервисов для расшифровки аудио в текст
- 2024-05-27 » PostgreSQL 16. Изоляция транзакций. Часть 2
- 2024-05-06 » Как настраивать конверсионные стратегии: работа над ошибками
- 2024-04-22 » Комментирование кода и генерация документации в PHP
- 2024-04-22 » SEO в России и на Западе: в чем основные отличия
- 2024-04-22 » SEO для международного масштабирования
- 2024-04-22 » Как использовать XML-карты для продвижения сайта
Одного яйца два раза не высидишь. К. Прутков |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.