Регистрация в один клик от Google
Здравствуйте, уважаемые читатели Easy-Code.ru. В этом уроке мы сделаем регистрацию для сайта с помощью Google. Сервисы Гугла предоставляют множество полезных возможностей, одна из них — это регистрация с помощью аккаунта Google. Все у кого есть аккаунт могут нажатием одной кнопки зарегистрироваться у вас на сайте с их почтой, именем и фото.
Google использует OAuth2 протокол для организации обмена информацией между вашим сервером и серверами Гугла. Для серверной части этого процесса мы будем использовать PHP библиотеку Google, которая сделает все за нас.
Использование подобной системы упрощает процесс регистрации/авторизации пользователей на сайте и уменьшает объем вашей работы:
- Нет необходимости в создании регистрации и форм для логина
- Не надо писать функцию восстановления пароля
- Моментальная регистрация: вы получаете почту, имя и фото пользователя в один клик.
- Почта уже проверена Google, не надо отправлять письмо подтверждения.
- Высокая безопасность, предоставленная Гуглом.
Конечно, все это работает, только если у человека есть аккаунт Google.
Настройка
Для начала необходимо создать новое приложение по этой ссылке Google’s API Console. Следуйте этой инструкции. После завершения полученные ключи надо будет поместить в setup.php.
Запустите schema.sql (найдете его в исходниках) с помощью phpMyAdmin или другой системы для управления MySQL. Так мы создадим таблицу glogin_users, в которой будем хранить информацию о пользователях. После необходимо занести информацию для соединения с бд в файл setup.php.
PHP
Наша регистрация использует систему авторизации Google. Это значит, сто посетители будут переходить по ссылке с нашей страницы на страницу Google, где им будет предложено предоставить доступ к своим данным нашему приложению. Потом их перенаправят обратно на наш сайт. Таким образом мы получим информацию о пользователе. Краткое описание процесса:
- Когда посетитель жмет на “Sign in with Google” его перенаправляет на страницу авторизации Google, где он видит к каким данным требует доступ наше приложение.
- Если пользователь соглашается, он перенаправляется обратно на наш сайт, со специальным кодом в URL, используя который мы получаем информацию о нем.
- Далее мы записываем полученную информацию в базу на нашем сервере.
Для работы с базой мы будем использовать небольшую библиотеку Idiorm library, которую вы найдете в исходниках.
Структура нашего PHP кода следующая:
- index.php главный файл, в котором содержится форма
- setup.php – файл, где хранится информация о соединении с бд и ключи, полученные из Google’s API Console;
- Папка library – содержит Idiorm library, Google’s PHP library, и класс для работы со временем.
Рассмотрим код index.php
require 'setup.php'; // создаем клиент Google API $client = new apiClient(); // настраиваем $client->setClientId($client_id); $client->setClientSecret($client_secret); $client->setDeveloperKey($api_key); $client->setRedirectUri($redirect_url); $client->setApprovalPrompt(false); $oauth2 = new apiOauth2Service($client); // если задан этот параметр, то пользователь был перенаправлен обратно на сайт if (isset($_GET['code'])) { // после вызова этого метода мы можем получить информацию о пользователе $client->authenticate(); // получаем информацию $info = $oauth2->userinfo->get(); // ищем пользователя в базе $person = ORM::for_table('glogin_users')->where('email', $info['email'])->find_one(); if(!$person){ // если не нашли, зарегистрируем его $person = ORM::for_table('glogin_users')->create(); // достаем значения, которые будут занесены в бд $person->email = $info['email']; $person->name = $info['name']; if(isset($info['picture'])){ // если у пользователя есть фото $person->photo = $info['picture']; } else{ // если нет, используем стандартную $person->photo = 'assets/img/default_avatar.jpg'; } // запись в бд $person->save(); } // создаем сессию с идентификатором пользователя $_SESSION['user_id'] = $person->id(); // редирект на страницу демонстрации header("Location: $redirect_url"); exit; } // выход if (isset($_GET['logout'])) { unset($_SESSION['user_id']); } $person = null; if(isset($_SESSION['user_id'])){ // достаем пользователя из бд $person = ORM::for_table('glogin_users')->find_one($_SESSION['user_id']); }
Разберем, что происходит в данном коде. Мы проверяем задан ли элемент code в массиве $_GET. Как говорилось выше, этот элемент указывает на то, что пользователь разрешил доступ и был перенаправлен обратно. После мы запрашиваем информацию о пользователе и записываем в базу. Идентификатор пользователя мы записываем в сессию, таким образом мы будем знать, что пользователь авторизован.
Также мы создаем переменную $person. В ней содержится объект, который вернула библиотека для работы с бд (Idiorm library), этот объект содержит все поля из таблицы glogin_users. Использовать этот объект мы будем ниже.
HTML
HTML код также содержится в index.php, поэтому мы имеем доступ к переменной $person, которую будем использовать для вывода имени и фотографии пользователя.
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Google Powered Login Form | Tutorialzine Demo</title> <!-- The stylesheets --> <link rel="stylesheet" href="assets/css/styles.css" /> <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Open+Sans+Condensed:300,700" /> <!--[if lt IE 9]> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> </head> <body> <h1>Login Form</h1> <div id="main"> <?php if($person):?> <div id="avatar" style="background-image:url(<?php echo $person->photo?>?sz=58)"></div> <p>Welcome, <b><?php echo htmlspecialchars($person->name)?></b></p> <p>You registered <b><?php echo new RelativeTime($person->registered)?></b></p> <a href="?logout">Logout</a> <?php else:?> <a href="<?php echo $client->createAuthUrl()?>">Sign in with Google</a> <?php endif;?> </div> </body> </html>
Мы проверяем, инициализирована ли переменная $person и выводим имя и фото. В противном случае выводим форму для регистрации.
Все готово! Вы можете добавить регистрацию от Google к уже существующему сайту, также можно объединить ее с другими соц сетями, поддерживающими OAuth авторизацию.
Нет комментариев