2017-06-03 79 views
1

根据文档https://developer.mozilla.org/en/docs/Web/HTTP/Access_control_CORS),对于简单请求不应发生预检。角度CORS简单请求在POST中使用授权标题触发预检

这的确是这样的,如果我不把在请求中附加的“授权”标头:

"Content-Type": "application/x-www-form-urlencoded", 
"Authorization": "Basic _base64_string_" 

没有“授权”标头:

:authority:www.target.com 
:method:POST //<----------------This is correct 
:path:/oauth2/access_token?client_id=xxx-xxx 
:scheme:https 
accept:application/json, text/plain, */* 
accept-encoding:gzip, deflate, br 
accept-language:en-US,en;q=0.8,fr;q=0.6 
content-length:79 
content-type:application/x-www-form-urlencoded//<----------------This is correct 
origin:http://source.com:4200 
referer:http://source.com:4200/ 

随着“授权”头,OPTIONS方法自动设置:

:authority:www.target.com 
:method:OPTIONS //<----------------This is NOT correct, caused by Authorization header 
:path:/oauth2/access_token?client_id=xxx-xxx 
:scheme:https 
accept:*/* 
accept-encoding:gzip, deflate, sdch, br 
accept-language:en-US,en;q=0.8,fr;q=0.6 
access-control-request-headers:authorization 
access-control-request-method:POST 
origin:http://source.com:4200 
referer:http://source.com:4200/ 

由于这个问题,我无法au使我的应用程序,服务器响应是:

HTTP method 'OPTIONS' is not allowed. Expected 'POST' 

所以看起来“授权”标题触发在CORS预检。 任何人都可以对此有所了解吗?

回答

0

因为这个问题,我无法让我的应用程序,服务器的响应是:

HTTP method 'OPTIONS' is not allowed. Expected 'POST' 

如果请求被发送到服务器的管理员权限,那么你需要配置该服务器以允许HTTP OPTIONS请求,并使用Access-Control-Allow-HeadersAccess-Control-Allow-Methods响应标头来响应这些请求,浏览器需要查看这些标头才能允许实际的GETPOST或您尝试制作的任何内容(除了Access-Control-Allow-Origin响应标题浏览器需要查看实际的请求)。

如果您没有该服务器的管理员访问权限来配置它将该启用CORS的响应发送到OPTIONS请求,那么您从前端JavaScript代码获取请求的唯一选项就是设置CORS代理并通过该请求发出请求。 "No 'Access-Control-Allow-Origin' header is present on the requested resource"的答案有详细的说明。

除此之外,您唯一的其他选择是不从前端JavaScript代码发出请求,而是从您自己的后端代码中取而代之,避开浏览器施加的跨源限制)。

所以看起来“授权”标题触发CORS的预检。任何人都可以对此有所了解吗?

是的,当你添加Authorization标题,这使得它不再是一个“简单的请求”。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests解释了这一点;它说的触发浏览器做一个预检的条件之一是:

如果,除了由用户代理自动设置的标头(为 例如,ConnectionUser-Agent,或any of the other header with a name defined in the Fetch spec as a “forbidden header name”) 的请求包括比其他those which the Fetch spec defines as being a “CORS-safelisted request-header”任何头,其 如下:

Accept 
Accept-Language 
Content-Language 
Content-Type 
DPR 
Downlink 
Save-Data 
Viewport-Width 
Width 

Authorization不在该列表中,所以它触发一个预检。

+0

我期望以某种方式能够避免仅使用后端服务器或代理服务器的初始请求。所有后续请求都会通过,只有这一个导致问题(不,我没有访问服务器,它只是一个API访问)。不管怎样,谢谢你 ! –

相关问题