2015-11-03 73 views
4

我读过很多关于预检和CORS的答案,所以请不要发布引用我应该阅读的链接。许多答案都是从服务器角度来看的,但在这种情况下我是客户。我是否设置了原始标题?我的假设是,这是一个简单的要求,对吗?如何将基本身份验证标头分配给XMLHTTPREQUEST?

req.open("POST", url, true); 
req.setRequestHeader('Content-Type', 'application/blahblah'); 
req.setRequestHeader('Accept', 'application/blahblah'); 
req.setRequestHeader("Authorization", "Basic " + btoa(user + ":" + pass)); 
req.send(); 

但它仍然没有工作,我的错误:

Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 500.

回答

4

解决方案:

req.setRequestHeader('Authorization', 'Basic [base64 encoded password here]'); 
7

如果你想设置授权头

req.setRequestHeader('Authorization','Basic ' + Base64StringOfUserColonPassword); 
+0

req.setRequestHeader(“Authorization”,“Basic”+ Base64.encode(user +“:”+ pass))??这个功能来自哪里?一个外部库? – carrots

+0

其实对不起,我添加了这个:'req.setRequestHeader(“Authorization”,“Basic”+ btoa(user +“:”+ pass));'它仍然不起作用 – carrots

+1

window.btoa,而不仅仅是btoa –

2

如果使用此对于API请求,添加Authoriza首部将首先使XMLHttpRequest发送OPTIONS请求,这可能会被某些API拒绝。

要解决这个问题,你也可以这样做:

var invocation = new XMLHttpRequest(); 
invocation.open("GET", url, true, username, password); 
invocation.withCredentials = true; 

这将增加Authorization头,也避免了预检要求。

4

这篇文章已经很老了,但回答了其他任何碰到它的人。

您的授权标题没有任何问题。您面临的问题与CORS有关。

您不要自己设置Origin标头。浏览器为你做。如果你的起源为空,那么我怀疑这是因为你正在运行你的代码file:///而不是http://

+0

想我可能有这个问题。你有什么解决办法? – Foxhound