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