Ошибка Cors, возникающая на веб-странице с аутентификацией simplejwt
Я использовал simplejwt в своем коде и я также добавил django-cors-headers в свой проект, чтобы позволить разработку фронтенда. проблема в том, что у меня есть 2 API, которые требуют аутентификации, чтобы позволить пользователям работать с ними, и я не могу отправить запрос к этим двум API на фронтенде и получаю следующую ошибку:
Access to fetch at 'http://localhost:8000/api/user/myapi' from origin 'http://localhost:3000' has been blocked by CORS policy: Request header field x-auth-token is not allowed by Access-Coontrol-Allow-Headers in preflight response
Вот важные части моего settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'rest_framework.authtoken',
'rest_framework_simplejwt',
'corsheaders',
...
]
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
]
ALLOWED_HOSTS=['*']
CORS_ORIGIN_ALLOW_ALL = True
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10,
}
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(days=10),
'REFRESH_TOKEN_LIFETIME': timedelta(days=10),
'ROTATE_REFRESH_TOKENS': True,
'BLACKLIST_AFTER_ROTATION': False,
'ALGORITHM': 'HS256',
'SIGNING_KEY': SECRET_KEY,
'VERIFYING_KEY': None,
'AUTH_HEADER_TYPES': ('JWT',),
'USER_ID_FIELD': 'userID',
'USER_ID_CLAIM': 'user_id',
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
'TOKEN_TYPE_CLAIM': 'token_type',
}
и вот мои views.py и serializers.py
# Serializers.py
class myAPISerializer(serializers.ModelSerializer):
class Meta:
model = someModel
fields = ('user', 'someField',)
read_only_fields = ('user',)
def create(self, validated_data):
... #Some changes
return super().create(validated_data)
# Views.py
class PaymentView(generics.CreateAPIView):
serializer_class = PaymentSerializer
def get_queryset(self):
return Payment.objects.all()
Согласно документации django-cors-headers:
CorsMiddleware должен быть размещен как можно выше, особенно перед любого промежуточного ПО, которое может генерировать ответы, например, Django's CommonMiddleware или WhiteNoiseMiddleware от Whitenoise. Если оно не находится до, оно не сможет добавить CORS заголовки к этим ответы.
Так что просто добавьте его в начало списка, например, так:
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
...,
]