javascript - CORS 阻止的来源 - 来源和允许的来源相同
问题描述
在 localhost 上使用 dockerized Ory Kratos 和 Angular(通过 nginx 托管的 www 文件夹以便能够修改标头)并尝试执行
const headers = {
Accept: 'application/json',
};
fetch('http://127.0.0.1:4433/self-service/registration/browser', {
method: 'GET',
headers,
redirect: 'follow',
credentials: 'include',
})
.then((r) => console.log(r))
.catch((f) => console.log(f));
导致
访问 'http://127.0.0.1:8100/auth/register?flow=b35c3f9a-5592-4121-80b9-87503c38e1d3' 获取(重定向自 'http://127.0.0.1:4433/self-service/registration /browser') 来自 'http://127.0.0.1:8100' 的来源已被 CORS 策略阻止:'Access-Control-Allow-Origin' 标头的值 'http://127.0.0.1:8100'不等于提供的原点。让服务器发送带有有效值的标头,或者,如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。
http://127.0.0.1:4433/self-service/registration/browser通过 302 HTTP 响应重定向到http://127.0.0.1:8100/custompath/register?flow=[some-flow-id] 。浏览器尝试解析重定向并抛出上述错误。
起源和允许的起源是相同的- 那么这个错误怎么会发生呢?我已经在 stackoverflow 上找到了这个答案:https ://stackoverflow.com/a/62320912/14345380 ,如果这有帮助的话。
Chrome 版本 87.0.4280.88
编辑#1 网络选项卡输出可以在 这里看到
编辑#2 为了能够自己解决问题,我设置了一个小存储库:在这里找到它
编辑 #3 感谢pandamakes的提示。测试 repo 不在 :8100 上运行,而是在 4200 上运行(从 ionic 项目切换到 angular 项目)。
编辑 #4 我在 ory/kratos 项目起源这里开始了另一个讨论。Ory 团队实现了一个 SDK,我们可以使用它来代替普通的 fetch 请求。
解决方案
我……我想我明白了……
302 重定向有效,但是当 fetch 请求跟随重定向时,它现在尝试获取非 cors 资源。在这种情况下,它不会附加Origin
请求标头(因为它是非 CORS 请求)。
当响应到达时,浏览器会将access-control-allow-origin
标头(如果存在)与请求的来源进行比较。如果响应头存在,并且不是*,它必须匹配origin
请求的头。
所以解决你的问题,你需要access-control-allow-origin
在你的 nginx 设置中删除,或者将它设置为*
推荐阅读
- javascript - 如何在类方法中将类属性作为参数传递,然后用 Javascript 控制台记录输出?
- elasticsearch - GeoShapes 字段的 NEST API 默认值
- javascript - 如何正确使用 javascript 显示 Timer?
- python - Python:什么是模拟对象的函数调用?
- ios - UICollectionView 不会立即注册长按
- python - Kivy:不要让 UI 对长任务无响应
- apache-kafka - 如何为 confluent rabbitmq 源连接器设置 cloudkarafka 代理?
- c# - Crystal Report 使用自定义大小时在页眉前打印空白
- html - 如何从 hybris 中的 formElement:formInputBox 中获取值?
- javascript - 在事件冒泡中,如何通过 ID 选择元素?