django-cors-headers 不允许来自允许来源的请求
django-cors-headers does not allow a request from an allowed origin
我面临的问题是无法从我的 NextJS 前端获取现有用户。我使用的后端框架是 Django(以及 django-cors-headers 包)。 django-cors-headers 不允许某个 HTTP 请求,但它应该允许。
我的 next.config.js 包含重写,以便我可以访问我的后端。
async redirects() {
return [
{
source: '/api/:path*',
destination: 'http://localhost:8000/:path*/',
permanent: true,
},
]
},
我的 django-cors-headers 设置如下所示:
# CORS
CSRF_TRUSTED_ORIGINS = [
'http://localhost:3000',
]
CORS_ALLOWED_ORIGINS = [
'http://localhost:3000',
'http://localhost:8000',
'http://127.0.0.1:3000',
'http://127.0.0.1:8000',
]
CORS_ALLOW_ALL_ORIGINS = True
失败的请求尝试获取 ID 为 1 的用户。此用户存在,因此,此请求应该会成功。
fetch(`/api/users/${String(userId)}/`, {
mode: 'cors',
credentials: 'include',
headers: {
'Content-Type': 'application/json',
},
})
但是,我从请求中得到的唯一信息是关于 CORS 的错误消息。
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8000/users/1.
(Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
Status code: 301.
看来我的 django-cors-headers 设置有误。但我可以获取我的 JWT 令牌。以下请求成功。
fetch('/api/token', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
email: mail,
password,
}),
})
这是 django cors 的设置 headers。在 settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# add this
'corsheaders',
]
MIDDLEWARE = [
# add this
'corsheaders.middleware.CorsMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# set this
CORS_ALLOW_ALL_ORIGINS=True
Status code: 301
表示请求的资源无效,所以应该将请求重定向到合适的url。您很可能正在向无效端点发送请求
对于 CORS,我们有几件事需要考虑。您可以在此处找到更多信息:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers,转到 Access-Control 链接。
您上面的配置,您已经设置:
- CORS_ALLOWED_ORIGINS: http://localhost:8000, ...
- CORS_ALLOW_METHODS:“DELETE”、“GET”、“OPTIONS”、“PATCH”、“POST”、“PUT”(默认)
- CORS_ALLOW_CREDENTIALS:假(默认)
- CORS_ALLOW_HEADERS = [
“接受”,
"accept-encoding",
“授权”,
"content-type",
“dnt”,
“起源”,
"user-agent",
"x-csrftoken",
"x-requested-with",
](默认)
因此,如果您的应用使用凭据,请将 CORS_ALLOW_CREDENTIALS 更改为 True。如果仍然无法正常工作,请检查您的请求 headers,确保其中没有特殊的 headers,如果您的请求中确实有特殊的 headers,最好在 CORS_ALLOW_HEADERS.
除了仔细检查我的中间件的加载顺序之外,我尝试了几乎所有方法...我通过以下加载顺序解决了我的问题
MIDDLEWARE = [
# Default
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# CORS
'corsheaders.middleware.CorsMiddleware',
]
...到
MIDDLEWARE = [
# CORS
'corsheaders.middleware.CorsMiddleware',
# Default
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
我知道它必须是简单的东西,但现在我觉得自己像个大白痴...
我面临的问题是无法从我的 NextJS 前端获取现有用户。我使用的后端框架是 Django(以及 django-cors-headers 包)。 django-cors-headers 不允许某个 HTTP 请求,但它应该允许。
我的 next.config.js 包含重写,以便我可以访问我的后端。
async redirects() {
return [
{
source: '/api/:path*',
destination: 'http://localhost:8000/:path*/',
permanent: true,
},
]
},
我的 django-cors-headers 设置如下所示:
# CORS
CSRF_TRUSTED_ORIGINS = [
'http://localhost:3000',
]
CORS_ALLOWED_ORIGINS = [
'http://localhost:3000',
'http://localhost:8000',
'http://127.0.0.1:3000',
'http://127.0.0.1:8000',
]
CORS_ALLOW_ALL_ORIGINS = True
失败的请求尝试获取 ID 为 1 的用户。此用户存在,因此,此请求应该会成功。
fetch(`/api/users/${String(userId)}/`, {
mode: 'cors',
credentials: 'include',
headers: {
'Content-Type': 'application/json',
},
})
但是,我从请求中得到的唯一信息是关于 CORS 的错误消息。
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8000/users/1.
(Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
Status code: 301.
看来我的 django-cors-headers 设置有误。但我可以获取我的 JWT 令牌。以下请求成功。
fetch('/api/token', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
email: mail,
password,
}),
})
这是 django cors 的设置 headers。在 settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# add this
'corsheaders',
]
MIDDLEWARE = [
# add this
'corsheaders.middleware.CorsMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# set this
CORS_ALLOW_ALL_ORIGINS=True
Status code: 301
表示请求的资源无效,所以应该将请求重定向到合适的url。您很可能正在向无效端点发送请求
对于 CORS,我们有几件事需要考虑。您可以在此处找到更多信息:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers,转到 Access-Control 链接。
您上面的配置,您已经设置:
- CORS_ALLOWED_ORIGINS: http://localhost:8000, ...
- CORS_ALLOW_METHODS:“DELETE”、“GET”、“OPTIONS”、“PATCH”、“POST”、“PUT”(默认)
- CORS_ALLOW_CREDENTIALS:假(默认)
- CORS_ALLOW_HEADERS = [ “接受”, "accept-encoding", “授权”, "content-type", “dnt”, “起源”, "user-agent", "x-csrftoken", "x-requested-with", ](默认)
因此,如果您的应用使用凭据,请将 CORS_ALLOW_CREDENTIALS 更改为 True。如果仍然无法正常工作,请检查您的请求 headers,确保其中没有特殊的 headers,如果您的请求中确实有特殊的 headers,最好在 CORS_ALLOW_HEADERS.
除了仔细检查我的中间件的加载顺序之外,我尝试了几乎所有方法...我通过以下加载顺序解决了我的问题
MIDDLEWARE = [
# Default
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# CORS
'corsheaders.middleware.CorsMiddleware',
]
...到
MIDDLEWARE = [
# CORS
'corsheaders.middleware.CorsMiddleware',
# Default
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
我知道它必须是简单的东西,但现在我觉得自己像个大白痴...