代码之家  ›  专栏  ›  技术社区  ›  Alex

为什么我的Drupal 8 CORS设置不起作用?

  •  3
  • Alex  · 技术社区  · 8 年前

    services.yml (和 default.services.yml )我有以下设置:

    cors.config:
        enabled: true
        # Specify allowed headers, like 'x-allowed-header'.
        allowedHeaders: ['x-csrf-token','authorization','content-type','accept','origin','x-requested-with']
        # Specify allowed request methods, specify ['*'] to allow all possible ones.
        allowedMethods: ['*']
        # Configure requests allowed from specific origins.
        allowedOrigins: ['*']
        # Sets the Access-Control-Expose-Headers header.
        exposedHeaders: false
        # Sets the Access-Control-Max-Age header.
        maxAge: 1000
        # Sets the Access-Control-Allow-Credentials header.
        supportsCredentials: true
    

    我的域名 a.com

    在域上 b.com 我尝试从域加载一些API a、 com

    $.ajaxSetup({
      xhrField: {
        withCredentials : true
      },
      beforeSend: function (xhr) {
        xhr.setRequestHeader('Authorization', 'Basic Z2VuaXVzOmNvYXRpbmdz');
      }
    });
    
    request = $.ajax({
      url: apiBaseUrl + 'api/foobar',
      dataType: 'json',
      type: 'get',
      password: 'foo',
      username: 'bar'
    });
    

    Access-Control-Request-Method: GET
    Access-Control-Request-Headers: authorization
    

    响应是401“需要授权”,它表示请求方法是OPTIONS(?)。

    这里怎么了?

    在中执行相同的请求 insomnia

    2 回复  |  直到 8 年前
        1
  •  2
  •   sideshowbarker Miguel Tomás    8 年前

    响应是401“需要授权”,它表示请求方法是OPTIONS(?)。

    OPTIONS 请求。

    401响应表示服务器需要授权 请求,但授权失败,因为请求不包含所需的凭据。

    原因是 选项

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests 选项 Authorization

    1. 批准 标题。
    2. 标题要求我做CORS飞行前准备 选项 批准 标题。
    3. 选项 对服务器的请求 批准 选项
    4. 您的服务器看到 选项 请求,而不是以表明其允许 在请求中,它用401拒绝它,因为它缺少头。
    5. 您的浏览器期望CORS飞行前有200或204个响应,但得到的是401个响应。所以你的浏览器就停在那里,从不尝试 GET

    因此,您需要找出当前服务器端代码的哪一部分导致服务器需要授权 请求,您需要对此进行更改,以便它能够处理 需要未经授权的请求。

    cors.config 问题中显示的应导致服务器响应 选项 Access-Control-Allow-Headers 响应标头,包括 批准 批准 获取

        2
  •  1
  •   Alex    8 年前

    除了工作的CORS配置和htaccess设置外:

    SetEnvIfNoCase Request_Method OPTIONS noauth
    Order Deny,Allow
    Deny from all
    Require valid-user
    Allow from env=noauth
    Satisfy Any
    

    您必须确保ajax设置没有 withCredentials password username

    $.ajaxSetup({
      xhrField: {
        withCredentials : true
      },
      beforeSend: function (xhr) {
        xhr.setRequestHeader('Authorization', 'Basic foobarbarfoo');
      }
    });
    
    request = $.ajax({
      url: isApiActive ? apiBaseUrl + 'api/mydata' : './mydata.json',
      dataType: 'json',
      type: 'get'
    });