29 сен 2020

Проверка пароля пользователя bitrix

#bitrix, #php

На первый взгляд, простая задача по проверке пароля пользователя иногда может превратится в целый квест, особенно, если дело касается Битрикс. Это проблема живет с самого первого дня существования этой cms и до сих пор нет встроенного способа её решить.

Проверка пароля пользователя bitrix

А для чего нам вообще может понадобится проверять пароль пользователя? Пускай себе логинится через форму авторизации и все дела. Сходу могу привести два примера: создания rest api сайта или простой формы, данные из которой будут приняты только в том случае, если пользователь правильно введет свой пароль.

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

Поэтому мы пойдем путем создания собственного решения. Для начала проведем небольшое исследование. Нам надо узнать в каком виде и как хранится пароль пользователя в бд, как его оттуда достать и что с этим добром делать. Ответ на первый вопрос найти можно, если внимательно изучить код, упомянутого выше, метода CUser::Login. Можно увидеть, что к паролю добавляется соль, затем полученная строка обрабатывается md5, склеивается с солью и сохраняется в бд. А как же мы будем доставать пароль? В этом нам поможет новый функционал bitrix d7 Bitrix\Main\UserTable и его метод GetRow. Теперь мы можем начать писать код:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

use Exception;
use Bitrix\Main\UserTable;

function isPasswordMatched(array $userData, string $password): bool
{
    $salt = substr($userData['PASSWORD'], 0, (strlen($userData['PASSWORD']) - 32));
    $realPassword = substr($userData['PASSWORD'], -32);
    $password = md5($salt.$password);
    return $password === $realPassword;
}
    
$userData = UserTable::GetRow([
    'filter' => ['=LOGIN' => 'user_login'],
    'select' => ['ID', 'PASSWORD'],
]);

if (!isPasswordMatched($userData, 'user_password')) {
   throw new Exception('Authentication failed');
}

В 6 строке мы создали функцию, которая принимает пароль полученный от пользователя и сверяет его с паролем из бд. В 14 достали этот пароль с помощью нового api bitrix и применили созданную функцию в строке 19. Если пароли не совпадают, то выбрасываем исключение, надо только не забывать его обработать.

На этом всё, мы научились проверять пароль пользователя без необходимости каждый раз повторять процесс авторизации. Это позволит экономить ресурсы сервера и не захламлять браузер пользователя ненужными куками.

Все статьи

© 2020-2021 Александр Пантелеев