Allauth will not return the desired token payload

Viewed 104

I have a django-rest-auth project called merchant. within it I have implemented django-restauth and allauth packages with JWT.

Everything works OK. However, I wish to return additional fields in the JWT token and here's my implementation of it.

In app.views.py

def jwt_response_payload_handler(token, user=None, request=None):
    return {
    'token': token,
    'user': User_Serializer(user, context={'request':request}).data
    }

serializers.py

class User_Serializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['email', 'username', 'is_staff']

settings.py

JWT_AUTH = {
'JWT_RESPONSE_PAYLOAD_HANDLER': 'merchant.coin_app.views.jwt_response_payload_handler',
'JWT_EXPIRATION_DELTA': datetime.timedelta(minutes=10),
'JWT_AUTH_HEADER_PREFIX': 'JWT'
}

The payload returned does not contain email/is_staff. Perhaps I am missing something.

1 Answers

The registered handler in the JWT_RESPONSE_PAYLOAD_HANDLER setting option is invoked after the JWT token is generated.

The handler requiring customization is JWT_PAYLOAD_HANDLER which creates the payload object that is tokenized and not JWT_RESPONSE_PAYLOAD_HANDLER.

In your project settings, configure

JWT_AUTH = {
  'JWT_PAYLOAD_HANDLER': 'merchant.coin_app.views.jwt_payload_handler',
  'JWT_EXPIRATION_DELTA': datetime.timedelta(minutes=10),
  'JWT_AUTH_HEADER_PREFIX': 'JWT'
}

Then in your view, extend the result of rest_framework_jwt.utils.jwt_payload_handler

import rest_framework_jwt.utils.jwt_payload_handler as base_jwt_payload_handler

def jwt_response_payload_handler(user):
    payload = base_jwt_payload_handler(user)
    payload['user'] = User_Serializer(user).data
    return payload
Related