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

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

Подключение модуля

if(\Bitrix\Main\Loader::includeModule('bxmaker.authuserphone'))
{
    $oManager = \BXmaker\AuthUserPhone\Manager::getInstance();

    //операции ...
    $phone = $oManager->getPreparedPhone('8 999-111-22-33');
    echo $phone; // 79991112233
}

Работа с результатом операции

Многие методы возращают объект класса результата - \BXmaker\AuthUserPhone\Result. Резльтат всегда либо успешный либо не успешный, когда содержит одну или более ошибок.

Пример инициализации объекта класса с результатом


$result = new \BXmaker\AuthUserPhone\Result();

Передаем основной результат

$result->setResult(10);

echo $result->getResult(); // 10

Передаем дополнитльные данные

$result->setMore('MSG', 'Смс отправлено');

echo $result->getMore('MSG'); //Смс отправлено

Проверяем успешный ли результат

if($result->isSuccess())
{
    echo (string) $result->getResult();
}

Работа с ошибками

В процессе выполнения операций может вернуться ошибка. Она всегда обернута в объект класса резлуьтата. Ошибка представляет из себя объект класса \BXmaker\Authuserphone\Error

$result = new \BXmaker\AuthUserPhone\Result();
$result->createError(
    'Телефон не валидный',
    'ERROR_PHONE_INVALID',
    
);

Когда необходимо передать больше данных весте с ошибкой

$result->createError(
    'Введите код с картинки',
    'ERROR_NEED_CAPTCHA',
    [
        'captcha' => \BXmaker\AuthUserPhone\Manager::getInstance()->captcha()->getForJs()
    ]
);

Чтобы получить данные по ошибке

echo  $result->getFirstError()->getCode(); //  ERROR_NEED_CAPTCHA
echo  $result->getFirstError()->getMessage(); //  Введите код с картинки
var_export($result->getFirstError()->getMore()); //  ['captcha' => [...]]

Если нужно создать ошибку из исключения, то делаем следующее

$ex = new \Exception('Error');

$result->createErrorFromException($ex);

echo  $result->getFirstError()->getMessage(); //  Error

Когда нужно выбросить исключение при наличии ошибки

if(!$result->isSuccess())
{
    $result->throwException(); 
   // throw new \BXmaker\AuthUserPhone\Exception\BaseException()
}

Основные операции

Подготовка номера телефона

Для использвоания номера телефона, его необходимо привести к виду пригодному для повсеместного использования

$phone = $oManager->getPreparedPhone('+7 (999 111 22-33');
echo $phone; // 79991112233

Проверка валидности номера

Телефон долже передаваться на проверку уже подготовленный

if($oManager->isValidPhone($phone))
{
    echo 'Номер телефона введен верно';
}

Отправка смс кода для проверки номера телефона

Для отправки пременного кода в смс, кода в номере телефона робота и использования прочих враинтов для проверки номера телефона, необходимо использовать соответствующие методы класса Service.

$result = $oManager->service()->startSmsCode($phone);
if (!$result->isSuccess()) {
    $result->throwException();
}
else
{
    $answer = [           
        'TIMEOUT' => $result->getMore('TIMEOUT'),
        'LENGTH' => $result->getMore('LENGTH'),
        'MSG' => $result->getMore('MSG'),
    ];
}

Проверка кода из смс

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

$result = $oManager->service()->checkSmsCode($phone, $code);
if (!$result->isSuccess()) {
    $result->throwException();
}
else
{
    echo 'Указан валидный код';
}


Проверка достижения лимита

Рассмотрим вариант проверки лимитов на запрос подтвреждений, напрмиер лимит на отправку кодов в смс.

Для проверки достижения лимитов необходимо передать тип подтверждения и номер телефона (для проверки лимтов по номеру).

// Подготовка ---

//ограничение по ip
$oManager
->limitIP()
->setType(\BXmaker\AuthUserPhone\Manager::CONFIRM_TYPE_SMS_CODE);

//ограничение по номеру телеофна
$oManager
->limit()
->setType(\BXmaker\AuthUserPhone\Manager::CONFIRM_TYPE_SMS_CODE)
->setPhone($phone);

В случае если на момент проверки лимит превышен и требуется вести код с картинки, то будет выброшено исключение \BXmaker\AuthUserPhone\Exception\NeedCaptchaException содержащее данные для вывода капчи и текст ошибки.

Если при достижении лимита и необходимости ввода символов с картинки, вместе с запросо на сервер пришли эти данные и они валидны, то исключение не будет выброшено и выполнение подет дальше.

// !! подготовка выше 

//ограничение по ip
$oManager->limitIP()->checkCanDoRequest();

//ограничение по номеру телеофна
$oManager->limit()->checkCanDoRequest();

Фиксирование попытки запроса

Для фиксировани попытки запроса подтверждения и учета лимитов, необходимо выполнить следующий код

// !! подготовка выше 

// ограничение по ip адресу
$oManager->limitIP()->setRequest();

//ограничение по  номеру
$oManager->limit()->setRequest();

Фиксирование попытки проверки

Для фиксировани попытки проверки подтверждения, напрмиер кода из смс и учета лимитов, необходимо выполнить следующий код

// !! подготовка выше 

// по ip адресу
$oManager->limitIP()->setCheck();

//для лимитов с привязкой к номеру
$oManager->limit()->setCheck();

Таймауты между запросам

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

Для получения текущих таймайтов использует следующие методы

$time = $oManager->getSmsCodeTimeout($phone);
$time = $oManager->getUserCallTimeout($phone);
$time = $oManager->getBotCallTimeout($phone);

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

$oManager->checkSmsCodeTimeout($phone);
$oManager->checkUserCallTimeout($phone);
$oManager->checkBotCallTimeout($phone);

Поиск по номеру телефона и паролю

Аналогичные методы есть для логина, email адреса. Позволяет найти пользвотеля по номеру телефона с проверкой пароля. Если данные указаны верно, то в объекте результатаа вернется идентфикиатор пользователя.

$phone = '79991112233';
$password = 'JIO^fne64V+3';

$userIdResult = $oManager->findUserIdByPhonePassword($phone, $password);
if ($userIdResult->isSuccess()) {
    $userId = (int)$userIdResult->getResult();
}

Авторизация

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

$userId = 10;

$resultAuth = $oManager->authorize($userId);
if (!$resultAuth->isSuccess()) {
    //  можно например выбросить исключение, чтобы не выполнять код далее
    $resultAuth->throwException();
}

Регистраци

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

$phone = '79991112233';
$arUserFields = [];
$registerResult = $oManager->register($phone, $arUserFields);
if (!$registerResult->isSuccess()) {
    $registerResult->throwException();
}

$userId = (int)$registerResult->getResult();

Получение настроек

Все доступные настройки модуля описаны как методы в соответствующем классе.

Больше можно узнать на странице описания класса - \BXmaker\AuthUserPhone\Param

$oManager->param()->isEnabledAutoRegister();

Смена сайта

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

$oManager->setSiteId('s2');

// автоопределение
$oManager->setSiteId();

Инициализация сервиса и отправка произвольного смс

Прпедположим что натсроено подключение к сервису, и нужно через него отправить произвольное смс. Для этого нужно объект класса сервиса проинициализировать и вызвать метод отправки смс.

$serviceId= 1;
\BXmaker\AuthUserPhone\manager::getInstance()->service()->getObjectById($serviceId)->sendSms('79991112233', 'text sms');