mirror of
https://github.com/Tivix/django-rest-auth.git
synced 2025-06-28 16:43:04 +03:00
This would be a breaking change, and would make it harder to use JWT and Knox simultaneously (e.g. JWT for Web, Knox for Mobile), so reverted.
129 lines
4.5 KiB
Python
129 lines
4.5 KiB
Python
from django.conf import settings
|
|
from django.utils.decorators import method_decorator
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from django.views.decorators.debug import sensitive_post_parameters
|
|
|
|
from rest_framework.views import APIView
|
|
from rest_framework.response import Response
|
|
from rest_framework.permissions import AllowAny
|
|
from rest_framework.generics import CreateAPIView
|
|
from rest_framework import status
|
|
|
|
from allauth.account.adapter import get_adapter
|
|
from allauth.account.views import ConfirmEmailView
|
|
from allauth.account.utils import complete_signup
|
|
from allauth.account import app_settings as allauth_settings
|
|
|
|
from rest_auth.app_settings import (TokenSerializer,
|
|
JWTSerializer,
|
|
KnoxTokenSerializer,
|
|
create_token)
|
|
from rest_auth.models import TokenModel
|
|
from rest_auth.registration.serializers import (SocialLoginSerializer,
|
|
VerifyEmailSerializer)
|
|
from rest_auth.utils import jwt_encode
|
|
from rest_auth.views import LoginView
|
|
from .app_settings import RegisterSerializer
|
|
|
|
sensitive_post_parameters_m = method_decorator(
|
|
sensitive_post_parameters('password1', 'password2')
|
|
)
|
|
|
|
|
|
class RegisterView(CreateAPIView):
|
|
serializer_class = RegisterSerializer
|
|
permission_classes = (AllowAny, )
|
|
token_model = TokenModel
|
|
|
|
@sensitive_post_parameters_m
|
|
def dispatch(self, *args, **kwargs):
|
|
return super(RegisterView, self).dispatch(*args, **kwargs)
|
|
|
|
def get_response_data(self, user):
|
|
if allauth_settings.EMAIL_VERIFICATION == \
|
|
allauth_settings.EmailVerificationMethod.MANDATORY:
|
|
return {"detail": _("Verification e-mail sent.")}
|
|
|
|
if getattr(settings, 'REST_USE_JWT', False):
|
|
data = {
|
|
'user': user,
|
|
'token': self.token
|
|
}
|
|
return JWTSerializer(data).data
|
|
if getattr(settings, 'REST_AUTH_TOKEN_APP', False) is 'knox':
|
|
data = {
|
|
'token': self.token
|
|
}
|
|
return KnoxTokenSerializer(data).data
|
|
|
|
else:
|
|
return TokenSerializer(self.token).data
|
|
|
|
def create(self, request, *args, **kwargs):
|
|
serializer = self.get_serializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
user = self.perform_create(serializer)
|
|
headers = self.get_success_headers(serializer.data)
|
|
|
|
return Response(self.get_response_data(user),
|
|
status=status.HTTP_201_CREATED,
|
|
headers=headers)
|
|
|
|
def perform_create(self, serializer):
|
|
user = serializer.save(self.request)
|
|
if getattr(settings, 'REST_USE_JWT', False):
|
|
self.token = jwt_encode(user)
|
|
else:
|
|
self.token = create_token(self.token_model, user, serializer)
|
|
|
|
complete_signup(self.request._request, user,
|
|
allauth_settings.EMAIL_VERIFICATION,
|
|
None)
|
|
return user
|
|
|
|
|
|
class VerifyEmailView(APIView, ConfirmEmailView):
|
|
permission_classes = (AllowAny,)
|
|
allowed_methods = ('POST', 'OPTIONS', 'HEAD')
|
|
|
|
def get_serializer(self, *args, **kwargs):
|
|
return VerifyEmailSerializer(*args, **kwargs)
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
serializer = self.get_serializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
self.kwargs['key'] = serializer.validated_data['key']
|
|
confirmation = self.get_object()
|
|
confirmation.confirm(self.request)
|
|
return Response({'detail': _('ok')}, status=status.HTTP_200_OK)
|
|
|
|
|
|
class SocialLoginView(LoginView):
|
|
"""
|
|
class used for social authentications
|
|
example usage for facebook with access_token
|
|
-------------
|
|
from allauth.socialaccount.providers.facebook.views import FacebookOAuth2Adapter
|
|
|
|
class FacebookLogin(SocialLoginView):
|
|
adapter_class = FacebookOAuth2Adapter
|
|
-------------
|
|
|
|
example usage for facebook with code
|
|
|
|
-------------
|
|
from allauth.socialaccount.providers.facebook.views import FacebookOAuth2Adapter
|
|
from allauth.socialaccount.providers.oauth2.client import OAuth2Client
|
|
|
|
class FacebookLogin(SocialLoginView):
|
|
adapter_class = FacebookOAuth2Adapter
|
|
client_class = OAuth2Client
|
|
callback_url = 'localhost:8000'
|
|
-------------
|
|
"""
|
|
|
|
serializer_class = SocialLoginSerializer
|
|
|
|
def process_login(self):
|
|
get_adapter(self.request).login(self.request, self.user)
|