diff --git a/docs/configuration.rst b/docs/configuration.rst index 59b301f..b3e62ac 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -48,6 +48,8 @@ Configuration - **REST_USE_JWT** - Enable JWT Authentication instead of Token/Session based. This is built on top of django-rest-framework-jwt http://getblimp.github.io/django-rest-framework-jwt/, which must also be installed. (default: False) +- **REST_USE_TOKEN** - Set to False if you want get USER_DETAILS_SERIALIZER instead any tokens, that can be useful if you use **just** session auth backend (default: True) + - **OLD_PASSWORD_FIELD_ENABLED** - set it to True if you want to have old password verification on password change enpoint (default: False) - **LOGOUT_ON_PASSWORD_CHANGE** - set to False if you want to keep the current user logged in after a password change diff --git a/rest_auth/registration/views.py b/rest_auth/registration/views.py index 0e0ab0d..8cb4d3c 100644 --- a/rest_auth/registration/views.py +++ b/rest_auth/registration/views.py @@ -19,7 +19,8 @@ from allauth.socialaccount import signals from allauth.socialaccount.adapter import get_adapter as get_social_adapter from allauth.socialaccount.models import SocialAccount -from rest_auth.app_settings import (TokenSerializer, +from rest_auth.app_settings import (UserDetailsSerializer, + TokenSerializer, JWTSerializer, create_token) from rest_auth.models import TokenModel @@ -56,8 +57,9 @@ class RegisterView(CreateAPIView): 'token': self.token } return JWTSerializer(data).data - else: + elif getattr(settings, 'REST_USE_TOKEN', True): return TokenSerializer(user.auth_token).data + return UserDetailsSerializer(user).data def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) @@ -73,12 +75,13 @@ class RegisterView(CreateAPIView): user = serializer.save(self.request) if getattr(settings, 'REST_USE_JWT', False): self.token = jwt_encode(user) - else: + elif getattr(settings, 'REST_USE_TOKEN', True): create_token(self.token_model, user, serializer) complete_signup(self.request._request, user, allauth_settings.EMAIL_VERIFICATION, None) + return user diff --git a/rest_auth/tests/test_api.py b/rest_auth/tests/test_api.py index 9c5fd9e..bdacf46 100644 --- a/rest_auth/tests/test_api.py +++ b/rest_auth/tests/test_api.py @@ -205,6 +205,21 @@ class APIBasicTests(TestsMixin, TestCase): # bring back allauth settings.INSTALLED_APPS.append('allauth') + @override_settings(REST_USE_TOKEN=False) + def test_login_api_return_user_information(self): + get_user_model().objects.create_user( + username=self.USERNAME, password=self.PASS, + ) + + payload = { + 'username': self.USERNAME, + 'password': self.PASS + } + self.post(self.login_url, data=payload, status_code=200) + + self.assertEqual(self.response.json['username'], self.USERNAME) + self.assertEqual(self.response.json['last_name'], "") + def test_password_change(self): login_payload = { "username": self.USERNAME, @@ -434,6 +449,18 @@ class APIBasicTests(TestsMixin, TestCase): self._login() self._logout() + @override_settings(REST_USE_TOKEN=False) + def test_registration_without_token(self): + user_count = get_user_model().objects.all().count() + + self.post(self.register_url, data=self.REGISTRATION_DATA_WITH_EMAIL, status_code=201) + self.assertEqual(self.response.json['username'], self.USERNAME) + self.assertEqual(self.response.json['email'], self.EMAIL) + + self.assertEqual(get_user_model().objects.all().count(), user_count + 1) + self._login() + self._logout() + def test_registration_with_invalid_password(self): data = self.REGISTRATION_DATA.copy() data['password2'] = 'foobar' diff --git a/rest_auth/views.py b/rest_auth/views.py index 0a0a982..5d488c8 100644 --- a/rest_auth/views.py +++ b/rest_auth/views.py @@ -54,8 +54,10 @@ class LoginView(GenericAPIView): def get_response_serializer(self): if getattr(settings, 'REST_USE_JWT', False): response_serializer = JWTSerializer - else: + elif getattr(settings, 'REST_USE_TOKEN', True): response_serializer = TokenSerializer + else: + response_serializer = UserDetailsSerializer return response_serializer def login(self): @@ -63,7 +65,7 @@ class LoginView(GenericAPIView): if getattr(settings, 'REST_USE_JWT', False): self.token = jwt_encode(self.user) - else: + elif getattr(settings, 'REST_USE_TOKEN', True): self.token = create_token(self.token_model, self.user, self.serializer) @@ -80,9 +82,12 @@ class LoginView(GenericAPIView): } serializer = serializer_class(instance=data, context={'request': self.request}) - else: + elif getattr(settings, 'REST_USE_TOKEN', True): serializer = serializer_class(instance=self.token, context={'request': self.request}) + else: + serializer = serializer_class(instance=self.user, + context={'request': self.request}) response = Response(serializer.data, status=status.HTTP_200_OK) if getattr(settings, 'REST_USE_JWT', False):