Django Simple JWT + Axios, всегда получаю 401. Как я могу это исправить?
Я использую Nuxt и хранилище pinia для хранения токена (токен присутствует в хранилище). Я создал плагин для Axios следующим образом:
import axios from "axios";
export default defineNuxtPlugin((NuxtApp) => {
axios.defaults.baseURL = "http://127.0.0.1:8000/api/";
axios.defaults.withCredentials = false;
axios.defaults.proxyHeaders = false;
if (process.client) {
let token = window.localStorage.getItem("authTokens");
if (token) {
token = JSON.parse(token);
console.log(token.access);
axios.defaults.headers.common["Authorization"] = `Bearer ${token.access}`;
}
}
return {
provide: {
axios: axios,
},
};
});
Конечная точка в Django REST Framework определяется следующим образом:
class CreateEvent(CreateAPIView):
permission_classes = [IsAuthenticated]
serializer_class = CreateEventSerializer
def post(self, request, *args, **kwargs):
data = request.data.copy()
z = request.META.get('HTTP_AUTHORIZATION')
data['creator'] = request.user
print(request.user, '--------------------')
data['types'] = get_type_by_int(request.data.get('type', None))
serializer = self.get_serializer(data=data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Метод, который я использую для вызова этой конечной точки, выглядит следующим образом:
async sendEvent(): Promise<void> {
try {
const { $axios } = useNuxtApp();
const response = await $axios.post("event/create/", {
latitiude: this.latitiude,
longitude: this.longitude,
description: this.description,
type: this.type,
});
console.log("Event sent:", response.data);
} catch (error) {
console.error("Error while sending event");
}
}
Независимо от того, что я делаю, я продолжаю получать ошибку 401 с сообщением: Учетные данные для аутентификации не были предоставлены. Однако строка z = request.META.get('HTTP_AUTHORIZATION') содержит значение.
Вот мои настройки DRF:
SIMPLE_JWT = {
"ACCESS_TOKEN_LIFETIME": timedelta(minutes=15),
"REFRESH_TOKEN_LIFETIME": timedelta(days=1),
"TOKEN_OBTAIN_SERIALIZER": "account.utils.MyTokenObtainPairSerializer",
}
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": (
"rest_framework_simplejwt.authentication.JWTAuthentication",
)
}
INSTALLED_APPS = [
...
"rest_framework",
"rest_framework_simplejwt",
"corsheaders",
"drf_yasg",
...
]
Что может быть причиной этой проблемы и как ее решить?
Я пробовал менять токен на Bearer и без него, редактировать конечную точку, делать запросы на этот адрес с помощью Postman и изменять настройки simple_jwt. Я знаю, что токен отправляется, потому что если я изменяю его структуру, даже если токен новый, я получаю следующую ошибку: { «detail»: «Данный токен не подходит ни для одного типа токенов», „code“: «token_not_valid», „messages“: [ { «token_class»: «AccessToken», „token_type“: «access», „message“: «Токен недействителен или истек» } ] }