Вопросы безопасности 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
.