首页 文章

API网关CORS:否'Access-Control-Allow-Origin'标头

提问于
浏览
39

虽然已经通过API网关设置了CORS并且设置了Access-Control-Allow-Origin标头,但在尝试从Chrome中的AJAX调用API时仍然会收到以下错误:

XMLHttpRequest无法加载http://XXXXX.execute-api.us-west-2.amazonaws.com/beta/YYYYY . 请求的资源上不存在“Access-Control-Allow-Origin”标头 . 因此不允许原点'null'访问 . 响应具有HTTP状态代码403 .

我试图通过Postman获取URL,它显示上面的 Headers 已成功通过:

Passed headers

并从OPTIONS响应:

Response headers

如何在不恢复JSON-P的情况下从浏览器调用我的API?

7 回答

  • 54

    我遇到了同样的问题 . 我用了10个小时才发现 .

    https://serverless.com/framework/docs/providers/aws/events/apigateway/

    // handler.js
    
    'use strict';
    
    module.exports.hello = function(event, context, callback) {
    
    const response = {
      statusCode: 200,
      headers: {
        "Access-Control-Allow-Origin" : "*", // Required for CORS support to work
        "Access-Control-Allow-Credentials" : true // Required for cookies, authorization headers with HTTPS 
      },
      body: JSON.stringify({ "message": "Hello World!" })
    };
    
    callback(null, response);
    };
    
  • 29

    如果还有其他人遇到这种情况 - 我能够在应用程序中找到根本原因 .

    如果您使用自定义授权程序运行API-Gateway,API-Gateway将在实际命中服务器之前发送401或403 . 默认情况下 - 从自定义授权程序返回4xx时,未为CORS配置API网关 .

    此外 - 如果您碰巧从通过API网关的请求获取 01 的状态代码,这可能是您的问题 .

    要修复 - 在API网关配置中 - 转到“网关响应”,展开“默认4XX”并在其中添加CORS配置标头 . 即

    Access-Control-Allow-Origin: '*'
    

    确保重新部署您的网关 - 瞧!

  • 7

    让我的示例工作:我在生成的nodejs Lambda函数中_10242413_ headers:{} 内插入了 'Access-Control-Allow-Origin': '*', . 我对Lambda生成的API层进行了 no 更改 .

    这是我的NodeJS:

    'use strict';
    const doc = require('dynamodb-doc');
    const dynamo = new doc.DynamoDB();
    exports.handler = ( event, context, callback ) => {
        const done = ( err, res ) => callback( null, {
            statusCode: err ? '400' : '200',
            body: err ? err.message : JSON.stringify(res),
            headers:{ 'Access-Control-Allow-Origin' : '*' },
        });
        switch( event.httpMethod ) {
            ...
        }
    };
    

    这是我的AJAX电话

    $.ajax({
        url: 'https://x.execute-api.x-x-x.amazonaws.com/prod/fnXx?TableName=x',
        type: 'GET',
        beforeSend: function(){ $( '#loader' ).show();},
        success: function( res ) { alert( JSON.stringify(res) ); },
        error:function(e){ alert('Lambda returned error\n\n' + e.responseText); },
        complete:function(){ $('#loader').hide(); }
    });
    
  • 0

    1) 我需要和@riseres一样做以及其他一些更改 . 这是我的回复 Headers :

    headers: {
                'Access-Control-Allow-Origin' : '*',
                'Access-Control-Allow-Headers':'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token',
                'Access-Control-Allow-Credentials' : true,
                'Content-Type': 'application/json'
            }
    

    2) And

    根据这个文件:

    http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html

    在API网关配置上使用代理进行lambda函数时,post或get方法没有添加 Headers ,只有选项可以 . 您必须在响应(服务器或lambda响应)中手动执行此操作 .

    3) And

    除此之外,我需要在API网关post方法中禁用“API Key Required”选项 .

  • 0

    在我意识到lambda授权人失败并因某些未知原因被转换为CORS错误后,我得到了我的工作 . 对我的授权人(以及我应该首先添加的一些授权人测试)的简单修复,并且它有效 . 对我来说,需要API网关操作“启用CORS” . 这添加了我在API中所需的所有 Headers 和其他设置 .

  • 0

    如果您已经尝试了有关此问题的所有内容无济于事,那么您现在的CORS设置说明工作正常......请确保您 remember to redeploy ! CORS编辑向导,即使有所有漂亮的小绿色复选标记,也不会对您的API进行实时更新 . 也许显而易见,但它让我困扰了半天 .

    enter image description here

  • 3

    我正在运行 aws-serverless-express ,在我的情况下需要编辑 simple-proxy-api.yaml .

    在将CORS配置为 https://example.com 之前,我只是交换了我的站点名称并通过 npm run setup 重新部署,并更新了我现有的lambda / stack .

    #...
    /:
    #...
    method.response.header.Access-Control-Allow-Origin: "'https://example.com'"
    #...
    /{proxy+}:
    method.response.header.Access-Control-Allow-Origin: "'https://example.com'"
    #...
    

相关问题