Сегодня после установки двух новых сайтов, столкнулся с проблемой: при настройки обмена (самописный) с 1С, обмен не стартовал, журнал обмена 1С при проверке соединения выдавал ошибку - "Произошла ошибка авторизации".
Проверка авторизации происходила следующим образом:
Из 1С приходили данные пользователя (логин/пароль) в открытом виде.
Пользователь (админ для обмена), был записан в системной таблице "Список пользователей" (b_user).
Для того, чтобы проверить данные (сравнить логин/пароль), необходимо было получить MD5-хеш от пароля.
API Битрикса не использовалось, т.к. не покрывало все потребности. Например $USERcheck->Login()возвращает true или false и не понятно, что ввел пользователь не так логин или пароль? Или же если кто то авторизован под пользователем и под ним идет проверка функцией она всегда будет возвращать true.
Что удалось выяснить
Первым делом необходимо было выяснить, какие критические изменения были в релизе, обратившись к Истории версий, было найдено следующее изменение:
v20.5.400 2020-07-24 Пароли пользователей теперь хешируются по алгоритму SHA-512.
Таким образом необходимо было переписать функцию. Вот обновленная функция, для последней версии Битрикс:
//проверяем, является ли $password текущим паролем пользователя
function isUserPassword($userId, $password){
$userData = CUser::GetByID($userId)->Fetch();
$salt = substr($userData['PASSWORD'], 3, 16);
$password = crypt($password, '$6$'.$salt.'$');
return ($password == $userData['PASSWORD']);
}
Кому интересно, как формируется пароль и записывается в БД Битрикс, можно посмотреть теперь тут:
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».