Интеграция OpenID в ваш сайт

OpenID - несомненно, полезный механизм как для пользователей, так и для владельцев сетевых ресурсов.

Пользователям он даёт:

  • Возможность запомнить один логин и один пароль и использовать его везде
  • Не нужно каждый раз вводить одни и те же данные. В идеале каждый сайт будет требовать только ввода данных, специфичных именно для этого сайта
  • Не нужно регистрироваться. Хотя часто это недолго (несколько минут), но регистрироваться на каждом сайте напрягает

Для владельцев сайтов тоже есть преимущества:

  • Т.к. это удобнее пользователю, больше пользователей будет регистрироваться
  • Возможность получить данные пользователя, которые в другом случае он поленился бы вводить (хотя и не скрывает)
  • В перспективе - возможность обновления данных о пользователе (как контактной информации, так и информации о его связях, вкусах и т.д. и т.п.)

Благо, сейчас достаточно хороших библиотек для работы с OpenID и достаточно OpenID-провайдеров (в том числе многие социальные сети), чтобы эта фича была востребована на сайте.

Сейчас я расскажу и покажу, как за пару часов добавить поддержку OpenID к существующему сайту. Я не рассматриваю случаи, когда сайты построены на основе популярных движков (вроде WordPress или Drupal), для которых существуют плагины, делающие за вас всю работу. Речь будет идти о сайте в самом общем случае.

Эту статью я решил написать после подключения OpenID к своему сайту maskas.ru, на котором можно посмотреть рабочую версию того, что я сейчас покажу.

Работать это, как и сам сайт, будет на PHP с использованием библиотеки PHP OpenID Library.

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

Архив со всеми скриптами, которые будут использоваться, можно скачать с меня: здесь.

Итак, приступим.

1

Для начала скачайте библиотеку и перенесите папочку Auth туда, где php-скрипты смогут найти её при использовании include.

2

Теперь создадим таблицу связей OpenID-идентификаторов с пользователями.


CREATE TABLE `openid_user_ref` (
`openid` varchar(255) NOT NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`openid`)
)

3

Нужно добавить куда-нибудь на сайт (скорее всего, туда же, где находится форма логина) форму с одним полем ввода для OpenID-идентификатора, перенаправляющую нас на страницу, на которой будет происходить проверка подлинности идентификатора. Выглядеть это будет примерно так:

<form method="get" action="openid_verify.php">
OpenID: <input name="openid_url" type="text" />
</form>

Для лучшей узнаваемости можно добавить к полю ввода картинку вроде такой.

4

Переписываем файлы из моего примера в корень своего сайта (потом вы сможете их поместить куда нужно, придётся только кое-где поменять пути). Файл openid_verify.php вам трогать, скорее всего, не придётся - он занимается тем, что проверяет правильность введённого OpenID-идентификатора и перенаправляет пользователя на сайт OpenID-провайдера для проверки. В нём вам может понадобиться изменить только список запрашиваемых данных пользователя здесь:

$sreg_request = Auth_OpenID_SRegRequest::build(
// Required
array('nickname'),
// Optional
array('fullname', 'email','gender'));

Файл openid_complete.php уже интереснее. На него пользователь попадает после проверки провайдером и здесь совершаются все необходимые действия по добавлению пользователя в базу или логину. Я написал просты заглушки на нужные функции (создания пользователя, его логина в систему), которые вам нужно будет заменить на что-то более подходящее.

В моём примере логика такая: если OpenID-идентификатор нам неизвестен, мы автоматически создаём нового пользователя с данными, предоставленными OpenID-провайдером. Если идентификатор известен - логиним пользователя.

При создании пользователя используется ник, полученный от OpenID-провайдера. Если ник не получен или полученный ник не подходит (что проверяется функцией check_nickname), то он генерируется из OpenID-идентификатора.

Список данных о пользователе, которые теоретически можно получить от провайдера, достаточно скромен (т.к. используется расширение SRE, описанное в статье обмен пользовательскими данными в OpenID), но все основные данные получить можно.

Для начала вы можете просто распаковать пример в какую-либо папку на сервере и запустить - он работоспособен и сам по себе (особенно если указать правильные параметры для подключения к MySQL в файле openid_common.php). После замените заглушки по созданию пользователя и логину на подходящие для вашего сайта функции и готово - пользователи могут регистрироваться и заходить на ваш сайт при помощи OpenID.

Примечания:

Если вы используете библиотеку под Windows, то вам, скорее всего, нужно установить переменную Auth_OpenID_RAND_SOURCE из файла CryptUtil.php в null.

Не забывайте чистить директорию со временными файлами (путь к ней указывается при создании объекта Auth_OpenID_FileStore). Если ваш сайт достаточно посещаемый, то через время она может начать занимать заметное место на диске.

Я не рассматривал здесь вопрос прикрепления OpenID-идентификаторов к существующим пользователям и объединения OpenID-идентификаторов в одного пользователя. Всё это можно дописать на основе вышеизложенного.

Сделал как у вас ничего не получается.
Просто выдаётся белая страница.

Затык происходит на строчке:
$auth_request = $consumer->begin($openid_url);

Далее неё не проходит. Пробовал идентификатор от livejournal.com А у вас работает?

Ещё вопрос: какую библиотеку из тех что вы посоветовали на странице http://openidenabled.com/php-openid/ использовать? версии 1 или 2? У вас какая?

Эта библиотка использует PEAR для соединения с БД.

Спасибо, уже допедрил и сделал :)
Всё работает!

И сервер тоже сделал.

Осуществляем лучший евроремонт под ключ в Москве на доступных условиях, мы производим отделочные работы и выгодный ремонт квартир и офисов по умеренным ценам. На нашем сайте Вы найдете публикации про штукатурку стен и электрику в квартире, хороший способ быстро заказать ремонт под ключ.

Сделаем современный евроремонт под ключ в Москве на разумных условиях, мы производим отделочные работы и практичный ремонт офисов и квартир по умеренным ценам. На нашем сайте Вы найдете статьи про укладку ламината и поклейку обоев, замечательная возможность недорого заказать евроремонт.

Только на сайте family-baby вы найдёте полный справочник детских заболеваний: астма, аритмии, заболевания сердца. Наш сайт предназначен для заботливых родителей, которые ценят здоровье своих детей!

ПРОМТЭК Промышленный портал обеспечивает обмен информацией между участниками рынка промышленной торговли и производства. На портале ежедневно размещается информация о тысячах товаров , позволяя пользователям быстро найти поставщиков и потребителей.