AWS Api Gateway 未在 204 上设置 CORS

Posted

技术标签:

【中文标题】AWS Api Gateway 未在 204 上设置 CORS【英文标题】:AWS Api Gateway not setting CORS on 204 【发布时间】:2019-09-24 00:14:28 【问题描述】:

我已经用 Angular 构建了一个前端应用程序,它使用 AWS ECS 上托管的 API 后端,由 AWS Api Gateway 提供。

所以,这是我的设置:

/user/userId/account/accountId/dashboard/proxy+ 是 API Gateway 上的端点

它为 OPTIONS 方法使用 AWS Lambda 代理集成,该方法目前仅检查是否允许源继续进行

GET 方法改为在 方法请求 部分中使用自定义 AWS Lambda 授权方,然后继续使用到 ECS 的 VPC 链接进入 集成请求 部分微服务,最后回到方法响应部分。

目前可能的 HTTP 状态代码是:200, 204, 401, 500, 504,并且这里只设置了204 and 504(因为我不知道它是否有作用)

这是 Node.js Lambda 授权方相关代码:

const UNAUTHORIZED_STRING = "Unauthorized";
exports.handler = (event, context, callback) => 

    /* Preliminar checks here */

    const keyRequiresAuth = xApiKeyRequiresAuth(xApiKey);
    if (keyRequiresAuth) 
        // try validating using cookie
        // uses generatePolicy at the end
        userAuthentication(cookieValue, event, callback);
     else 
        // Validate using x-api-key
        const generatedPolicy = generatePolicy(xApiKey, 'Allow', event.methodArn);
        callback(null, generatedPolicy);
    
;

const generatePolicy = (principalId, policyEffect, resource) => 
    const authResponse = 
        principalId: principalId
    ;
    if (policyEffect && resource) 
        authResponse.policyDocument = 
            Version: '2012-10-17',
            Statement: [
                Action: 'execute-api:Invoke',
                Effect: policyEffect,
                Resource: resource
            ]
        ;
    
    return authResponse;
;

假设微服务根本没有设置任何标头,问题是,虽然我通过将 401504 状态代码设置为默认网关响应来实现它,但我如何设法使用 @ 返回 CORS 987654329@?

恕我直言,我认为 API Gateway 具有最复杂的系统来设置错误响应,但除此之外,我设法让它返回 CORS 并返回 401 Unauthorized 错误

更新

我也使用了 http 状态 500,但是通过设置默认网关响应

【问题讨论】:

【参考方案1】:

所以,经过两天的测试,我想出了一个解决方案。我的意思是,我可能误解了 AWS API Gateway 中的某些内容,但我看到我的端点实际上是在引用指向我的 ECS 微服务的 VPC 链接。

我唯一要做的就是使用 CORS 响应标头更新该微服务, 解决了这个问题

【讨论】:

【参考方案2】:

如果您使用代理集成,在 API Gateway 中设置 CORS 是不够的。来自 Lambda 的响应必须包含标头。

要为 Lambda 代理集成启用 CORS,您必须将 Access-Control-Allow-Origin:domain-name 添加到输出标头。 domain-name 可以是 * 表示任何域名。

来源:Set up Lambda proxy integrations

【讨论】:

以上是关于AWS Api Gateway 未在 204 上设置 CORS的主要内容,如果未能解决你的问题,请参考以下文章

如果在 Terraform 模块中创建了 aws_api_gateway_integration,如何在 aws_api_gateway_deployment 资源上填充depends_on?

从AWS API-Gateway中找出lambda名称

响应未定义 - aws-api-gateway-client

AWS API Gateway:用户匿名无权执行 API

AWS API Gateway 默认响应和触发 AWS Lambda

是否可以使用 AWS API 为 Lambda 函数设置 AWS API Gateway 端点?