Доброе утро всем, кто уже читает Хабрахабр!
Работая над «Клубом анонимных Дедов Морозов» для Хабра, нам пришлось решить проблему с авторизацией пользователя через Хабр. На Dirty пользователю предлагалось разместить у себя в профиле особую ссылку, наличие которой проверялось их сервером. Мы же решили пойти другим путем и максимально упростить авторизацию для человека, решившего принять участие в акции.
Хотя в итоге библиотека HabraAuth, о которой пойдет речь в топике, не была использована, но она использует тот же принцип авторизации, что и на habra-adm.ru — пользователь вводит свой ник на Хабре, и с аккаунта почтового робота или с аккаунта разработчика ему приходит особая ссылка по Хабропочте, перейдя по которой он и подтверждает владение своим аккаунтом.
Для конечного пользователя при использовании HabraAuth авторизация выглядит и того проще: он вводит свой ник, жмет «Войти» и сервер перекидывает его в Хабропочту, где ему остается только нажать ссылку «Войти» еще раз.
Рассмотрим пример подключения HabraAuth для вашего сайта. Для начала скачайте последнюю версию библиотеки — сделать это лучше всего, клонировав репозиторий на GitHub:
git clone https://github.com/kafeman/HabraAuth.git
Сама библиотека находится в файле HabraAuth.class.php
, его нужно подключить в первую очередь:
<?php
include('HabraAuth.class.php');
?>
Теперь создадим простую форму для авторизации. Например, такую:
<h1>Пример авторизации через Хабр</h1>
<form method="post">
<p>Введите ваш ник на Хабре:</p>
<p>
<input type="text" name="login">
<input type="submit" value="Авторизуй меня!">
</p>
</form>
И напишем обработчик для нее:
// Это небольшой конфиг, который использует библиотека
// Его можно объединить с конфигом вашего сайта
$config = array(
// Адрес callback-страницы
// Ссылка на нее будет отправлена по Хабропочте
'callback' => 'http://localhost/sample/callback.php',
// Соль
// Придумайте что-нибудь посложнее, иначе ничего не получится ;-)
'salt' => 'qwerty',
// Куки от аккаунта, с которого будет слаться почта
// Будьте осторожны - получив их, злоумышленник зайдет под вашим аккаунтом на Хабр
// Держите их в очень надежном месте
'cookies' => array(
'PHPSESSID' => '8ba44cc67a851d1c43d740c356665061',
'hsec_id' => 'c086a2c37f395cbb9aa7b064c8c712db',
),
);
// Создаем новый объект HabraAuth
// К нему мы и будем обращаться
$habraAuth = new HabraAuth($config);
// Метод Auth генерирует ссылку и шлет ее по Хабропочте
$habraAuth->Auth($_POST['login']);
// Перенаправляем пользователя в Хабропочту, чтобы ему же было удобнее
header('Location: http://habrahabr.ru/users/none/mail/');
Теперь создадим callback-страницу, на которою пользователь перейдет из Хабропочты:
<?php
// Если не пришло имя пользователя и хэш, то перенаправляем на форму логина
if (empty($_GET['user']) || empty($_GET['hash'])) {
header('Location: /sample/login.php');
exit();
}
// Подключаем библиотеку
include __DIR__ . '/../HabraAuth.class.php';
// Конфиг, тут можно задать только соль
$config = array('salt' => 'qwerty');
// Создаем новый объект HabraAuth
$habraAuth = new HabraAuth($config);
// Проверяем хэш
if (!$habraAuth->CheckAuth($_GET['user'], $_GET['hash'])) {
header('Location: /sample/login.php');
exit();
}
// TODO - заносим пользователя в БД или просто приветствуем его
echo 'Привет, ' . $_GET['user'] . ', как твои хабродела?';
?>
В итоге получился почти OAuth :-)
Единственная проблема, с которой вы можете столкнуться — ReadOnly пользователи со злости начнут вводить в форму имена в ничем неповинных Хабролюдей, которым начнет приходить в личку «Спам». Чтобы решить эту проблему, можно поставить каптчу или заносить пользователей в свою базу данных, чтобы не слать им сообщение повторно.
Автор: kafeman