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
)