Django Rest API JWT аутентификация - Не найдена активная учетная запись с заданными учетными данными

У меня есть вопрос относительно протокола JWT auth в Django Rest Framework.

Этот вопрос возникает часто, но ни одно из предложенных решений пока не помогло мне.

Когда я пытаюсь выполнить эту команду:

http post http://127.0.0.1:8000/api/token/ username=username password=password

или

curl -X POST -d "username=username&password=password" http://localhost:8000/api/token/

для получения токенов доступа/обновления, как предлагается во многих руководствах, я получаю эту ошибку:

{ "detail": "Не найдена активная учетная запись с заданными учетными данными". }

  1. Я создал суперпользователя

  2. Мои пользователи все is_active = True

  3. Мои пароли хэшируются в базе данных

  4. У меня AUTH_USER_MODEL = 'my_app_name.User' в settings.py

  5. Имя пользователя/пароль 100% правильные.

Вот моя модель пользователя:

class User(LifecycleModelMixin, AbstractUser):
    public_id = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)
    company_name = models.CharField(max_length=100, blank=True)
    job_title = models.CharField(max_length=30, blank=True)
    street_address = models.CharField(max_length=100, blank=True)
    street_address2 = models.CharField(
        verbose_name="Street address 2", max_length=100, blank=True
    )
    city = models.CharField(max_length=100, blank=True)
    state = models.CharField(max_length=50, blank=True)
    zip = models.CharField(max_length=50, blank=True)
    phone_number = PhoneNumberField(blank=True)
    is_active = models.BooleanField(default=True, null=True, blank=True)
    email_subscribed = models.BooleanField(default=True, null=True, blank=True)
    manager = models.ForeignKey(
        "self",
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name="sub_users",
    )
    country = CountryField(blank_label="(select country)", blank=True)
    contact_info = JSONField("ContactInfo", default=contact_default)

Мой сериализатор:

class UserSerializer(serializers.ModelSerializer):
    def create(self, validated_data):
        user = super().create(validated_data)
        user.set_password(validated_data['password'])
        user.save()
        return user

    class Meta:
        model = User
        fields = ('email', 'username', 'refreshToken', 'password')
        extra_kwargs = {'password': {'write_only': True}}

Мои ссылки:

from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
    TokenVerifyView,
)

urlpatterns: List[URLPattern] = (
    [
        path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
        path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
        path('api/token/verify/', TokenVerifyView.as_view(), name='token_verify'),
        path('api-token-auth/', obtain_auth_token, name='api_token_auth'), 
        path("auth/", include("authapp.urls")),
    ]
    + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
)

my settings.py:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES':(
        'rest_framework.permissions.IsAuthenticated',
    )
}

У меня нет идей, почему это происходит. Это мой первый опыт работы с Django Rest Framework, поэтому я подозреваю, что мог забыть добавить что-то очень важное.

Большое спасибо за помощь!

Мой коллега нашел проблему.

В моем файле settings.py для параметра ACCOUNT_AUTHENTICATION_METHOD установлено значение email

settings.py:

ACCOUNT_AUTHENTICATION_METHOD = "email"

Таким образом, команда HTTP должна выглядеть следующим образом:

http http://127.0.0.1:8000/api/token/ username=email password=password

Да. Это было так просто.

"Здоровья"

Вернуться на верх