BHUWAN PANDEY
BHUWAN PANDEY

Reputation: 53

What is the use of token return after login or registration from django-rest-knox?

Hy there, I work on project where I used django-rest-knox for token authentication. I have doubt that

1.How token be used that has return while registering and login.
(
when i pass token in postman as like,
in header section

Authentication Token abcjdkkfjjrhehrjlajn@kfjdk

)
this doesnot work

2.when i call logout and logoutall endpoint it say,

{ "detail": "Authentication credentials were not provided." }

even though i pass all correct credentials.

Here is the code that i follow,

in setting.py


REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": (
        'knox.auth.TokenAuthentication',
        "rest_framework.authentication.BasicAuthentication", 
        "rest_framework.authentication.SessionAuthentication",)}

REST_AUTH_TOKEN_MODEL = 'knox.models.AuthToken'
REST_AUTH_TOKEN_CREATOR = 'users.authentication.create_knox_token'
REST_AUTH_SERIALIZERS = {
    'USER_DETAILS_SERIALIZER': 'users.serializers.CustomUserSerializer',
    'TOKEN_SERIALIZER': 'users.serializers.KnoxSerializer'
}

in urls.py

path('auth/register/',KnoxRegisterView.as_view(),name='register'),
path('auth/login/',KnoxLoginView.as_view(),name='login'),
path('api/auth/logout/',knox_view.LogoutView.as_view(),name='knox_login'),
path('api/auth/logoutall/',knox_view.LogoutAllView.as_view(),name='knox_alllogin'),

in authentication.py


from knox.models import AuthToken


def create_knox_token(token_model, user, serializer):
    token = AuthToken.objects.create(user=user)
    return token

in serializers.py



class KnoxSerializer(serializers.Serializer):
    """
    Serializer for Knox authentication.
    """
    token=serializers.CharField()
    user = CustomUserDetailsSettingsSerializer()

in views.py

class KnoxRegisterView(RegisterView):

    def get_response_data(self, user):
        return KnoxSerializer({'user': user, 'token': self.token}).data

    def perform_create(self, serializer):
        user = serializer.save(self.request)
        self.token = create_knox_token(None, user, None)
        complete_signup(self.request._request, user, allauth_settings.EMAIL_VERIFICATION, None)
        return user

class KnoxLoginView(LoginView):

    def get_response(self):
        serializer_class = self.get_response_serializer()

        data = {
            'user': self.user,
            'token': self.token
        }
        serializer = serializer_class(instance=data, context={'request': self.request})
        return Response(serializer.data, status=200)

Upvotes: 2

Views: 968

Answers (1)

Chen Peleg
Chen Peleg

Reputation: 2124

I'm not sure but I think your problem is that you need to override the login view so it doesn't request authentication. Usually the rest framework is setup like this:

# setting.py
REST_FRAMEWORK = {
  'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated',
   ),
}

So, your framework thinks it need authentication to ALL views, including the login view (which is silly of course). The solution is to rewrite the login view as the documentation note:

If it is your only default authentication class, remember to overwrite knox's LoginView, otherwise it'll not work, since the login view will require a authentication token to generate a new token, rendering it unusable.

Try to add to your login view:

class KnoxLoginView(LoginView):
...
permission_classes = (permissions.AllowAny,)
...

Upvotes: 0

Related Questions