How to check email verification code equality in django rest framework?

Viewed 558

I am trying to build a email verification for my website with django rest framework. The mechanism is like this:

  1. User enters his email and presses continue button
  2. He gets a 6 digit verification code
  3. He enters the 6 digit code that he received
  4. If the code is valid he goes to next step and else an error occurs

My problem is in step 4. I don't know how to check the verification code equality, because I can't get it from step 2.

My codes are below. I'd be so happy if anyone can help me through this problem:)

serializers.py

class CodeSerializer(serializers.Serializer):
    code = serializers.IntegerField()

class EmailSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ['email', ]

methods.py

import random
from django.conf import settings
from django.core.mail import send_mail

def generate_activation_code():
    return int(''.join([str(random.randint(0,10)) for _ in range(6)]))

def send_verification_mail(email):
    
    generated_code = generate_activation_code()
    subject = 'Sinjim verification code'
    message = f'Your verification code:\n{generated_code}\nThanks for using sinjim.'
    from_email = settings.EMAIL_HOST_USER
    recipient_list=[email, ]
    send_mail(subject, message, from_email, recipient_list)

views.py

class EmailView(APIView):

    def post(self, request, format=None):
        serializer = EmailSerializer(data=request.data)
        if serializer.is_valid():
            email = serializer.validated_data['email']
            methods.send_verification_mail(email)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class CodeView(APIView): 

    def post(self, request, format=None):
        serializer = CodeSerializer(data=request.data)
        code2 = methods.generate_activation_code()
        if serializer.is_valid():
            if serializer.validated_data['code'] == code2:
                return Response({'message':'equal'})
            else:
                return Response({'message':'not equal'})
        else:
            print(serializer.errors)
            return Response({'message': 'Serializer is not valid'})

I want to know how to get the generated code in EmailView and use it in CodeView for equality check.

Thanks

1 Answers

Here is what is missing in your code ,

  1. User enters his email and presses continue button

  2. Backend gets the email and generates a 6 digit verification for that specific email

  3. He gets a 6 digit verification code

  4. He enters the 6 digit code that he received

  5. If the code is valid (check if the code exist for that email ) he goes to next step and else an error occurs

You need to keep track of email and code, so add a model that will contain code with email. Later verify with a query and based on that return equal or not equal.

class CodeEmail(models.Model):
    code = models.IntegerField()
    email = models.EmailField(max_length=254)

class CodeSerializer(serializers.Serializer):
    code = serializers.IntegerField()
    email  = serializers.EmailField()

class CodeView(APIView): 

    def post(self, request, format=None):
        serializer = CodeSerializer(data=request.data)
        if serializer.is_valid():
            if CodeEmail.objects.filter(code = serializer.validated_data['code'] , email= serializer.validated_data['email']).exists()  :
                return Response({'message':'equal'})
            else:
                return Response({'message':'not equal'})
        else:
            print(serializer.errors)
            return Response({'message': 'Serializer is not valid'})
Related