Django проверяет AuthenToken вручную в сериализаторе - PullRequest
0 голосов
/ 11 июня 2018

Так что у меня есть приложение, где я могу забронировать номера.Но я хочу проверить пользователя, когда он бронирует комнату.Я знаю, что могу сделать это с помощью функции receive_auth_token.Но я хочу сам проверить пользователя с помощью токена.Поэтому я сохраняю токен для пользователя, когда пользователь входит на сайт, и когда пользователь хочет забронировать номер, я даю токен в качестве параметра для представления / сериализатора бронирования.

Теперь я хочу проверить этот токен, отправленный с запросом на бронирование.

Вот как выглядит мой сериализатор:

class BuchungSerializer(ModelSerializer):
"""Serializer to map the Model instance into JSON format."""
token = serializers.CharField(required=True, allow_blank=False, write_only=True)
class Meta:
    """Meta class to map serializer's fields with the model fields."""
    model = Buchung
    fields = ['id', 'user', 'time_choices', 'raum', 'platz', 'datum', 'token']
    related_fields = ['user', 'raum', 'platz']
    extra_kwargs = {"token": {"write_only": True}}


    username = serializers.CharField(source='user.username')

    def validate_token(self, value):
        user = Mitarbeiter.objects.filter(Q(username = username))
        if user.exists() and user.count() == 1:
            user_obj = user.first()
            user_token = user_obj.usertoken
            token = Token.objects.get(key=value)
            if token == user_token:
                return value
            else:
                raise ValidationError("Token not Valid")
        else:
            raise ValidationError("User doesn't exist")


    def create(self, validated_data):
        reservation = Buchung(
            user=validated_data['user'],
            time_choices=validated_data['time_choices'],
            raum=validated_data['raum'],
            platz=validated_data['platz'],
            datum=validated_data['datum'],
        )
        reservation.set_token(validated_data['token'])
        reservation.save()
        return reservation

Мой вид:

class CreateBuchungView(generics.ListCreateAPIView):
queryset = Buchung.objects.all()
serializer_class = BuchungSerializer
#permission_classes = [IsAuthenticated]


def perform_create(self, serializer):
    """Save the post data when creating a new reservation."""
    serializer.save()

и моя модель:

class Buchung(models.Model):
TIME_CHOICES = (
    ('Ganztag', 'Ganztag'),
    ('Halbtags vor 14', 'Halbtags vor 14'),
    ('Halbtags nach 14', 'Halbtags nach 14'),
)


cearted_on = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(Mitarbeiter, on_delete=models.CASCADE, default='')
raum = models.ForeignKey(Raum, on_delete=models.CASCADE, default='')
platz = models.ForeignKey(Platz, on_delete=models.CASCADE, default='')
time_choices = models.CharField(max_length=100, choices=TIME_CHOICES, default='Ganztag')
datum = models.DateField(("Datum"), default=datetime.date.today)
token = models.CharField(max_length=300, default='')

def __str__(self):
    return "%s am %s" % (self.user, self.datum)

Но я думаю, что проблема в том, что функция валидатора в сериализаторе не работает или даже не вызывается.Спасибо.

1 Ответ

0 голосов
/ 12 июня 2018

Итак, у меня проблема.

Проблема была в сериализаторе, функция проверки не была вызвана вообще.Если это то, что я сделал, небезопасно, то просьба вызвать его.Вот так выглядит мой сериализатор.

class BuchungSerializer(ModelSerializer):
"""Serializer to map the Model instance into JSON format."""
def validate(self, data):
    username = data.get("username")
    user = Mitarbeiter.objects.filter(Q(username = username))
    if user.exists() and user.count() == 1:
        user_obj = user.first()
        input_token = data.get("token")
        token = Token.objects.get(user=user_obj)
        yay_token = token.key
        if yay_token == input_token:
            return data
        else:
            raise ValidationError("UToken not Valid")
    else:
        raise ValidationError("User doesn't exist")

class Meta:
    """Meta class to map serializer's fields with the model fields."""
    model = Buchung
    fields = ['id', 'user', 'username', 'time_choices', 'raum', 'platz', 'datum', 'token']
    related_fields = ['user', 'raum', 'platz']
    extra_kwargs = {"token": {"write_only": True}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...