Django импортирует существующие Ppasswords с PHP-сайта, который использовал password_hash()
Мне нужно импортировать список пользователей и хэшированные пароли со старого PHP сайта, который использовал password_hash(), на новый django сайт. Сохраненные пароли выглядят следующим образом: $2y$10$ZnxKDPbqOfACnGmQeN76o.UtdwWBFBCCLTiGnvCSvl/zqIBeVxhai
Я нашел Django password hasher using php format of function password_hash() здесь, когда пытался найти это, и я думаю, что это поможет для NEXT шага.
Но в настоящее время я не могу настроить процесс импорта, который правильно перенесет старые пароли. Когда я пытаюсь вручную создать пользователей во время процесса импорта, он отказывается принимать пароль, заявляя "Неверный формат пароля или неизвестный алгоритм хэширования.", когда я смотрю на пользователей после запуска импорта. Я думаю, что я просто делаю это совершенно неправильно, вот пример фрагмента, где я создаю пользователей.
usertest = User(username='testguy',email='testguy@test.com',password='$2y$10$ZnxKDPbqOfACnGmQeN76o.UtdwWBFBCCLTiGnvCSvl/zqIBeVxhai')
В результате пароль не сохраняется. Использование функции create_user приводит к тому, что пользователь создается, но в качестве пароля выводится хэшированный пароль:
User.objects.create_user(username='testguy',email='testguy@test.com',password='$2y$10$ZnxKDPbqOfACnGmQeN76o.UtdwWBFBCCLTiGnvCSvl/zqIBeVxhai')
Как я могу просто правильно сохранить эти пароли в новой базе данных, чтобы я мог перейти к следующему шагу - фактической проверке этих паролей?
Мне удалось найти обходной путь, который работает для меня, он не совсем делает ТОЧНО то, что я изначально планировал, но работает достаточно хорошо. Для тех, кто хочет сделать что-то подобное, вот что я в итоге сделал.
Вместо того, чтобы импортировать их в фактическое поле пароля пользователя Django Auth, добавьте новое поле old_password к вашим пользователям и импортируйте старые хэшированные пароли туда.
Затем отредактируйте вашу функцию authenticate (скорее всего, в backends.py), чтобы она проверяла поле old_password с помощью bcrypt, если проверка пароля не удалась при входе в систему:
if user.check_password(password):
return user
else: #didnt match check if its an old user
if user.old_password != "":
if bcrypt.checkpw(bytes(password, 'utf-8'), bytes(user.old_password, 'utf-8')):
user.set_password(password)
user.save()
return user