Вопросы безопасности API в Django & React - Может ли Django проверить, что userid в API == userid в Token?

В Django's views.py у меня есть следующий код:

class MutatieView(viewsets.ModelViewSet):
# authentication_classes = (TokenAuthentication,)
authentication_classes = (JWTAuthentication,)
permission_classes = (IsAuthenticated,)
serializer_class = MutatieSerializer
queryset = Mutatie.objects.all()

def get_queryset(self, **kwargs):
    user_mutatie = Mutatie.objects.filter(userid=self.kwargs['userid'])
    return user_mutatie

В React отправляется GET-запрос с правильным токеном в заголовке. Но я закомментировал исходную строку (см. ниже) и запросил userid=1 вместо userid как переменной текущего пользователя, который равен 2.

export const apiSlice = createApi({
reducerPath: "api",
baseQuery: fetchBaseQuery({
    baseUrl: "http://127.0.0.1:8000/api/",
    prepareHeaders: (headers, { getState }) => {
        const access = (getState() as RootState).auth.access
        if (access) {
          headers.set('Authorization', `Bearer ${access}`);
        }
        return headers
      },
}),
tagTypes: ['MyMutatie',],
endpoints: (builder) => ({   
    ...
    myMutatieList: builder.query<IMutatie[], number>({
        query: (userid:number) => ({
            url: `mutaties/1/`,
            // url: `mutaties/${userid}/`,
        }),
    providesTags: ['MyMutatie']
    }),
    ...
}),       

});

Теперь я получаю данные пользователя1 как пользователя2, что является проблемой.

Django должен уметь видеть в токене, что правильный userid=2, а не 1. Как добиться такой валидации?

Только ли разработчик может манипулировать вызовами api, как в коде выше, или есть другие способы? В postman, но django разрешает API только из заданного домена? Это тоже можно подделать?

Вам не нужно отправлять userid в качестве параметра URL, промежуточное ПО аутентификации Django решит эту проблему за вас. Используйте:

user_mutatie = Mutatie.objects.filter(userid=self.request.user.id)

Для django only allows APIs from the given domain вы можете добавить домен в ALLOWED_HOSTS.

Вернуться на верх