Авторизация по номеру телефона

Авторизация по произвольному полю - Карта лояльности

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

Пользовательское поле

Для примера будем использовать пользовательское поле - Карта лояльности:

  • код - UF_LOYALTY_CARD
  • тип поля - строка
  • множественное - да

Пользовательское поле добавляется в форме редактирования пользователя в админке сайта.

2023-02-15_12-17.png

Компоненте Enter

Компонент будем использовать Enter, потому что там есть возможность входа по логину - bxmaker:authuserphone.enter

Настройки модуля

В настройках модуля включаем возможность авторизоваться по логину.

Замена фраз

Далее для компонента переопределяем фразу "логин" на "карта лояльности". Для этого создаем файл по пути /bitrix/php_interface/user_lang/ru/lang.php.

Добавляем в него запись:

<?
//...
$MESS["/bitrix/js/bxmaker/authuserphone/enter/lang/ru/config.php"]["BXMAKER_AUTHUSERPHONE_ENTER_AUTH_BY_PASSWORD_FORM_LOGIN"] = "Карта лояльности ";

Обработчик события

Далее добавляем обработчик события который перехватит запрос на авторизацию и произведет поиск пользователя по Карте лояльности и в случае успеха авторизует. Добавляем в файл /bitrix/php_interface/init.php

if (\Bitrix\Main\Loader::includeModule('bxmaker.authuserphone')) {


    $eventManager = \Bitrix\Main\EventManager::getInstance();
    $eventManager->addEventHandler(
        "bxmaker.authuserphone",
        "BXmakerAuthUserPhoneEnterComponentAjax",
        "bxmaker_authuserphone_loyality_card"
    );


    function bxmaker_authuserphone_loyality_card(\Bitrix\Main\Event $event)
    {
        /**
         * @var $jsonResponse \BXmaker\AuthUserPhone\Ajax\JsonResponse
         * @var $component \BXmakerAuthUserPhoneCallComponent
         */
        $fields = $event->getParameter('fields');
        $jsonResponse = $fields['jsonResponse'];
        $component = $fields['component'];


        $actionType = $component->request()->getPost('actionType');
        if ($actionType !== 'AUTH') {
            return;
        }

        $phoneOrCard = (string)$component->request()->getPost('ple');
        if (empty($phoneOrCard)) {
            return;
        }

        // если введен номер телефона пропускаем
        if ($component->manager()->isValidPhone($phoneOrCard)) {
            return;
        }


        /**
         * @var  \CUser $oldUser
         */
        $oldUser = $component->manager()->oldUser();
        $dbrUser = $oldUser::getList('', '', [
            'ACTIVE' => 'Y',
            'UF_LOYALTY_CARD' => $phoneOrCard
        ], [
            'SELECT' => [
                'UF_LOYALTY_CARD'
            ],
            'FIELDS' => [
                'ID', 'NAME', 'PASSWORD'
            ],
            'NAV_PARAMS' => [
                'nPageSize' => 1
            ]
        ]);
        $arUser = $dbrUser->Fetch();

        if (!$arUser) {
            return;
        }

        $password = $component->request()->getPost('password');
        if (!$component->manager()->isValidUserPassword($arUser, $password)) {
//            throw new \BXmaker\AuthUserPhone\Exception\BaseException('Такой пользователь не найден ', 'USER_NOT_FOUND');
            throw new \BXmaker\AuthUserPhone\Exception\BaseException('Не верно указана крата лояльности или пароль', 'ERROR_PLE_OR_PASSWORD');
        }

        $authResult = $component->manager()->authorize($arUser['ID']);
        if (!$authResult->isSuccess()) {
            $authResult->throwException();
        }

        $arResponse = $component->extendResponseAfterAuth($arUser['ID'], [
            'msg' => 'Вы успешно авторизовались',
            'type' => ($component->manager()->isSetUserRegisterFlag() ? 'REG' : 'AUTH')
        ]);

        $jsonResponse->setResponse($arResponse);
        $jsonResponse->output();
    }

}

Результат

Поле выполнение всех действий в публичной части будет работать авторизация по схеме - карта лояльности + пароль. И выводится компонент будет примерно так 2023-02-15_12-18.png