gpt4 book ai didi

javascript - 请求在服务器上成功,但在浏览器中导致 CORS 错误

转载 作者:数据小太阳 更新时间:2023-10-29 05:43:57 24 4
gpt4 key购买 nike

我向 Microsoft 登录发出 HTTP POST 请求以获取用于邮件 API 的访问 token ,请求成功但代码转到我的代码的错误子句。

requestAccessToken(code: string)
{
console.log("request access token");
if (code) {
var headers = new Headers();
headers.append("Content-Type", 'application/x-www-form-urlencoded');
headers.append('Accept', 'application/json');
var requestoptions = new RequestOptions({
headers: headers
});
var body = `grant_type=authorization_code&
redirect_uri=http://localhost:4200&
code=`+ code + `&
client_id=4e[................]5ab&
client_secret=CE[..............]BC`;

this.http.post("https://login.microsoftonline.com/common/oauth2/v2.0/token", body, requestoptions).map((res: Response) =>
{
console.log("response given");
const data = res.json();
}).subscribe( (data) => {
console.log("The data is = " + data);
}, error => {
console.log("The error is = " + error)
});
}

浏览器控制台显示:XMLHttpRequest 无法加载 https://login.microsoftonline.com/common/oauth2/v2.0/token .请求的资源上不存在“Access-Control-Allow-Origin” header 。产地' http://localhost:4200 ' 因此不允许访问。zone.js:2019 XHR 加载失败:POST“https://login.microsoftonline.com/common/oauth2/v2.0/token”。outlook.service.ts:96 错误是 = Response with status: 0 for URL: null

这里有一个截图可以更好地展示它 Console error log

现在真正的问题是我的请求成功了,如下所示: Browsers' network tab

响应显示我的访问 token 。那么为什么我不能从代码中获取它呢?为什么它会出现错误子句。

最佳答案

您看到的是向服务器发送跨源请求但未在响应中收到 Access-Control-Allow-Origin 响应 header 时的预期行为。

具体来说,只要您的跨源请求没有导致您的浏览器执行 preflight OPTIONS request 的特征在发出请求之前,请求将在服务器端成功 - 但是,因为服务器对该请求的响应不包含 Access-Control-Allow-Origin 响应 header ,您的浏览器阻止您的前端代码真正看到服务器发送的响应。

但是,如果您打开浏览器开发工具,您仍然可以在那里看到响应。但是仅仅因为浏览器收到了响应并且你可以在 devtools 中看到它,并不意味着浏览器会将响应暴露给你的代码。它只会在具有 Access-Control-Allow-Origin 时公开它。


这一切似乎有悖常理,但如果您还记得浏览器是强制执行跨源限制的唯一点,那么这一切都是有道理的。服务器不会阻止跨源请求。

当您发送该请求的服务器收到请求时,它不会检查来源来决定是否响应。服务器只是接受请求并处理它,然后发送响应。但随后浏览器会阻止您的代码访问该响应。

但同样重要的是要记住,浏览器不会阻止您的代码发送请求跨域。当请求具有触发浏览器执行 preflight 的质量(如特殊 header )时,浏览器只会阻止发送跨域请求。 .

因此,如果您的请求不是触发预检的请求,浏览器会发送它,而服务器会接收并处理它。如果请求方法是 POST 或其他目的是改变服务器状态的方法——在这种情况下你可能不太关心响应是什么——那么请求达到预期的程度服务器端的效果,才算成功。

但考虑一下当您实际上非常关心响应是什么时会发生什么:考虑 GET 请求会发生什么,其中发出请求的全部目的是取回响应。

如上所述,如果请求不是触发预检的请求,则浏览器发送它,服务器接收它,并返回响应。但是,如果响应不包含 Access-Control-Allow-Origin 响应 header ,您的浏览器将不允许您的前端 JavaScript 代码访问它。

很明显,因为发出 GET 请求的全部目的是对响应做一些事情,那么在这种情况下,如果您的代码无法访问响应,那将是一个艰难的、彻底的失败——在与 POST 请求的情况相反,请求主体实际上仍然按预期发布,但您只是没有办法让您的代码检查响应以查看请求是否成功.

关于javascript - 请求在服务器上成功,但在浏览器中导致 CORS 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44196915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com