@R-n-D
web-программист

Как настроить функционал изменения пароля пользователя в Bitrix?

Доброго времени суток!

Есть сайт на битриксе.

На сайте есть страница авторизации /auth/, где вызван компонент bitrix:system.auth.form.
Есть страница для запроса контрольной строки и восстановления пароля ( /forgot/ и /restore/ соответственно).

Для восстановления пароля переходим на страницу /forgot/, где вызван компонент bitrix:system.auth.forgotpasswd, вводим логин или email и жмем отправить - контрольная строка успешно приходит на почту (в базе видим, что у пользователя поменялось значение CHECKWORD т.е. отправленная строка действительно актуальна).

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

Переходим по ссылке и попадаем в раздел /restore/, где сначала использовался компонент bitrix:system.auth.changepasswd, но по причине не возврата сообщений об ошибках был закомментирован и написан следующий код, который хотя-бы возвращает ошибки:
<?if(($_POST["AUTH_FORM"]=="Y")&&($_POST["TYPE"]=="CHANGE_PWD")){
   global $USER;
   $arResult = $USER->ChangePassword($_POST["USER_LOGIN"], $_POST["USER_CHECKWORD"], $_POST["USER_PASSWORD"], $_POST["USER_CONFIRM_PASSWORD"]);
      if($arResult["TYPE"] == "OK"){
         echo "Пароль успешно изменен.";
      }else{
         echo $arResult["MESSAGE"];      
      }
   }
        echo '<pre>';
   print_r($arResult);
   echo '</pre>';
                  
   if($arResult["TYPE"] != "OK"){   
   ?>
   <fo rm method="post" action="" name="bform" id="b-form">
      <input type="hidden" name="backurl" value="">
      <input type="hidden" name="AUTH_FORM" value="Y">
      <input type="hidden" name="TYPE" value="CHANGE_PWD">
                  
      <input type="text" name="USER_LOGIN" maxlength="50" value="<?=$_GET['USER_LOGIN']?>" class="bx-auth-input" placeholder="Ваш логин" />
      <input type="text" name="USER_CHECKWORD" maxlength="50" value="<?=$_GET["USER_CHECKWORD"]?>" class="bx-auth-input" placeholder="Контрольная строка"/>
                  
      <input type="password" name="USER_PASSWORD" maxlength="50" value="" class="bx-auth-input" autocomplete="off" placeholder="Новый пароль" />
      <input type="password" name="USER_CONFIRM_PASSWORD" maxlength="50" value="" class="bx-auth-input" autocomplete="off" placeholder="Подтверждение пароля" />
      <div class="clearfix b-form-buttons">
         <input type="submit" name="change_pwd" value="Изменить пароль" />
      </div>
   </form>
<?}?>

При успешном вводе нового пароля и его подтверждения (они равны и соответствуют всем правилам) получаю массив $arResult:
Array
(
    [MESSAGE] => Неверное контрольное слово для логина "test@mail.ru".

    [TYPE] => ERROR
    [FIELD] => CHECKWORD
)

На странице, после отправки формы вывожу массив $_POST, что подтверждает, что USER_CHECKWORD все таки передается:
Array
(
    [backurl] => 
    [AUTH_FORM] => Y
    [TYPE] => CHANGE_PWD
    [USER_LOGIN] => test@mail.ru
    [USER_CHECKWORD] => 1a571b5f2170ff4ef7c0657c89befcd8
    [USER_PASSWORD] => PASSWORDtest1!Q
    [USER_CONFIRM_PASSWORD] =>  PASSWORDtest1!Q
    [change_pwd] => Изменить пароль
)

Посмотрел код метода, такая ошибка возникает если он пуст (не передается) или он не равен хешу пароля из базы:
if($res["CHECKWORD"] == '' || $res["CHECKWORD"] != $salt.md5($salt.$arParams["CHECKWORD"]))


НО! Если на странице перед подключением header.php установить значение константы define("AUTH", true), и запросить пароль посредством выведенной формы, то пароль успешно меняется. WTF?

Уважаемые знатоки, внимание, вопрос: "Из - за чего возникает такая проблема, и как её решить?". Заранее спасибо! Очень надеюсь на помощь...
  • Вопрос задан
  • 11776 просмотров
Решения вопроса 1
@sybear
Для работы системных компонентов типа bitrix:system.***.*** необходимо определить define("AUTH", true). Почему? Я не знаю ответ.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Так же столкнулся с ситуацией, что возникала указанная ошибка при использовании метода ChangePassword. Решил задачу через $USER->Update(...);
Код решения тут blog.ivru.net/?id=92

Решение с define("AUTH", true) мне не помогло.
Ответ написан
Комментировать
@ZardoZAntony
программист, сис. админ
define("AUTH", true) первой строкой вызывает дефолтные системные компоненты. Их можно переопределить, если скопировать шаблоны с нужным именем и изменить настройки в главном модуле. У меня правда не вышло их переопределить, поэтому я отказался от использования define("AUTH", true).

Результаты обработки форм находятся в
$APPLICATION->arAuthResult

Эти результаты я и использовал в своих шаблонах компонентов для обработки логики.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы