我试图通过连接到Flask内置的RESTful API来使用JavaScript进行授权.但是,当我发出请求时,我收到以下错误:
XMLHttpRequest无法加载http:// myApiUrl/login.请求的资源上不存在"Access-Control-Allow-Origin"标头.因此不允许原点'null'访问.
我知道API或远程资源必须设置标题,但为什么在我通过Chrome扩展程序Postman发出请求时它可以正常工作?
这是请求代码:
$.ajax({
type: "POST",
dataType: 'text',
url: api,
username: 'user',
password: 'pass',
crossDomain : true,
xhrFields: {
withCredentials: true
}
})
.done(function( data ) {
console.log("done");
})
.fail( function(xhr, textStatus, errorThrown) {
alert(xhr.responseText);
alert(textStatus);
});
Run Code Online (Sandbox Code Playgroud) 有没有办法允许多个跨域使用Access-Control-Allow-Origin标头?
我知道了*,但它太开放了.我真的想只允许一些域名.
举个例子,像这样:
Access-Control-Allow-Origin: http://domain1.example, http://domain2.example
Run Code Online (Sandbox Code Playgroud)
我已经尝试过上面的代码,但它似乎不适用于Firefox.
是否可以指定多个域,或者我只坚持一个?
在原产地规范指示Origin头可以被设置为"空".这通常在请求来自用户计算机上的文件而不是来自托管网页时完成.该规范还声明,如果请求来自"隐私敏感"上下文,则Origin可以为null.
我的问题:什么是"隐私敏感"环境,是否有任何浏览器表现出这种行为?
以下是Origin规范的全部措辞:
每当用户代理从"隐私敏感"上下文发出HTTP请求时,用户代理必须在Origin头字段中发送值"null".
注意:本文档未定义隐私敏感上下文的概念.生成HTTP请求的应用程序可以将上下文指定为对隐私敏感,以对用户代理如何生成Origin头字段施加限制.
我正在探索HTTP Origin检查作为Drupal的CSRF保护的想法,网址为https://www.drupal.org/node/1803712
现在我正在测试Origin标头如何通过POST请求到达,但Firefox不会在用户登录表单提交上发送Origin标头.Chromium和Chrome工作正常,他们发送Origin标头.
Firefox版本是36.0.1.我还测试了一个干净的Firefox安装,因为我想我的某些浏览器插件可能会抑制Origin标头,但没有运气 - 也没有Origin标头.
是否有文档页面描述Firefox何时发送Origin标头,何时不?
我fetch在React中使用API,我从JSON端点下载了一些数据.
作为我的请求的一部分,我想发送一个自定义User-Agent字符串.目前,当我检查我的请求时,UA字符串是:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Run Code Online (Sandbox Code Playgroud)
由于我在每个请求的标题中都有用,我想我只是附加User-Agent到header对象,就像它在网上各个 地方所说:
fetch(url, {
Accept: 'application/json',
'Content-Type': 'application/json',
'User-Agent': 'MY-UA-STRING' // <---
})
Run Code Online (Sandbox Code Playgroud)
但这不起作用.我有一种感觉,这是因为fetch api中存在一个错误,正如此处以及此处和此处所报告的那样.
任何人都有关于如何通过UA作为headers使用的一部分的工作fetch?
我知道有很多类似的问题,唯一的区别是我从 **同一 ** 域提供的两个页面都得到了这个问题。这可以在下面的示例中看到。
Uncaught DOMException: Blocked a frame with origin "https://content.samba.net" from accessing a cross-origin frame.
at findAPI (https://content.samba.net/00/07/19-10/scorm_support/scorm_support.js:14:10)
at getAPI (https://content.samba.net/00/07/19-10/scorm_support/scorm_support.js:61:13)
at https://content.samba.net/00/07/19-10/SCORM.htm:200:16
Run Code Online (Sandbox Code Playgroud)
这种情况不应该只发生在不同域之间吗?
================================编辑=================== ====================
当然,在我发布几秒钟后,我发现了这个问题。SCORM 包具有定位 SCORM API 的功能。它看起来像顶部和开启器。就我而言,开窗器位于不同的域中,它试图访问该域。
为了历史的缘故,我会把它留下来。我的回答有详细信息。
我对它是如何工作有一个大概的了解.如果请求的"origin"标头有效(允许),则返回相同的"ORIGIN"值
但我不知道:
(更多细节,因为"当请求的凭据模式为'include'时,响应中'Access-Control-Allow-Origin'标头的值不能是通配符'*',所以我需要来自的'ORIGIN值'要求重新回复.
如果不允许使用ORIGIN,我应该返回什么?
根本不包括Access-Control-Allow-Origin标头?
或setHeader("Access-Control-Allow-Origin","")或setHeader("Access-Control-Allow-Origin","null")?
public class CORSResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
MultivaluedMap<String, Object> headers = responseContext.getHeaders();
String origin = requestContext.getHeaderString("Origin");
String origin = requestContext.getHeaderString("Origin");
URL originUrl = null;
try {
if (StringUtils.hasText(origin)) {
originUrl = new URL(origin);
Pattern hostAllowedPattern = Pattern.compile("(.+\\.)*mydomain\\.com", Pattern.CASE_INSENSITIVE);
if (hostAllowedPattern.matcher(originUrl.getHost()).matches()) {
headers.add("Access-Control-Allow-Origin", origin);
} else {
headers.add("Access-Control-Allow-Origin", "");
}
headers.add("Vary", "Origin");
}
headers.add("Access-Control-Allow-Credentials", "true");
headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
headers.add("Access-Control-Allow-Headers",
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序(React SPA),它调用应用程序域的不同子域上的一堆服务器,即:
foo.bar.com,api.foo.bar.com并与和交谈media.foo.bar.com。访问 时api.foo.bar.com,我从浏览器(无论是 Edge、Chrome 还是 Firefox)收到错误消息,告诉我 origin ( foo.bar.com) 与响应标头的值不同Access-Control-Allow-Origin。然而,通过检查响应,它们是相同的:
(不幸的是,我不得不混淆地址。)
这些应用程序托管在 Kubernetes 上;入口是 NGINX,并且它不提供 CORS(启用 cors 的注释为 false)。这两个应用程序 (api和media) 都是 Express 应用程序,并且都具有允许特定来源的相同 CORS 配置。
我想知道这是否与重定向有关 - 对media...端点的调用返回一个重定向(302),其位置是一个api...地址。
除此之外,我不知道可能出了什么问题。有些事情是肯定的,因为所有浏览器都同意我的请求应该被阻止(由于来源)。
在所有情况下,我都会多次检查地址是否有拼写错误、结尾的正斜杠等。我使用OPTIONScURL 和 Postman 调用这些端点,使用所有标头或仅使用其中几个标头。他们总是回答正确的地址。
根据要求提供额外信息:
OPTIONS /media/1.0.0/rtsp/hls?feedUrl=https%3A%2F%2Flive.monuv.com.br%2Fa1%2F14298.stream%2Fstr27%2Fchunklist.m3u8%3Fm_hash%3DkhV_hCnKG3nhaNCFaYZxBnoMz-99idQVHiQh80ADW78%253D HTTP/2
Host: media.aiXXXXXXXXXXXXXX.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个 Web Worker 来存储访问令牌并处理 API 调用。我想做的第一件事是从 Web Worker 发出获取请求以获取访问令牌。
用户使用cookies;httpOnly 和 SameSite 已启用,但尚未安全,因为我在 http 上本地运行它。该 cookie 是存储令牌或令牌身份的位置。
我的 api 中有一个端点,我想通过地址来获取访问令牌。然后我可以用它来处理所需的资源。令牌保留在 Web Worker 中并且不会暴露。
我有一个来自该 Web Worker 的 Web Worker(采用 Base64 字符串),我想到达端点以获取访问令牌。我用 fetch 来做到这一点。但是,当我想发送凭据时。CORS 不能设置为“*”。我可以将我的网站的 url(在本例中为 localhost)指定为服务器中的源。
在我的网络工作者中:
const tryFetch = await fetch(authUrl, {
credentials: "include",
});
Run Code Online (Sandbox Code Playgroud)
然而,传递给服务器的源似乎是“null”。有没有办法解决这个问题或者我正在尝试错误的东西?
Access to fetch at 'http://localhost:3000/api/auth' from origin 'null' has been blocked by CORS policy: The 'Access-Control-Allow-Origin' header has a value 'http://localhost:3000' that is not equal to the supplied origin. Have the server send …Run Code Online (Sandbox Code Playgroud)