Можно ли сделать авторизацию по номеру телефона? — Хабр Q&A

Авторизация через sms: модуль для 1с-битрикс


  • Подходящие редакции 1С-Битрикс:
    Старт, Стандарт, Малый бизнес, Бизнес
  • Включает в себя:
    Компоненты, Модуль
  • Категории:
    Авторизация, пользователи, Для разработчиков, Инструменты, Интеграция, SMS-шлюзы

XXI век, пользуемся всеми возможностями!
Модуль добавляет возможность авторизоваться на сайте через SMS-пароль.

Особенности модуля:

  • Работает только в кодировке UTF-8
  • Быстрая авторизация через SMS;
  • Настройка длины пароля;
  • Выбор поля с номером телефона;
  • Соль – позволяет сделать алгоритм генерации кода уникальным для каждого сайта;
  • Время жизни пароля;
  • Настройка текста SMS;
  • Выбор SMS-провайдера, более 10 провайдеров

Список поддерживаемых SMS-провайдеров
События модуля

OnAfterRegisterConfirm ( int $user_id ) – срабатывает после подтверждения регистрации;

OnNormalizePhone ( string $original, string &$normalized ) – срабатывает при нормализации номера телефона. Можно изменить нормализацию телефона;

OnGetPhoneFieldList ( array &$fields ) – срабатывает при составлении списка полей для записи телефона;

OnGetUserRegisterFields( array &$fields ) – срабатывает при составлении списка полей для регистрации;

OnGetProviderList ( array &$providers ) – срабатывает при составлении списка провайдеров;

OnSendSMS ( array &$fields, Provider $provider ) – срабатывает перед отправкой СМС

OnAfterSendSMS ( bool $success, array $fields, Provider $provider ) – срабатывает после отправки СМС

Добавление смс-сервиса

Если вы хотите добавить собственный СМС-сервис, для начала необходимо создать класс СМС-сервиса, который будет наследовать класс BitrixMessageServiceSenderBase, с обязательными методами:

  • getShortName(): string — Сокращенное наименование сервиса (например, домен)
  • getId(): string — Символьный код сервиса
  • getName(): string — Полное наименование сервиса (будет выводиться во всех списках)
  • canUse(): boolean — Если false – сервис не будет выводиться
  • getFromList(): array — Список подтвержденных имен отправителя
  • sendMessage(): BitrixMessageServiceSenderResultSendMessage — Отправка сообщения

Примерный код базового СМС-сервиса:

Можно ли сделать авторизацию по номеру телефона?

ANTO, печально, я сам не делал, но думал что раз есть регистрация то есть и авторизация.

Похожее:  ООО "ЭЛИТЭКСПОСТРОЙ" - Москва - Гендиректор Клементьева Людмила Филимоновна

Тогда руками пилить (компонент system.auth.authorize)
1. В классе CUser есть 2 метода

public static function SendPhoneCode($phoneNumber, $smsTemplate, $siteId = null)

public static function VerifyPhoneCode($phoneNumber, $code)

2. В шаблоне добавляешь input для телефона в стандартную форму авторизации и оборачиваешь в if

<?if(!isset($arResult["SHOW_SMS_FIELD"]) || $arResult["SHOW_SMS_FIELD"] !== true):?>
<form //..............
    <input type="text" required name="PHONE_NUMBER">
</form>
<?endif;?>

3. Добавляешь в шаблон блок для ввода кода из смс

<?if($arResult["SHOW_SMS_FIELD"] == true):?>

	<?CJSCore::Init('phone_auth');?>
	
	<form method="post" action="<?=$arResult["AUTH_URL"]?>" name="regform">

		<input type="hidden" name="SIGNED_DATA" value="<?=htmlspecialcharsbx($arResult["SIGNED_DATA"])?>" />

		<div class="bx-authform-formgroup-container">
			<div class="bx-authform-label-container"><span class="bx-authform-starrequired">*</span><?echo GetMessage("main_register_sms_code")?></div>
			<div class="bx-authform-input-container">
				<input type="text" name="SMS_CODE" maxlength="255" value="<?=htmlspecialcharsbx($arResult["SMS_CODE"])?>" autocomplete="off" />
			</div>
		</div>

		<div class="bx-authform-formgroup-container">
			<input type="submit" class="btn btn-primary" name="code_submit_button" value="<?echo GetMessage("main_register_sms_send")?>" />
		</div>

	</form>
	<div id="bx_auth_error" style="display:none" class="alert alert-danger"></div>

	<div id="bx_auth_resend"></div>

	<script>
	new BX.PhoneAuth({
		containerId: 'bx_auth_resend',
		errorContainerId: 'bx_auth_error',
		interval: <?=$arResult["PHONE_CODE_RESEND_INTERVAL"]?>,
		data:
			<?=CUtil::PhpToJSObject([
				'signedData' => $arResult["SIGNED_DATA"],
			])?>,
		onError:
			function(response)
			{
				var errorNode = BX('bx_auth_error');
				errorNode.innerHTML = '';
				for(var i = 0; i < response.errors.length; i  )
				{
					errorNode.innerHTML = errorNode.innerHTML   BX.util.htmlspecialchars(response.errors[i].message)   '<br />';
				}
				errorNode.style.display = '';
			}
	});
	</script>

<?endif;?>

4. Добавляешь обработчик, например в result_modifier (обработчик писал без проверки):

$arResult["PHONE_CODE_RESEND_INTERVAL"] = CUser::PHONE_CODE_RESEND_INTERVAL;

$phoneNumber = $_REQUEST['PHONE_NUMBER'] ?? null;
$signedData = $_REQUEST['SIGNED_DATA'] ?? null;

if(!empty($phoneNumber))
{
	$smsTemplate = 'SMS_USER_RESTORE_PASSWORD'; // только указываешь свой шаблон (создаешь сначала в админке)
	
	$result = CUser::SendPhoneCode($phoneNumber, $smsTemplate, SITE_ID);
	
	if($result->isSuccess()) {
		$arResult['SIGNED_DATA'] = BitrixMainControllerPhoneAuth::signData([
			'phoneNumber' => $phoneNumber,
			'smsTemplate' => $smsTemplate
		]);
		
		$arResult["SHOW_SMS_FIELD"] = true;
	}
	else {
		$arResult['ERROR_MESSAGE'] = $result->getErrorMessages();
	}
	
	
	if(!empty($signedData)) {
		$arResult["SIGNED_DATA"] = $signedData;
		$arResult["SHOW_SMS_FIELD"] = true;
	}
	
	// verify phone code
	$isNeedVerifySmsCode = $_SERVER["REQUEST_METHOD"] == "POST" && $_REQUEST["code_submit_button"] <> '' && !$USER->IsAuthorized() && !empty($signedData);
	
	if($isNeedVerifySmsCode)
	{
		$smsCode = $_REQUEST['SMS_CODE'];
		
		if(($params = BitrixMainControllerPhoneAuth::extractData($signedData)) !== false)
		{
			if(($userId = CUser::VerifyPhoneCode($params['phoneNumber'], $smsCode)))
			{
				$USER->Authorize($userId);
			}
			else
			{
				$arResult['ERROR_MESSAGE'] = 'Error verify code'; // здесь сам ошибку придумай
				$arResult["SHOW_SMS_FIELD"] = true;
				$arResult["SMS_CODE"] = $smsCode;
				$arResult["SIGNED_DATA"] = $signedData;
			}
		}
	}
}

Вроде так, но могут быть ошибки, если что пиши))

Отправка сообщения

Для того, чтобы отправить сообщение с СМС кодом подтверждения регистрации, выполним следующий код:

Подтверждение номера телефона

Для того, чтобы проверить введенный код:

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *