authenticate всегда возвращает None

from django.contrib.auth import authenticate, login
from django.shortcuts import redirect
from django.http import HttpResponse


def auth_check(request):
    try:
        username = request.POST['username']
        password = request.POST['password']

        if all([username, password]):
            user = authenticate(username=username, password=password)

            if user is not None:
                login(request, user)

            else:
                return HttpResponse('Неверный логин или пароль!')

    except (KeyError, AttributeError):
        pass

    return redirect('/')

Если я активирую функцию с помощью shell, то authenticate работает корректно и возвращает объект пользователя, а если через сайт, то всегда возвращает None. (Делал дебаг, вывел в файл лога то, что ввёл и там всё правильно (username и password), но authenticate возвратил None). Как решить проблему?


Ответы (1 шт):

Автор решения: Mike Lazko

Так как информации недостаточно для того чтобы понять в чем проблема. Я предложу вариант как лучше переписать ваш метод и приэтом добавлю те вещи которые мне кажется могли бы указать на проблему.

def auth_check(request):
    username = request.POST.get('username')
    password = request.POST.get('password')

    if not (username and password):
        return HttpResponseBadRequest('Некорректный запрос username и password обязательные поля')
    log.debug(f'database url: {settings.DATABASES}')
    log.debug(f'auth backend: {settings.AUTHENTICATION_BACKENDS}')
    user = authenticate(username=username, password=password)
    if user is None:
        return HttpResponseForbidden('Неверный логин или пароль!')
    
    login(request, user)
    return redirect('/')

@receiver(user_logged_in)
def user_logged_in_callback(sender, request, user, **kwargs):    
    log.debug(f'login user_id={user.id} with username: {user.username}')

@receiver(user_login_failed)
def user_login_failed_callback(sender, credentials, **kwargs):
    log.debug(f'login failed for: {credentials}')

Еще на всякий случай бы уточнил какой бэкенд отрабатывает при вызове функции AUTHENTICATION_BACKENDS. Добавьте то что получится при выводе в обоих случаях в описание вопроса, чтобы наверняка исключить некоторые глупые варианта, а не просто вам на слово верить. Так как вряд ли баг в джанге. Кстати какая у вас версия? И где хостится база?

PS. для логов лучше завести фековый аккаунт который после удалить сразу, чувствительные вещи можно потереть звездочками

→ Ссылка