2017-10-16 66 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); 
       } 
      ); 
     }); 

     } 
相關問題