Функция аутентификации в Django с использованием хешированного пароля, а не необработанного
Я работаю над opensx(который работает на django), и пользователь будет перенаправлен сюда с другого сайта, и оттуда мне дадут хешированный пароль. Authenticate(имя пользователя, пароль) исключает необработанный пароль типа "дракон", а не хэшированный,
Поэтому мне нужно использовать authenticate() с хешированным паролем, чтобы я мог получить атрибут ".backend" и продолжить свою жизнь.
Когда я использую login(request,user)
без метода аутентификации. эта ошибка появляется:
request.session[BACKEND_SESSION_KEY] = user.backend
AttributeError: 'User' object has no attribute 'backend'
Поэтому мне нужно использовать функцию authenticate, чтобы получить этот атрибут.backend в моем пользовательском объекте.
user = authenticate(username=username, password=password)
это формат функции проверки подлинности, пароль здесь представляет собой необработанный пароль, такой как "abc", у меня есть хешированный пароль (именно так этот пароль "abc" будет храниться в БД).
Я застрял сейчас, есть ли способ аутентификации и входа в систему с использованием хешированных паролей в Django?
2 ответа
Open edX использует ratelimitbackend.backends.RateLimitModelBackend
для аутентификации, как мы видим в настройках. Этот бэкэнд требует не хэшированный пароль для аутентификации.
Если вы хотите аутентифицировать пользователя на основе его хешированного пароля, вам нужно создать новый бэкэнд аутентификации, как описано в документации по django.
Я предлагаю вам почерпнуть вдохновение из Django ModelBackend, как это реализовано в django.contrib.auth.backends.
Ошибка, которую вы видите относительно пропавшейbackend
Атрибут это то, что я испытал раньше. вimpersonate_user
view FUN (проект Open edX). Вот как мы решаем эту проблему (обратите внимание на комментарий внутри исходного кода функции view):
user = get_object_or_404(User, username=username, is_superuser=False, is_active=True)
user.backend = None
login(request, user)
Вы можете создать собственный бэкэнд аутентификации для django и переопределить его authenticate
а также get_user
метод аутентификации с использованием хешированного пароля и имени пользователя.
Поскольку хешированный пароль - это просто еще одно поле модели с текстом в нем, вы можете искать пользователей с именем пользователя и значением проходного хеша в db.
Примерно так должно работать:
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
class HashedPasswordAuthBackend(ModelBackend):
def authenticate(self, username=None, password=None):
try:
return User.objects.get(username=username, password=password)
except User.DoesNotExist:
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
После этого, включите путь этого auth backend в настройках вашего проекта.
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
'yourapp.backends.HashedPasswordAuthBackend',
]