0

I have a question concerning the Django Rest Framework JWT auth protocol.

This issue has been coming up a lot but no suggested solution has worked for me yet.

When I try this command:

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

or

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

to obtain the access/refresh tokens as suggested in many tutorials, I get this error:

{ "detail": "No active account found with the given credentials" }

  1. I have created a superuser

  2. My users are all is_active = True

  3. My passwords are hashed in the database

  4. I have AUTH_USER_MODEL = 'my_app_name.User' in settings.py

  5. The username/password are 100% correct.

Here is my User model:

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)

My serializer:

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}}

My urls:

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:

DJANGO_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "django.contrib.sites",
    "django.forms",
]

INSTALLED_APPS = [
    # styling
    "crispy_forms",
    "crispy_tailwind",
    "crispy_bootstrap5",
    "widget_tweaks",
    # rest framework
    'rest_framework',
    'rest_framework.authtoken',
    #celery
    "django_celery_beat",
    # dev
    "django_extensions",
    "debug_toolbar",
    # deploy
    "whitenoise.runserver_nostatic",
    # auth
    'authapp',
    'rest_framework_simplejwt',
    'djoser',
    "allauth",
    "allauth.account",
    "allauth.socialaccount",
    # mail
    "anymail",
    # utils
    "phonenumber_field",
    "simple_history",
    "markdownify",
]

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

I am out of ideas as to why this is happening. This is my first experience with Django Rest Framework, therefore I suspect I might have forgotten to add something crucial.

0

1 Answer 1

1

My colleague found the issue.

In my settings.py file my config for ACCOUNT_AUTHENTICATION_METHOD is set to email.

settings.py:

ACCOUNT_AUTHENTICATION_METHOD = "email"

So the HTTP command should look like this:

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

Yeah. It was that simple.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.