Библиотека для авторизации через Хабрахабр

в 3:24, , рубрики: api, php, авторизация, Алгоритмы, хабрахабр, Хабрахабр API, метки: , , ,

Доброе утро всем, кто уже читает Хабрахабр!

Работая над «Клубом анонимных Дедов Морозов» для Хабра, нам пришлось решить проблему с авторизацией пользователя через Хабр. На 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

Источник

Поделиться

* - обязательные к заполнению поля