Условия обработки персональных данных

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

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

X

Как работает авторизация через соц сети в bitrix- выставляем привязки и редирект

Мы нажимаем кнопочку на отрытой странице , например test.ru, например vk . Происходит всплытие окна с авторизацией на vk. Во всплывающем окне происходит редирект на test.ru и происходит авторизация в фоновом режиме.
Что мы видим:
1.в табличке b_user появилась новая запись (это можно посмотреть в админ панели).
2. Если хорошо покопаться в табличках битрикса появилась запись в b_socialservices_user

Рассмотрим табличку bitrix b_user и пользователя вошедшего через vk.
Значение в поле EXTERNAL_AUTH_ID=socservices .

Если выставить это значение в Null , запросом, то получим … обычного пользователя.

Т.е. до выставления этого значения , логин-пароль заменить нельзя было, а если выставить- то можно. Загляните в админку в обычного пользователя и на пользователя зашедшего через vk. В vk- нет логина пароля пользователя.

Теперь посмотрим на табличку bitrix b_socialservices_user.
У нее есть много полей, заполненных из социальной сети, e-mail , имена и другие полезные данные.
в ней есть значение USER_ID=54; Т.е. мы имеем, что табличка привязана к пользователю в табличке b_user с id=54.

Теперь, сделаем такую штуку.Зайдем под пользователем с id=10, через обычного пользователя. И сделаем из под него привязку к пользователю vk чеерз компонент «bitrix:socserv.auth.split» . И… мы увидим что в b_socialservices_user значение USER_ID=10. Просто сменилась привязка к пользователя из социальной сети к другому пользователю.

А теперь фишка!. Если вдруг мы удаляем привязку из пользователя с id=10. Полностью стирается запись в таблице b_socialservices_user.

Теперь, как привязать одного пользователя из vk к любому пользователю обычному. Привязать означает- если человек зашел через vk он попадает в нужного пользователя, по заданной вами логике. У меня логика была в поиске емайла и привязка к пользователю по емайлу.

Вот полезная функция. Привязка обычного пользователя к пользователю из vk. Мы на вход подаем id нужного пользователя и логин vk из таблички b_user. (в b_user- логин заносится автоматически в поле $arUser[‘LOGIN’]).

Теперь о приколах bitrix для пользователя из социальной сети.

1 при входе черз соцсеть происходит кеширование init.php !после отработки авторизации. Если вы 1 раз изменили файл, то то надо логиниться еще раз. Иначе код не применится. Т.е die() команда с первого раза не сработает! Вы не сможете сразу увидеть результат тестирования.

2 заполнение привязки из соцсети в табличку b_socialservices_user происходит ПОСЛЕ события OnAfterUserAdd. Т.е не мы можем отследить заполение этой таблички сразу посkе авторизации. Поэтому для различных привязок пользователей в файл header.php надо вставить хак . (возможно его можно вставить еще куда нибудь, я не нашел) . В хаке проверяем, пользователь у нас из социально сети или нет. Если из социальной сети, то привязываем его к нужному пользователю и авторизуем его

мой вариант кода, комментировать ничего не буду. Тут я решал свои задачи.

А далее полный код привязки, оставлю без коментариев и с внутренней кривизной. Если надо- пользуйте. Там привязывают по e-mail. Если пустой е-mail во вставляет заглушку. И еще происходит создание нормального пользователя битрикса. И к нему все привязываются.

Всего комментариев: 7

  1. Валя /

    1. перетащить все данные из vkuser в нормального пользователя;
    2. не забыть удалить пользователя с логином VKuser…; Дабы не засирать БД;
    Спасибо за статью)

    1. alex / Автор записи

      Пожалуйста)) К сожалению в моей версии база засирается еще как))) Для каждого нового пользователя из социальной сети. Если вы что то доработаете- я могу это добавить в этот урок.
      А перетаскивание данных можно повесить на обработчики. Но с этим туго- надо в коде смотреть. Описание в api не совпадает с реальностью.

  2. Виктор /

    Вылавливаем учётку юзера с email’ом как в соцсети и прикрепляем к ней

    AddEventHandler(«socialservices», «OnFindSocialservicesUser», «OnFindSocialservicesUserHandler»);

    function OnFindSocialservicesUserHandler(&$socservUserFields) {
    $dbUsersOld = CUser::GetList($by = ‘ID’, $ord = ‘ASC’, array(‘EMAIL’ => $socservUserFields[‘EMAIL’], ‘ACTIVE’ => ‘Y’), array(‘NAV_PARAMS’ => array(«nTopCount» => «1»)));
    $socservUser = $dbUsersOld->Fetch();
    if($socservUser) {
    return $socservUser[«ID»];
    }
    return false;
    }

    1. alex / Автор записи

      Спасибо) Будет полезно)

      1. Виктор /

        кстати даже так, надо проверять на пустой мейл, а то учётки соцсетей без email’ов будут сливаться с админской учёткой — это будет эпичный фейл

        AddEventHandler(«socialservices», «OnFindSocialservicesUser», «OnFindSocialservicesUserHandler»);

        function OnFindSocialservicesUserHandler(&$socservUserFields) {
        if ($socservUserFields[‘EMAIL’] != ») {
        $dbUsersOld = CUser::GetList($by = ‘ID’, $ord = ‘ASC’, array(‘EMAIL’ => $socservUserFields[‘EMAIL’], ‘ACTIVE’ => ‘Y’), array(‘NAV_PARAMS’ => array(«nTopCount» => «1»)));
        $socservUser = $dbUsersOld->Fetch();
        if ($socservUser) {
        return $socservUser[«ID»];
        }
        }

        return false;
        }

  3. Сергей /

    А не подскажете куда это все писать?

    Вот это событие вообще не срабатывает
    AddEventHandler(«socialservices», «OnFindSocialservicesUser», «OnFindSocialservicesUserHandler»);

    function OnFindSocialservicesUserHandler(&$socservUserFields) {
    if ($socservUserFields[‘EMAIL’] != ») {
    $dbUsersOld = CUser::GetList($by = ‘ID’, $ord = ‘ASC’, array(‘EMAIL’ => $socservUserFields[‘EMAIL’], ‘ACTIVE’ => ‘Y’), array(‘NAV_PARAMS’ => array(«nTopCount» => «1»)));
    $socservUser = $dbUsersOld->Fetch();
    if ($socservUser) {
    return $socservUser[«ID»];
    }
    }

    return false;
    }

    1. alex / Автор записи

      я в хедер страницы вставил. И при каждой загрузке проверяю.

Комментирование закрыто