S6 Studio

 

1С-Битрикс. Авторизация на сайте через ВКонтакте

Bitrix  Howto  ВКонтакте  • Евгений Задорин 12 апреля 2013 • Без комментариев

 

Начиная с 10 версии Битрикса в состав системы входит модуль «Социальные сервисы».

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

Из всех доступных сетей наиболее популярными я считаю ВКонтакте, Twitter и Facebook. В данной статье речь пойдет преимущественно о первой из них — vk.com.

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

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

1. Создание приложения ВК

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

Куча ресурсов, которую выдает Google на соответствующий запрос, выдает ссылку http://vk.com/apps.php?act=add, которая по факту давно уже не работает. Рабочая ссылка на текущий момент такова: http://vk.com/editapp?act=create.

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

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

2. Отладка процесса авторизации

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

И вся эта радость не работает. К примеру, при попытке авторизации, происходит редирект на текущую страницу с параметрами auth_service_id=Vkontakte&auth_service_error=1. Сейчас будем разбираться, почему такое происходит.

Битрикс автоматически инициализирует объект VK, в тегах <head> можно найти скрипт примерно такого содержания:


Ключевой здесь является строчка

BX.ajax.post(url_post, data, function(res){window.location = (res == "OK"? url_ok : url_err);});
Она выполняет ajax-запрос на текущую страницу, только с параметром ?login=yes, а затем, в зависимости от полученного результата редиректит нас либо на текущую страницу (параметр url_ok), либо на страницу с ошибочными параметрами.

Таким образом, чтобы разобраться в том, что именно возвращает запрос, необходимо эту строчку поправить следующим образом:

BX.ajax.post(url_post, data, function(res){ console.log(res); /* window.location = (res == "OK"? url_ok : url_err); */ });

Функцию, которая формирует код этого скрипта, можно найти в файле /bitrix/modules/socialservices/classes/general/vkontakte.php.

Важно! Всегда откатывайте отладочные изменения, внесенные в код ядра. В дальнейшем это позволит избежать проблем с обновлениями.

Не буду гадать, что именно будет в консоли. В любом случае, это должно дать определенную информацию о проблеме. В моем случае, например, там было стандартное сообщение от Битрикса — DB Query Error.

Включив отладочный режим (если кто не знает, посмотреть можно здесь), я выяснил, что проблема возникает непосредственно в процессе создания нового пользователя функцией CUser::Add.

3. Решение проблемы

Что,собственно, делает Битрикс при авторизации через социальные сети? Он создает в базе нового пользователя. В поле EXTERNAL_AUTH_ID хранится ИД социальной сети, а в поле XML_ID — непосредственный ИД пользователя в этой сети.

Логин пользователя обеспечивает сама соцсеть, а вот email она не выдает, ибо такова ее политика безопасности. В последних версиях Битрикса (по крайней мере в 12ой точно) в таблице b_user для поля EMAIL установлено значение по умолчанию NULL. Пустой email не отслеживается на уровне API, и добавление пользователя происходит на основе одного лишь логина.

В старых версиях есть большая вероятность, что поле EMAIL было сгенерировано с параметром NOT NULL, т.е. добавление записи в таблицу вызовет DB Query Error при отсутствующем email.

Проблема решается банальным образом — используем обработчик события OnBeforeUserAdd, в котором дадим новому пользователю фейковый адрес электронной почты. Делается это путем добавления в файл init.php следующего кода:

AddEventHandler("main", "OnBeforeUserAdd", Array("UserHandlers", "BeforeAdd"));

class UserHandlers
{
    function BeforeAdd(&$arFields)
    {
        if ( strlen($arFields['EXTERNAL_AUTH_ID']) > 0)
        {
            if ($arFields['EMAIL'] == '' && $arFields["LOGIN"] != '')
                $arFields['EMAIL'] = $arFields['LOGIN'] . '.not@real.email';
        }
    }
}

Разумеется, можно давать всем пользователям один email, что-нибудь вроде fake.not@real.email, но тогда придется ставить в настройках главного модуля флаг «Не проверять email на уникальность».

Вместо заключения

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

Не надо бояться экспериментов, просто не забывайте откатывать изменения кода ядра.

<< К блогу Добавить комментарий

 

comments powered by Disqus

Самые популярные

К прочтению обязательно