2017-10-16 35 views
1

我正在构建移动客户端应用程序,以便轻松管理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(我认为是不可能的因为是预检的请求)。

谢谢!

+0

你不能改变后端接受'OPTIONS'请求吗? 'CORS'请求并不是一件有意义的事情,而是一种浏览器。这是CORS标准强制浏览器行为的方式。 –

+0

因此,我应该删除添加到.htaccess中的自定义头文件吗? –

+0

如果您通过在浏览器中运行的前端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

回答

1

我不知道原因,但我认为你应该在真实的设备上尝试它。

+0

ente siapa ya ..? –

+0

ntar报告ke主持人loh .. –

+1

感谢您的解决方案解决了我的问题:D我不知道为什么,但部署到真正的设备做了伎俩....! –

0

您可以在两者之间添加自己的服务器(如代理服务器)(当HTML内容从相同的URL +端口加载时,不需要CORS)
或者您可以使用JSONP,但它非常有限。

否则,您需要将服务器配置为支持OPTIONSOPTIONS请求是一个预检请求,如果它没有从OPTIONS请求获得预期响应,浏览器将不会发出POST请求。

+0

我尝试使用Chrome扩展来做到这一点,但没有解决问题,,, –

+0

我还没有尝试铬扩展我自己还没有解决CORS问题,但我听说它的工作原理。不知道为什么它不适合你。 –

0

可能下面的例子可以让你得到你想要的东西。

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); 
       } 
      ); 
     }); 

     } 
相关问题