I've added my own UserDetailsSerializer to my project and copied the default code into my project but get this error when i login.
To start with my CustomUserDetailsSerializer is copied right from the dj_rest_suth source, just to get it working
django.request ERROR Internal Server Error: /rest-auth/google/
Traceback (most recent call last):
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/django/views/generic/base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/django/utils/decorators.py", line 43, in _wrapper
return bound_method(*args, **kwargs)
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/django/views/decorators/debug.py", line 76, in sensitive_post_parameters_wrapper
return view(request, *args, **kwargs)
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/dj_rest_auth/views.py", line 46, in dispatch
return super(LoginView, self).dispatch(*args, **kwargs)
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/rest_framework/views.py", line 505, in dispatch
response = self.handle_exception(exc)
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/rest_framework/views.py", line 465, in handle_exception
self.raise_uncaught_exception(exc)
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/rest_framework/views.py", line 476, in raise_uncaught_exception
raise exc
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/rest_framework/views.py", line 502, in dispatch
response = handler(request, *args, **kwargs)
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/dj_rest_auth/views.py", line 107, in post
return self.get_response()
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/dj_rest_auth/views.py", line 85, in get_response
response = Response(serializer.data, status=status.HTTP_200_OK)
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/rest_framework/serializers.py", line 562, in data
ret = super().data
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/rest_framework/serializers.py", line 260, in data
self._data = self.to_representation(self.instance)
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/rest_framework/serializers.py", line 529, in to_representation
ret[field.field_name] = field.to_representation(attribute)
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/rest_framework/fields.py", line 1905, in to_representation
return method(value)
File "/Users/adam/dev/web/rwe/.venv/lib/python3.7/site-packages/dj_rest_auth/serializers.py", line 149, in get_user
user_data = JWTUserDetailsSerializer(obj['user'], context=self.context).data
TypeError: 'str' object is not callable
class CustomUserDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = user_model
fields = ('id', 'username', 'email', 'first_name', 'last_name')
read_only_fields = ('email',)
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(days=1),
'REFRESH_TOKEN_LIFTIME': timedelta(days=3),
'ROTATE_REFRESH_TOKEN': True, # Issue a new refresh token with a new access token
'BLACKLIST_AFTER_ROTATION': True, # Blacklist old/used refresh tokens
'ALGORITHM': 'RS512', # RSA private/public key pair
'SIGNING_KEY': os.getenv('PRIVATE_KEY'), # Private RSA key
'VERIFYING_KEY': os.getenv('PUBLIC_KEY'), # Public RSA key
'AUTH_HEADER_TYPES': 'Bearer',
'USER_ID_FIELD': 'id',
'USER_ID_CLAIM': 'user_id',
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
'TOKEN_TYPE_CLAIM': 'access', # Type of token to allow for auth ( access, sliding, refresh )
'JTI_CLAIM': 'jti',
}
REST_AUTH_SERIALIZERS = {
'USER_DETAILS_SERIALIZER': 'backend.core.serializers.CustomUserDetailsSerializer',
}
I've discovered if I create a custom JWTSerializer and use that the error disappears, as well as everything working as expected if i do not define any custom serializers:
REST_AUTH_SERIALIZERS = {
'JWT_SERIALIZER': 'backend.core.serializers.CustomJWTSerializer',
'USER_DETAILS_SERIALIZER': 'backend.core.serializers.CustomUserDetailsSerializer',
}
class CustomUserDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = user_model
fields = ('id', 'username', 'email', 'first_name', 'last_name')
read_only_fields = ('email',)
class CustomJWTSerializer(serializers.Serializer):
"""
Serializer for JWT authentication.
"""
access_token = serializers.CharField()
refresh_token = serializers.CharField()
user = serializers.SerializerMethodField()
def get_user(self, obj):
"""
Required to allow using custom USER_DETAILS_SERIALIZER in
JWTSerializer. Defining it here to avoid circular imports
"""
JWTUserDetailsSerializer = CustomUserDetailsSerializer
user_data = JWTUserDetailsSerializer(obj['user'], context=self.context).data
return user_data