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": "Не найдена активная учетная запись с заданными учетными данными". }
Я создал суперпользователя
Мои пользователи все is_active = True
Мои пароли хэшируются в базе данных
У меня AUTH_USER_MODEL = 'my_app_name.User' в settings.py
Имя пользователя/пароль 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
Да. Это было так просто.
"Здоровья"