Django - Добавьте пользовательскую авторизацию в конечную точку. Убедитесь, что пользователь, редактирующий сущность, является создателем

У меня есть конечная точка представления PUT, обновляющая существующую сущность Post, но я хочу, чтобы ей было разрешено обновление только в том случае, если пользователь действительно является создателем. Поэтому, когда кто-либо делает запрос, токен AWS Cognito сопровождается запросом и аутентифицируется. Из токена я могу получить uuid пользователя, затем я хочу сравнить его с атрибутом creator_id модели Post, если они одинаковы, разрешить редактирование, в противном случае вернуть 401. Как мне создать и добавить пользовательский авторизатор для проверки этого?

view.py

@api_view(['PUT'])
@method_decorator(cognito_authenticator)
def update_post_by_id(request, post_id):
    try:
        post = Post.objects.get(pk=post_id)
    except Post.DoesNotExist:
        return JsonResponse(dict(error=f'Post id: {post_id} does not exists'), status=status.HTTP_400_BAD_REQUEST)

    user_id = get_user_from_token(post_id)

    if user_id != post.creator_id:
        return JsonResponse(dict(error='Not authorized'), status=status.HTTP_401_UNAUTHORIZED)

    serializer = PostSerializer(post, data=request.data)
    if serializer.is_valid():
        try:
            post_obj = serializer.save()
        except django.db.utils.InternalError as e:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

        return Response(serializer.data, status=status.HTTP_201_CREATED)
    else:
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

аутентификация

def get_user_from_token(request):
    auth = request.headers.get("Authorization", None)
    parts = auth.split()
    res = decode_cognito_jwt(parts[1])
    return res

model.py

class Post(AbstractBaseModel):
    creator_id = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name="post_creator_id")
    goal_id = models.ForeignKey(Goal, on_delete=models.CASCADE)
    body = models.CharField(max_length=511, validators=[MinLengthValidator(5)])
    hash_tags = models.ManyToManyField(HashTag)
    type = models.CharField(
        choices=PostType.choices,
        max_length=50
    )
Вернуться на верх