具有凭据的跨域jQuery ajax调用

17

我按照以下步骤操作:

  1. 让服务器允许跨域调用(带有所有标题和其他内容)这个可以工作
  2. 使用一些跨域调用测试服务器这个可以工作
  3. 强制服务器使用证书这个可以工作
  4. 使用浏览器访问服务器上的文件,选择正确的证书并查看文件仍然可以工作
    现在进入好的部分
  5. 将跨域调用与证书组合<-- 这个不起作用

问题

我从浏览器获取了证书请求,但当我选择与浏览器相同的证书时,调用已经被执行,但我收到了403禁止访问的错误。

代码

$.ajax({
     type: "POST",
     xhrFields: {withCredentials: true},
     dataType: "xml",
     contentType: "text/xml; charset=\"utf-8\"",
     url: "https://www.myOtherServer.com/testfile.asp",
});

有什么想法吗?

编辑

Access-Control-Allow-Credentials: trueAccess-Control-Allow-Origin已经正确配置。

额外信息

我开始觉得这可能与内容类型有关。当我将其更改为"text/html"时,我会收到一个415错误,但我确实需要发送XML,因为它是一个SOAP服务器。

响应头

Access-Control-Allow-Cred...    true
Access-Control-Allow-Head...    Content-Type, Origin, Man, Messagetype, Soapaction, X-Test-Header
Access-Control-Allow-Meth...    GET,POST,HEAD,DELETE,PUT,OPTIONS
Access-Control-Allow-Orig...    https://www.mywebsite.com
Access-Control-Max-Age  1800
Cache-Control   private
Content-Length  5561
Content-Type    text/html; charset=utf-8
Date    Wed, 19 Dec 2012 15:06:46 GMT
Server  Microsoft-IIS/7.5
X-Powered-By    ASP.NET

请求头

Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language nl,en-us;q=0.7,en;q=0.3
Access-Control-Request-He...    content-type
Access-Control-Request-Me...    POST
Cache-Control   no-cache
Connection  keep-alive
Host    myhoast.com
Origin  https://www.mywebsite.com
Pragma  no-cache
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0
2个回答

10
我猜测问题不在于您的JavaScript,而是与CORS配置有关。您是否使用Access-Control-Allow-Credentials: true头设置服务器?请参考http://www.w3.org/TR/cors/#access-control-allow-credentials-response-header。此外,请注意,即使设置了允许凭证标头,根据这些文档,如果Access-Control-Allow-Origin为*,则浏览器也不会允许对携带凭证的请求进行响应:https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control#Requests_with_credentials
编辑:由于OP已正确设置了CORS标头,因此问题似乎在于服务器拒绝带有403状态代码的OPTIONS请求。 OPTIONS请求(称为“预检请求”)在某些跨域请求(例如POSTs with application/xml content types)之前发送,以允许服务器通知浏览器允许哪些类型的请求。由于浏览器没有看到它预期从OPTIONS请求中获得的200响应,因此它不会触发实际的POST请求。

嗯。你能发布一下你在请求和响应中看到的实际头部吗?(你可以在Chrome开发者工具中看到这些。)你应该会看到一个带有响应的OPTIONS请求,其中包含Access-Control-Allow-Origin: http://yourdomain.comAccess-Control-Allow-Methods: POST, OPTIONSAccess-Control-Allow-Credentials: true。当你改变内容类型时,它变成了一个简单的(非预检)请求,所以服务器可能没有正确地响应OPTIONS请求? - Emily
我已经在我的问题中添加了请求和响应头,我目前正在研究OPTIONS请求,感谢你指导我走向这个方向。 - Rick Hoving
403是对OPTIONS请求的响应,还是对实际的POST请求的响应? - Emily
顺便说一下,能够看到完整的交互过程将会非常有帮助,例如像这个链接 http://goo.gl/L8cVE 中提到的“让我们来看一下客户端和服务器之间的完整交互流程”,同时也请告知你使用的服务器栈和浏览器。我很难全面了解发生了什么情况。 - Emily
2
未来的读者请注意:原帖没有指定使用了什么类型的服务器后端,但是多个来源表明Tomcat具有默认的OPTIONS处理程序,如果您不手动覆盖它,则会返回403。请注意! - Coderer
显示剩余5条评论

1
基本上我们只需要在htaccess中编写。
Header set Access-Control-Allow-Origin “*”

但是当我们需要cookie等内容时,我们必须在ajax代码和htaccess中添加脚本。
我在我的博客上写了关于跨域XHR的文章,blog.imammubin.com/cross-domain-xhr/2014/05/28/编辑:该网站已不存在)。
希望这可以帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接