Аутентификация через Google

Приветствую Вас, пользователи руселлера! Сегодня мы сделаем ещё один шаг на пути реализации аутентификации через социальные сети. На этот раз возьмёмся за Google.

Прежде чем мы начнём, хочу поблагодарить всех, кто оставляет комментарии к данным статьям! Я принимаю во внимание все пожелания и в последующем постараюсь оправдать Ваши ожидания.

Если кто пропустил предыдущие части, то их можно найти тут:

sourse

Заметка. Пример, созданный в данном уроке, предназначен для работы на локальном сервере.

Шаг 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": "stanislav.protasevich@gmail.com",
  "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, и далее мы рассмотрим общий пример с прикруткой к БД.

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.ruseller.com
Автор: Станислав Протасевич
Урок создан: 20 Марта 2013
Просмотров: 95230
Правила перепечатки


5 последних уроков рубрики "PHP"

  • Фильтрация данных с помощью zend-filter

    Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.

  • Контекстное экранирование с помощью zend-escaper

    Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

  • Подключение Zend модулей к Expressive

    Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

  • Совет: отправка информации в Google Analytics через API

    Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

  • Подборка PHP песочниц

    Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

или авторизуйтесь, чтобы добавлять комментарии, оценивать уроки и сохранять их в личном кабинете
  • 21 Марта 2013 13:00
    shidzuo
    http://ruseller.com/lessons.php?rub_id=29&id=1510
  • 21 Марта 2013 19:47
    denis_sky
    Большое спасибо, за урок(и) жду с нетерпением продолжение!
    • 22 Марта 2013 11:33
      igontarev
      авторизовался только для того, чтобы сказать, поменяй аватарку :) уроки про аутентификацию супер, еще не пробовал на практике, но обязательно займусь!
  • 24 Апреля 2013 17:01
    igontarev
    почему-то ошибка The requested URL /oauth2callback was not found on this server. пока не разобрался почему страница не найдена
    • 24 Апреля 2013 17:18
      stas.protasevich
      может именно в данном адресе проблема? "/oauth2callback"
    • 15 Июля 2015 17:39
      Turtleiren Turtle
      решили проблему? У меня при http://... такое же выскакивает. При https - сообщает, что сервер не защищен и вернуться из авторизации не дает(( что делать - непонятно(( Да, и Гугл слегка изменил форму регистрации
  • 10 Июня 2013 17:52
    Андрей Лопушанский
    В ответ на var_dump($_GET); получаю array(2) { ["/auth/google/"]=> string(0) "" ["code"]=> string(62) "4/yD92-XjBdeOFADTiRNQr1RWdEMrz.Euyi3huDOlAYOl05ti8ZT3b774hdfgI" } и дальше я так понял токены не получаю, как дальше проверить в чем загвоздка
  • 27 Мая 2014 13:11
    Рома Бурцев
    можно ли проверять от кого пришел юзер с CODE-ом - от гугла, вк или вообще от непонятно кого? я сейчас для каждого сервиса авторизации по code пытаюсь получить токен, это как-то неправильно
  • 15 Августа 2014 17:08
    fly30462
    ДРУЖИЩЕ!!! ОГРОМНОЕ СПАСИБО! Я даже не поленился пройти авторизацию, что бы выразить благодарность за это работающее, удобное и простое решение! СПАСИБО!
  • 13 Октября 2014 02:33
    happening
    Нужно еще авторизацию через ютуб
  • 23 Октября 2014 17:22
    anton9010
    а зачем $userInfo = $userInfo;?
  • 27 Октября 2014 17:56
    0line
    Ссылка на гугл старая. по ней открывается совсем другая страница. Кому надо, вот ссылка на документацию по созданию приложения: https://developers.google.com/+/web/signin/?hl=ru#step_1_create_a_client_id_and_client_secret
  • 16 Ноября 2014 14:35
    Valeriu Vodnicear
    У вас этот урок работает ? Он работал , но недавно не стал больше работать.В коде всё проверил.
  • 7 Марта 2016 01:13
    Alex Pirogoff
    Спасибо. Все круто!
  • 21 Мая 2016 03:49
    Святослав Настишин
    Не работает не удается получить токен вот такая ошибка 400. That’s an error. Error: invalid_request Required parameter is missing: response_type
  • Комментарий удален
    • 22 Марта 2013 08:48
      Xamle
      да да )))
^ Наверх ^