Можно ли сделать авторизацию по номеру телефона? — Хабр 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;	}	}	}
}

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

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

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

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

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

Похожее:  после установки vipnet не загружается windows