From 825b7c8def2a44270c221046907a03fcd081ed65 Mon Sep 17 00:00:00 2001 From: eugena Date: Tue, 29 Sep 2015 16:15:56 +0500 Subject: [PATCH] Ability to use simplified login --- docs/configuration.rst | 5 +++++ rest_auth/app_settings.py | 5 +++++ rest_auth/serializers.py | 28 ++++++++++++++++++++++++++++ rest_auth/urls.py | 14 ++++++++++++-- rest_auth/views.py | 34 ++++++++++++++++++++++++++++++++-- 5 files changed, 82 insertions(+), 4 deletions(-) diff --git a/docs/configuration.rst b/docs/configuration.rst index db7e2cd..afdf4c6 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -8,6 +8,8 @@ Configuration - LOGIN_SERIALIZER - serializer class in ``rest_auth.views.LoginView``, default value ``rest_auth.serializers.LoginSerializer`` + - SIMPLE_LOGIN_SERIALIZER - serializer class in ``rest_auth.views.SimpleLoginView``, default value ``rest_auth.serializers.SimpleLoginSerializer`` + - TOKEN_SERIALIZER - response for successful authentication in ``rest_auth.views.LoginView``, default value ``rest_auth.serializers.TokenSerializer`` - USER_DETAILS_SERIALIZER - serializer class in ``rest_auth.views.UserDetailsView``, default value ``rest_auth.serializers.UserDetailsSerializer`` @@ -40,3 +42,6 @@ Configuration - **USER_DETAILS_INCLUDED** - is user details urls are needed + + +- **SIMPLE_LOGIN** - is simplified is used \ No newline at end of file diff --git a/rest_auth/app_settings.py b/rest_auth/app_settings.py index e0340b7..da9832d 100644 --- a/rest_auth/app_settings.py +++ b/rest_auth/app_settings.py @@ -4,6 +4,7 @@ from rest_auth.serializers import ( TokenSerializer as DefaultTokenSerializer, UserDetailsSerializer as DefaultUserDetailsSerializer, LoginSerializer as DefaultLoginSerializer, + SimpleLoginSerializer as DefaultSimpleLoginSerializer, PasswordResetSerializer as DefaultPasswordResetSerializer, PasswordResetConfirmSerializer as DefaultPasswordResetConfirmSerializer, PasswordChangeSerializer as DefaultPasswordChangeSerializer) @@ -23,6 +24,10 @@ LoginSerializer = import_callable( serializers.get('LOGIN_SERIALIZER', DefaultLoginSerializer) ) +SimpleLoginSerializer = import_callable( + serializers.get('SIMPLE_LOGIN_SERIALIZER', DefaultSimpleLoginSerializer) +) + PasswordResetSerializer = import_callable( serializers.get( 'PASSWORD_RESET_SERIALIZER', diff --git a/rest_auth/serializers.py b/rest_auth/serializers.py index edbe58d..22783b0 100644 --- a/rest_auth/serializers.py +++ b/rest_auth/serializers.py @@ -14,6 +14,34 @@ from rest_framework.authtoken.models import Token from rest_framework.exceptions import ValidationError +class SimpleLoginSerializer(serializers.Serializer): + username = serializers.CharField() + password = serializers.CharField(style={'input_type': 'password'}) + + def validate(self, attrs): + username = attrs.get('username') + password = attrs.get('password') + + if username and password: + user = authenticate(username=username, password=password) + + else: + msg = _('Must include "username" and "password".') + raise exceptions.ValidationError(msg) + + # Did we get back an active user? + if user: + if not user.is_active: + msg = _('User account is disabled.') + raise exceptions.ValidationError(msg) + else: + msg = _('Unable to log in with provided credentials.') + raise exceptions.ValidationError(msg) + + attrs['user'] = user + return attrs + + class LoginSerializer(serializers.Serializer): username = serializers.CharField(required=False, allow_blank=True) email = serializers.EmailField(required=False, allow_blank=True) diff --git a/rest_auth/urls.py b/rest_auth/urls.py index 866515f..5da939d 100644 --- a/rest_auth/urls.py +++ b/rest_auth/urls.py @@ -3,7 +3,7 @@ from django.conf.urls import patterns, url from django.conf import settings from rest_auth.views import ( - LoginView, LogoutView, UserDetailsView, PasswordChangeView, + LoginView, SimpleLoginView, LogoutView, UserDetailsView, PasswordChangeView, PasswordResetView, PasswordResetConfirmView ) @@ -14,7 +14,6 @@ urlpatterns = patterns( name='rest_password_reset'), url(r'^password/reset/confirm/$', PasswordResetConfirmView.as_view(), name='rest_password_reset_confirm'), - url(r'^login/$', LoginView.as_view(), name='rest_login'), # URLs that require a user to be logged in with a valid session / token. url(r'^logout/$', LogoutView.as_view(), name='rest_logout'), url(r'^password/change/$', PasswordChangeView.as_view(), @@ -26,3 +25,14 @@ if getattr(settings, 'USER_DETAILS_INCLUDED', True): '', url(r'^user/$', UserDetailsView.as_view(), name='rest_user_details'), ) + +if getattr(settings, 'SIMPLE_LOGIN', False): + urlpatterns += patterns( + '', + url(r'^login/$', SimpleLoginView.as_view(), name='rest_login'), +) +else: + urlpatterns += patterns( + '', + url(r'^login/$', LoginView.as_view(), name='rest_login'), +) \ No newline at end of file diff --git a/rest_auth/views.py b/rest_auth/views.py index d789ac4..0a0aa33 100644 --- a/rest_auth/views.py +++ b/rest_auth/views.py @@ -10,11 +10,41 @@ from rest_framework.authtoken.models import Token from rest_framework.generics import RetrieveUpdateAPIView from .app_settings import ( - TokenSerializer, UserDetailsSerializer, LoginSerializer, - PasswordResetSerializer, PasswordResetConfirmSerializer, + TokenSerializer, UserDetailsSerializer, SimpleLoginSerializer, + LoginSerializer, PasswordResetSerializer, PasswordResetConfirmSerializer, PasswordChangeSerializer ) +class SimpleLoginView(GenericAPIView): + + """ + Check the credentials and authenticated if the credentials are valid . + Calls Django Auth login method to register User ID + in Django session framework + + Accept the following POST parameters: username, password + """ + permission_classes = (AllowAny,) + serializer_class = SimpleLoginSerializer + + def login(self): + self.user = self.serializer.validated_data['user'] + + if getattr(settings, 'REST_SESSION_LOGIN', True): + login(self.request, self.user) + + def get_error_response(self): + return Response( + self.serializer.errors, status=status.HTTP_400_BAD_REQUEST + ) + + def post(self, request, *args, **kwargs): + self.serializer = self.get_serializer(data=self.request.data) + if not self.serializer.is_valid(): + return self.get_error_response() + self.login() + return Response({}, status=status.HTTP_200_OK) + class LoginView(GenericAPIView):