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

Tyl*_*ler 67 ajax amazon-web-services cors aws-api-gateway

虽然已经通过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 ,它显示上面的标题已成功通过:

通过标题

并从OPTIONS响应:

响应标头

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

ris*_*res 83

我遇到了同样的问题.我用了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);
};
Run Code Online (Sandbox Code Playgroud)

  • 对于任何好奇的人,这里是提到这一点的官方文档:https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html > 对于 Lambda 或 HTTP 代理集成,您仍然可以设置API Gateway 中必需的 > OPTIONS 响应标头。但是,您必须依赖 > 后端返回 Access-Control-Allow-Origin 标头,因为 > 集成响应对于代理集成已禁用。 (7认同)
  • 这不起作用,再次显示相同的错误 预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 access-control-allow-credentials。 (4认同)
  • 仅设置“Access-Control-Allow-Origin”:来自 lambda 的“*”解决了该问题 (4认同)
  • 仅供参考,此处提供的示例存在问题。如果您有“Access-Control-Allow-Credentials”:true,则不能有 Access-Control-Allow-Origin 的通配符 *。此规则由浏览器强制执行。请参阅[此处](/sf/ask/1382037751/)和[此处](https: //www.moesif.com/blog/technical/cors/Authoritative-Guide-to-CORS-Cross-Origin-Resource-Sharing-for-REST-APIs/) (3认同)

小智 73

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

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

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

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

Access-Control-Allow-Origin: '*'
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意自己 - 不要忘记之后部署API :) (7认同)
  • 我爱你.两天来一直认真研究这个问题. (4认同)
  • 对于那些希望通过AWS CLI执行此操作的人,请使用:`aws apigateway update-gateway-response --rest-api-id“ XXXXXXXXX” --response-type“ DEFAULT_4XX” --patch-operations op =“ add”, path =“ / responseParameters / gatewayresponse.header.Access-Control-Allow-Origin”,value ='“'”“ **”“”“ (3认同)
  • 将 CORS 标头添加到 4XX 可以让您看到实际的错误消息而不是 CORS 错误。 (3认同)
  • 我没有使用自定义授权者,但仍然需要这个,因为我的请求中包含错误的 JSON - 谢谢! (2认同)
  • 奇怪,这对我有用,但是我不必重新部署。我确实曾尝试过重新部署。不知道为什么对我有用。 (2认同)
  • 仅供参考,从 AWS 控制台执行此操作的方法是单击方法(即“POST”,然后“启用 CORS”,然后选中 4XX 选项,然后部署。 (2认同)

las*_*ase 28

如果您已经尝试了有关此问题的所有方法,但都无济于事,那么您最终会得到我所做的。事实证明,亚马逊现有的 CORS 设置指导工作得很好……只要确保你记得重新部署!CORS 编辑向导,即使有所有漂亮的小绿色复选标记,也不会对您的 API 进行实时更新。也许很明显,但它难倒了我半天。

在此处输入图片说明

  • 就是这样。确实为此工作了两天。不确定编辑网关后至少不提示重新部署的逻辑。 (2认同)
  • 我在任何地方都找不到这个菜单。我怀疑其中许多解决方案都是针对 REST api,而不是 HTTP api。 (2认同)

Car*_*der 14

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

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'
        }
Run Code Online (Sandbox Code Playgroud)

2和

根据这个文件:

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

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

3)和

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

  • 是的,我想我们很多人最初遗漏的微妙之处在于,一旦使用“使用Lambda代理集成”为Lambda函数配置了API网关集成,那么您就必须照做,并确保其他人正在声明并确保添加了标头以编程方式显示在您的lambda响应中。由API网关上的“启用CORS”创建并创建OPTIONS响应器的自动生成的东西很棒,但是如果您在API的“集成请求”中设置了“使用Lambda代理集成”,则无法一路实现网关。 (2认同)
  • 这对我有用......正确阅读手册后:重要当将上述说明应用于代理集成中的任何方法时,将不会设置任何适用的 CORS 标头。相反,您的后端必须返回适用的 CORS 标头,例如 Access-Control-Allow-Origin。https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html (2认同)

Vis*_*tty 11

我刚刚在我的 lambda 函数响应中添加了标头,它就像一个魅力

exports.handler = async (event) => {
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hey it works'),
        headers:{ 'Access-Control-Allow-Origin' : '*' }
    };
    return response;
};
Run Code Online (Sandbox Code Playgroud)


Man*_*nyC 10

让我的示例工作:我刚刚在生成的nodejs Lambda函数中插入了"Access-Control-Allow-Origin":'*',header:{}内.我没有对Lambda生成的API层进行任何更改.

这是我的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 ) {
        ...
    }
};
Run Code Online (Sandbox Code Playgroud)

这是我的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(); }
});
Run Code Online (Sandbox Code Playgroud)

  • 唯一对我有用的东西! (2认同)

dz9*_*902 8

对于 Google 员工:

原因如下:

  • 简单请求,或者,GET/POST没有 cookie 不会触发预检
  • 当您为路径配置 CORS 时,API Gateway 只会OPTIONS为该路径创建一个方法,然后Allow-Origin在用户调用时使用模拟响应发送标头OPTIONS,但GET/POST不会Allow-Origin自动获取
  • 如果您尝试在 CORS 模式下发送简单请求,您将收到错误消息,因为该响应没有Allow-Origin标头
  • 您可以遵循最佳实践,简单的请求并不意味着向用户发送响应,将身份验证/cookie 与您的请求一起发送以使其“不简单”并且预检将触发
  • 尽管如此,您仍必须为以下请求自行发送 CORS 标头 OPTIONS

把它们加起来:

  • OPTIONSAPI Gateway 会自动生成无害的
  • OPTIONS仅被浏览器用作检查路径上 CORS可能性的预防措施
  • 是否接受CORS取决于实际方法,例如GET/POST
  • 您必须在响应中手动发送适当的标头


Jas*_*son 8

对我来说,最终有效的答案是 James Shapiro 的评论来自 Alex R 的答案(第二高投票)。我首先遇到了这个 API 网关问题,尝试获取托管在 S3 中的静态网页以使用 lambda 处理联系我们页面并发送电子邮件。只需检查 [ ] Default 4XX 即可修复错误消息。

在此处输入图片说明


Rav*_*Ram 5

我在里面找到了一个简单的解决方案

API 网关 > 选择您的 API 端点 > 选择方法(在我的情况下是 POST)

现在有一个下拉操作 > 启用 CORS .. 选择它。

现在再次选择下拉 ACTIONS > Deploy API(重新部署它)

在此处输入图片说明

有效 !


归档时间:

查看次数:

54095 次

最近记录:

5 年,9 月 前