Расширяем социальные сервисы своим сервисом авторизации

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


Расширяем социальные сервисы своим сервисом авторизации

В этом посте я рассмотрю как можно написать свой соц.сервис авторизации.
scr0.png

Обработчик

За все отвечает обработчик OnAuthServicesBuildList.
AddEventHandler('socialservices', 'OnAuthServicesBuildList', array('CSocServHandlers', 'GetDescription'));
Код самого обработчика достаточно прост

scr1_code.jpg

Регистрируем уникальный ID, указываем класс, с каким будем работать, имя и css-класс иконки. Сразу же видим результат на странице настроек модуля Соц.сервисы

scr1.jpg

Иконка показывается Яндекса, так как CSS стиль не определен, но это я не буду рассматривать.

Класс

Далее идет класс, который и зарегистрировал обработчик. В данном случае это CSocServDit. Он может получать расширения от двух других классов
class CSocServDit extends CSocServAuth  
или  
class CSocServDit extends CSocServOpenID
Второй вариант это схема OpenID-клиент и OpenID-сервер, стандартный протокол, рассматривать не будем. Все остальное (любые варианты внешней авторизации) решает первый класс, расширенный от CSocServAuth. Отличительная особенность - в случае OPenID нет настроек, в первом случае за это отвечает метод GetSettings. Формат отдаваемых параметров ровно такой же, как у страницы настроек любого модуля.

scr2_code.png

Получаем

scr2.png

Опишу только в общих чертах оставшиеся методы класса - в сумме их три - первый мы рассмотрели.

Метод GetFormHtml отвечает за формирование ссылки для перехода

scr7.png

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

scr3.png

Далее метод Authorize, вызывается всегда, когда в url передан параметр auth_service_id=ID_вашего_сервиса (подразумевается, что по данному URL стучится внешний сервер. Там и идет обработка входных параметров, проверяется ключ сессии, ну и любое другое, что вы сочтете нужным проверить. В случае успеха, происходит _либо_ авторизация пользователя (если он уже есть), _либо_ создание (и последующая авторизация) нового пользователя. Это все делается одной строкой, вам не надо ничего делать самим:

$bSuccess = $this->AuthorizeUser($arFields);
Полный код метода

scr5.png

Как видите, структура проста:
- рестарт буфера вывода
- проверка ключей (которые получены от удаленного сервера)
- формирование массива для создания пользователя (если его нет), особенности оного которые: в XML_ID рекомендуется держать уникальный ID пользователя на внешнем сервере, EMAIL может быть пустым
- авторизация, либо создание и авторизация пользователя (авторизация идет как раз по тому уникальному ID
- формирование JS для редиректа (почему JS - потому что все это действие происходит в popup окне, и редирект нам надо делать в родительском)

Далее осталось рассмотреть скрипт-приемник на удаленном сервере. Собственно, то, куда и будет редиректиться пользователь с нашего ресурса. Так как в моем случае он тоже на Битрикс, код получился максимально понятным (проверяется ключ, и если все ок, отдаем данные текущего пользователя по ссылке redirect_uri)


scr8.png

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

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

scr9.png

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

scr4.png


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

 

 

Источник: http://dev.1c-bitrix.ru/community/webdev/user/11948/blog/7465/

Назад в раздел

Подписаться на новые материалы раздела:














CAPTCHA