Функция аутентификации в 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_userview 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',
]
Другие вопросы по тегам