rest_framework.authtoken обновить при смене пароля - PullRequest
0 голосов
/ 06 января 2019

Мне успешно (надеюсь) удалось реализовать действие change_password.

Однако после изменения пароля клиент автоматически выходит из системы. (токен, вероятно, больше не действителен)

Я бы хотел, чтобы клиент API оставался в системе после сброса пароля, чтобы выполнять другие запросы с новым токеном.

Есть ли эквивалент для update_session_auth_hash (request, self.object) ?

сериализаторы:

class PasswordSerializer(serializers.Serializer):
    """
    Serializer for password change endpoint.
    """
    old_password = serializers.CharField(required=True)
    new_password = serializers.CharField(required=True)

API View

    @action(methods=['put'], detail=True)
    def change_password(self, request, pk):
        serializer = PasswordSerializer(data=request.data)
        if serializer.is_valid():
            user = get_object_or_404(User, pk=pk)
            if user != request.user:
                return Response({'error': "Cannot change other user's password"},
                                status=status.HTTP_403_FORBIDDEN)
            else:
                if not user.check_password(serializer.data.get('old_password')):
                    return Response({'old_password': ['Wrong password.']},
                                    status=status.HTTP_400_BAD_REQUEST)
                user.set_password(request.POST.get('new_password'))
                user.save()
        else:
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)
        return Response({'details': 'Success'}, status=status.HTTP_200_OK)

1 Ответ

0 голосов
/ 07 января 2019

Вы можете заменить новый токен после успешной смены пароля.

token, created =  Token.objects.get_or_create(user=serializer.object['user'])

token.delete()
token.created = Token.objects.create(user=serializer.object['user'])
token.save()
...