Django - "check_token" всегда возвращает TRUE

Когда пользователь регистрируется в моем приложении, на его электронную почту отправляется ссылка для проверки аккаунта. При первом нажатии на ссылку все происходит нормально и учетная запись верифицируется, но при повторном нажатии на ту же ссылку проверка проходит, тогда как должна возникать ошибка "authentication failed", поскольку "check_token" должен возвращать false, верно?

Вот сериализатор проверки:

class VerifyAccountSerializer(serializers.Serializer):
    uid = serializers.CharField(min_length=1, write_only=True)
    token = serializers.CharField(min_length=1, write_only=True)
    
    class Meta:
        fields = ['uid', 'token']
    
    def validate(self, attrs):
        uid = attrs.get('uid')
        token = attrs.get('token')

        uidb64 = force_text(urlsafe_base64_decode(uid))
        user = UserAccount.objects.get(pk=uidb64)

        if user is None:
            raise AuthenticationFailed('Invalid account. Please contant support')

        if not PasswordResetTokenGenerator().check_token(user, token):
            raise AuthenticationFailed('Account verify link is invalid. Please contant support.')

        user.is_guest = False
        user.save()

        return user

И функция просмотра:

@api_view(['POST'])
def verify_account(request):
    if request.method == 'POST':
        data = {}
        serializer = VerifyAccountSerializer(data=request.data)
        if serializer.is_valid():
            user = serializer.validated_data

            data['user'] = UserSerializer(user).data
            data['token'] = AuthToken.objects.create(user)[1]

            # delete previous token
            tokens = AuthToken.objects.filter(user=user.id)
            if len(tokens) > 1:
                tokens[0].delete()

            return Response(data, status=status.HTTP_200_OK)
        
        data = serializer.errors
        return Response(data, status=status.HTTP_400_BAD_REQUEST

Странно, почему он не выдает ошибку, потому что в моем другом сериализаторе для сброса пароля по ссылке происходит точно то же самое, только там есть еще одно дополнительное поле для пароля, и если нажать на эту ссылку во второй раз, я получаю ошибку валидации.

Вернуться на верх