Rest Framework (Custom User + TokenAuthentication)

I’ve overrode Django’s default user model to use email instead. When I tried to use this with Django-Rest-Framework’s TokenAuthentication it did not work. This is how I overrode that as well

Serializer

Path: myapp/serializers.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from django.contrib.auth import authenticate
from django.utils.translation import gettext_lazy as _

from rest_framework import serializers

class EmailAuthTokenSerializer(serializers.Serializer):
    email = serializers.CharField(
        label=_("email"),
        write_only=True
    )
    password = serializers.CharField(
        label=_("Password"),
        style={'input_type': 'password'},
        trim_whitespace=False,
        write_only=True
    )
    token = serializers.CharField(
        label=_("Token"),
        read_only=True
    )

    def validate(self, attrs):
        email = attrs.get('email')
        password = attrs.get('password')

        if email and password:
            user = authenticate(request=self.context.get('request'),
                                email=email, password=password)

            # The authenticate call simply returns None for is_active=False
            # users. (Assuming the default ModelBackend authentication
            # backend.)
            if not user:
                msg = _('Unable to log in with provided credentials.')
                raise serializers.ValidationError(msg, code='authorization')
        else:
            msg = _('Must include "email" and "password".')
            raise serializers.ValidationError(msg, code='authorization')

        attrs['user'] = user
        return attrs

View

Path: myapp/view.py
1
2
3
4
5
6
7
8
from rest_framework.authtoken.views import ObtainAuthToken

from .serializers import EmailAuthTokenSerializer

class EmailObtainAuthToken(ObtainAuthToken):
    serializer_class = EmailAuthTokenSerializer

obtain_auth_token = EmailObtainAuthToken.as_view()

Urls

Path: myapp/urls.py
1
2
3
4
5
6
7
8
from django.urls import path

from . import views

urlpatterns = [
    # ...
    path('api-token-auth/', views.obtain_auth_token),
]

Pretty basic but thought I should jot it down as my initial google search wasn’t very fruitful. I didn’t spend too much time looking

comments powered by Disqus