Laravel 前端到 Django 后端 x-csrf-token 预检响应中不允许
Laravel frontend to Django backend x-csrf-token not allowed in preflight response
我有 Laravel 框架,前端是 VueJS。这个前端托管在 xampp 的本地服务器上,端口 80,443 配置了 url "http://test.net". I send API requests from VueJS app using axios to a Django backend, where I have installed a working Rest framework (Accessible through Postman). The backend server is http://127.0.0.1:8000。因为服务器不同,我安装了 django-cors-headers 包并配置了 settings.py 文件以包含此包,还包含中间件,如文档中所示。
这是来自 Vue 的 axios 请求:
let url = "http://localhost:8000/leadmanager/api/lead/";
axios.get(url)
.then(res => console.log(res.data))
.catch(error => console.log(error));
最初我得到这个错误:
Access to XMLHttpRequest at 'http://localhost:8000/leadmanager/api/lead/' from origin 'http://test.net' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
所以我检查了文档并安装了 django-cors-headers 并将 Laravel 网站的 url 包含在 CORS_ORIGIN_WHITELIST 中。
CORS_ORIGIN_WHITELIST = [
"http://test.net"
]
这样做之后,我得到了一个不同的错误。我怀疑这是因为 Laravel 默认情况下将 x-csrf-token headers 附加到正在发送的数据包。
Access to XMLHttpRequest at 'http://localhost:8000/leadmanager/api/lead/' from origin 'http://test.net' has been blocked by CORS policy: Request header field x-csrf-token is not allowed by Access-Control-Allow-Headers in preflight response.
为了允许带有 x-csrf-token 的请求,我在 settings.py 中为 django-cors-headers 尝试了以下设置:
CORS_ALLOW_HEADERS = [
'x-csrftoken'
]
CSRF_TRUSTED_ORIGINS = [
'http://test.net'
]
那么我如何配置 Django 的后端以允许来自 Laravel 的请求附加 x-csrf-headers?我想执行此操作而不必修改 Laravel 的设置以不附加这些 headers,因为它们是 Laravel 为减轻 CSRF 攻击而实施的安全功能。
参考@bak2trak 指出的 https://whosebug.com/a/32501365/10888237 后,我检查了 Laravel 应用程序从 [=26] 发出的请求 headers =] 开发者控制台(网络选项卡),请求 header 是 "x-csrf-token and x-requested-with"。所以我修改了 CORS_ALLOW_HEADERS
以添加 "x-requested-with" header.
CORS_ALLOW_HEADERS = [
'x-csrf-token',
'x-requested-with'
]
它给出了一个不同的错误,401 [未授权],所以我删除了 REST_FRAMEWORK.
的默认身份验证 类
现在请求终于可以通过了,我从 Django 后端得到了对 Laravel 的 GET 请求的适当响应。
我有 Laravel 框架,前端是 VueJS。这个前端托管在 xampp 的本地服务器上,端口 80,443 配置了 url "http://test.net". I send API requests from VueJS app using axios to a Django backend, where I have installed a working Rest framework (Accessible through Postman). The backend server is http://127.0.0.1:8000。因为服务器不同,我安装了 django-cors-headers 包并配置了 settings.py 文件以包含此包,还包含中间件,如文档中所示。
这是来自 Vue 的 axios 请求:
let url = "http://localhost:8000/leadmanager/api/lead/";
axios.get(url)
.then(res => console.log(res.data))
.catch(error => console.log(error));
最初我得到这个错误:
Access to XMLHttpRequest at 'http://localhost:8000/leadmanager/api/lead/' from origin 'http://test.net' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
所以我检查了文档并安装了 django-cors-headers 并将 Laravel 网站的 url 包含在 CORS_ORIGIN_WHITELIST 中。
CORS_ORIGIN_WHITELIST = [
"http://test.net"
]
这样做之后,我得到了一个不同的错误。我怀疑这是因为 Laravel 默认情况下将 x-csrf-token headers 附加到正在发送的数据包。
Access to XMLHttpRequest at 'http://localhost:8000/leadmanager/api/lead/' from origin 'http://test.net' has been blocked by CORS policy: Request header field x-csrf-token is not allowed by Access-Control-Allow-Headers in preflight response.
为了允许带有 x-csrf-token 的请求,我在 settings.py 中为 django-cors-headers 尝试了以下设置:
CORS_ALLOW_HEADERS = [
'x-csrftoken'
]
CSRF_TRUSTED_ORIGINS = [
'http://test.net'
]
那么我如何配置 Django 的后端以允许来自 Laravel 的请求附加 x-csrf-headers?我想执行此操作而不必修改 Laravel 的设置以不附加这些 headers,因为它们是 Laravel 为减轻 CSRF 攻击而实施的安全功能。
参考@bak2trak 指出的 https://whosebug.com/a/32501365/10888237 后,我检查了 Laravel 应用程序从 [=26] 发出的请求 headers =] 开发者控制台(网络选项卡),请求 header 是 "x-csrf-token and x-requested-with"。所以我修改了 CORS_ALLOW_HEADERS
以添加 "x-requested-with" header.
CORS_ALLOW_HEADERS = [
'x-csrf-token',
'x-requested-with'
]
它给出了一个不同的错误,401 [未授权],所以我删除了 REST_FRAMEWORK.
的默认身份验证 类现在请求终于可以通过了,我从 Django 后端得到了对 Laravel 的 GET 请求的适当响应。