Вход в систему Django с использованием “allauth” и “dj_rest_auth” Невозможно войти с предоставленными учетными данными.

Вопрос или проблема

Я столкнулся с проблемой при попытке отправить POST запрос на http://127.0.0.1:8000/api/auth/login/. Ошибка возникает, когда я добавляю 'allauth' в INSTALLED_APPS, но мне это нужно для аутентификации через Google. Однако вход работает корректно, если я не добавляю 'allauth'.

Буду признателен за любые советы по решению этой проблемы!

Вот ответ от API:

{
    "non_field_errors": [
        "Невозможно войти с предоставленными учетными данными."
    ]

}

Вот лог с бэкенда:

Некорректный запрос: /api/auth/login/

[17/Oct/2024 09:56:13] "POST /api/auth/login/ HTTP/1.1" 400 68

Тело моего запроса:

{
    "email":"[email protected]",
    "password":"******"
}

urls.py:

from django.contrib import admin
from django.urls import include, path, re_path
from django.conf.urls.static import static
from django.conf import settings
from allauth.account.views import ConfirmEmailView
from accounts.views import GoogleLogin, GoogleLoginCallback

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('app.urls')),
    path("api/auth/", include("dj_rest_auth.urls")),
    re_path(
        r"^api/auth/registration/account-confirm-email/(?P<key>[-:\w]+)/$",
        ConfirmEmailView.as_view(),
        name="account_confirm_email",
    ),
    path('api/auth/registration/', include('dj_rest_auth.registration.urls')),
    path("api/auth/google/", GoogleLogin.as_view(), name="google_login"),
    path(
        "api/auth/google/callback/",
        GoogleLoginCallback.as_view(),
        name="google_login_callback",
    ),

]
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Setting.py:

AUTH_USER_MODEL = 'app.CustomUser'

MEDIA_URL = '/document/' 
MEDIA_ROOT = BASE_DIR

INSTALLED_APPS = [
    'jazzmin', 

    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',

    'corsheaders',  
    'rest_framework', 
    'rest_framework.authtoken',  
    'rest_framework_simplejwt',
    'allauth', 
    'allauth.account',  
    'allauth.socialaccount', 
    'allauth.socialaccount.providers.google',  
    'dj_rest_auth', 
    'dj_rest_auth.registration',  

    'app',
]

SITE_ID = 1

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    )
}

SIMPLE_JWT = {
    "ACCESS_TOKEN_LIFETIME": timedelta(hours=1),
    "REFRESH_TOKEN_LIFETIME": timedelta(days=1),
}

REST_AUTH = {
    "USE_JWT": True,
    "JWT_AUTH_HTTPONLY": False, 
}

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    "allauth.account.middleware.AccountMiddleware",
]

ACCOUNT_AUTHENTICATION_METHOD = "email"
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_EMAIL_VERIFICATION = "none"

EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.gmail.com"
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = os.getenv("EMAIL_HOST_USER")
EMAIL_HOST_PASSWORD = os.getenv("EMAIL_HOST_PASSWORD")

ACCOUNT_EMAIL_VERIFICATION = "обязательно"    
ACCOUNT_CONFIRM_EMAIL_ON_GET = True
LOGIN_URL = "/admin"

GOOGLE_OAUTH_CLIENT_ID = os.getenv("GOOGLE_OAUTH_CLIENT_ID")
GOOGLE_OAUTH_CLIENT_SECRET = os.getenv("GOOGLE_OAUTH_CLIENT_SECRET")
GOOGLE_OAUTH_CALLBACK_URL = os.getenv("GOOGLE_OAUTH_CALLBACK_URL")

SOCIALACCOUNT_EMAIL_AUTHENTICATION = True
SOCIALACCOUNT_EMAIL_AUTHENTICATION_AUTO_CONNECT = True
SOCIALACCOUNT_PROVIDERS = {
    "google": {
        "APPS": [
            {
                "client_id": GOOGLE_OAUTH_CLIENT_ID,
                "secret": GOOGLE_OAUTH_CLIENT_SECRET,
                "key": "",
            },
        ],
        "SCOPE": ["profile", "email"],
        "AUTH_PARAMS": {
            "access_type": "online",
        },
    }
}

Я правильно указал адрес электронной почты и пароль в теле запроса.

Ответ или решение

Решение проблемы: Не удается выполнить вход с использованием "allauth" и "dj_rest_auth" в Django

Проблема, с которой вы столкнулись при попытке аутентификации пользователя с использованием пакетов django-allauth и dj-rest-auth, связана с ошибкой входа, а именно "Unable to log in with provided credentials." Прежде всего, давайте рассмотрим основные элементы вашей настройки и возможные причины проблемы, а также способы их устранения.

Понимание проблемы

Вы указали, что аутентификация работает корректно при отсутствии allauth в INSTALLED_APPS, но вызывает ошибку при добавлении этого пакета. Это может указывать на то, что в конфигурации есть конфликты или несоответствия, связанные с настройками аутентификации.

Проверка конфигурации

  1. Модель пользователя: Убедитесь, что ваша пользовательская модель (app.CustomUser) правильно настроена. Если вы используете django-allauth, убедитесь, что она наследует AbstractBaseUser или AbstractUser.

  2. Аутентификация: В настройках settings.py проверьте следующую конфигурацию:

    ACCOUNT_AUTHENTICATION_METHOD = "email"
    ACCOUNT_USERNAME_REQUIRED = False
    ACCOUNT_EMAIL_REQUIRED = True

    Убедитесь, что поле для входа пользователя действительно совпадает с тем, как вы его используете в запросах, и соответствует настройке.

  3. Почтовая верификация: Если у вас установлена настройка ACCOUNT_EMAIL_VERIFICATION = "mandatory", пользователи должны подтвердить свой адрес электронной почты, прежде чем они смогут входить. Попробуйте изменить эту настройку на none на время проверки.

  4. Использование dj-rest-auth: Возможно, необходимо настроить dj-rest-auth так, чтобы он соответствовал вашим требованиям. Убедитесь, что у вас есть следующие настройки:

    REST_AUTH = {
       "USE_JWT": True,
       "JWT_AUTH_HTTPONLY": False,
    }
  5. Проверьте наличие пользователя: Убедитесь, что пользователь, с которым вы пытаетесь войти, существует в базе данных и его пароль правильный. Попробуйте сбросить пароль для этого пользователя с использованием Django-админки.

Тестирование входа

После того как вы проверите основные элементы конфигурации, попробуйте снова выполнить запрос на вход. Убедитесь, что запрос содержит правильные данные:

{
    "email": "[email protected]",
    "password": "******"
}

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

Общие рекомендации

  • Обновления пакетов: Убедитесь, что вы используете последние версии django-allauth и dj-rest-auth, так как они могут содержать исправления ошибок.
  • Документация: Обратитесь к официальной документации как django-allauth, так и dj-rest-auth, чтобы проверить рекомендуемые настройки.
  • Тестирование: Пожалуйста, создайте нового пользователя через интерфейс администратора, а затем попытайтесь войти с помощью новых учетных данных, чтобы проверить, проблема заключается в конкретном пользователе или в конфигурации.

Заключение

Работа с интеграцией аутентификации может вызывать сложности, особенно при использовании нескольких пакетов. Однако с помощью правильной проверки конфигураций и понимания особенностей каждого приложения, вы сможете устранить возникшие проблемы с входом. Если возникнут какие-либо дополнительные вопросы, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...