当端点不接受 OPTIONS 方法时如何解决 CORS 问题?

How to solve the CORS issue when the endpoint doesn't accept OPTIONS method?

我正在构建移动客户端应用程序以轻松管理 Magento E-commerce 商店,我正在使用基于令牌的身份验证 here,我正在为我的移动框架使用 ionic2。

我的问题是,angular HTTP 被发送 OPTIONS 请求而不是 POST 到产生 400 bad request/V1/integration/admin/token 端点,因为端点不不支持 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
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"

所以真正的问题是如何防止 angular 使用 OPTIONS 方法请求的 http(我认为不可能,因为是预检请求)。

谢谢!

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

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

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

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

      } 

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