如何在端点不接受OPTIONS方法时解决CORS问题?
我正在构建移动客户端应用程序,以便轻松管理Magento电子商务商店,我使用基于令牌的身份验证here,我将ionic2用于我的移动框架。如何在端点不接受OPTIONS方法时解决CORS问题?
我的问题是,该角度HTTP发送OPTIONS
请求,而不是向POST
端点/V1/integration/admin/token
产生400 bad request
因为端点不支持OPTIONS
方法。
这里我的代码:
import { Injectable } from '@angular/core';
import { Http, Headers, RequestOptions } from '@angular/http';
import 'rxjs/add/operator/map';
import { BaseConfig } from '../../config';
@Injectable()
export class AuthProvider {
public data: any;
public option: any;
constructor(public http: Http) {
console.log('Hello AuthProvider Provider');
}
login(creds: any) {
let headers = new Headers({
'Content-Type': 'application/json'
});
let option = new RequestOptions({
headers: headers,
});
return new Promise((resolve) => {
this.data = this.http.post(BaseConfig.base_url + 'integration/admin/token', creds, option)
.map(res => res.json())
.subscribe((data) => {
resolve(this.data);
},
(error) => {
resolve(this.data);
}
);
});
}
}
我也包括我的.htaccess中的CORS头
Header add Access-Control-Allow-Origin: "*"
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
Header add Access-Control-Allow-Headers: "Content-Type"
所以真正的问题是如何防止OPTIONS
方法要求的角度HTTP(我认为是不可能的因为是预检的请求)。
谢谢!
我不知道原因,但我认为你应该在真实的设备上尝试它。
ente siapa ya ..? –
ntar报告ke主持人loh .. –
感谢您的解决方案解决了我的问题:D我不知道为什么,但部署到真正的设备做了伎俩....! –
您可以在两者之间添加自己的服务器(如代理服务器)(当HTML内容从相同的URL +端口加载时,不需要CORS)
或者您可以使用JSONP,但它非常有限。
否则,您需要将服务器配置为支持OPTIONS
。 OPTIONS
请求是一个预检请求,如果它没有从OPTIONS
请求获得预期响应,浏览器将不会发出POST
请求。
我尝试使用Chrome扩展来做到这一点,但没有解决问题,,, –
我还没有尝试铬扩展我自己还没有解决CORS问题,但我听说它的工作原理。不知道为什么它不适合你。 –
可能下面的例子可以让你得到你想要的东西。
login(creds: any) {
let headers = new Headers({
'Content-Type': 'application/json',
});
let option = new RequestOptions({
headers: headers,
withCredentials:true
});
return new Promise((resolve) => {
this.data = this.http.post(BaseConfig.base_url + 'integration/admin/token', creds, option)
.map(res => res.json())
.subscribe((data) => {
resolve(this.data);
},
(error) => {
resolve(this.data);
}
);
});
}
你不能改变后端接受'OPTIONS'请求吗? 'CORS'请求并不是一件有意义的事情,而是一种浏览器。这是CORS标准强制浏览器行为的方式。 –
因此,我应该删除添加到.htaccess中的自定义头文件吗? –
如果您通过在浏览器中运行的前端JavaScript直接向该端点发出请求,那么在此情况下无法避免预检 - 只要端点要求POST的Content-Type为“Content类型:application/json“或”Content-Type:application/xml“,它根据http://devdocs.magento.com/guides/v2.0/get-started/authentication/gs-authentication-token html的。您唯一的选择是在您的前端JavaScript调用和服务器之间放置一些代理,或者只在后端代码中执行。 – sideshowbarker