首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用AWS SAM启用CORS

如何使用AWS SAM启用CORS
EN

Stack Overflow用户
提问于 2021-04-12 20:16:08
回答 5查看 7.8K关注 0票数 7

我试图在我的AWS SAM应用程序中启用CORS。这是我的template.yaml的片段

代码语言:javascript
运行
复制
Globals:
  Api:
    Cors:
      AllowMethods: "'*'"
      AllowHeaders: "'*'"
      AllowOrigin: "'*'"

Resources:
  MyApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: prod
      Auth:
        Authorizers:
          MyCognitoAuthorizer: ...

  getByIdFunc:
    Type: AWS::Serverless::Function
    Properties:
      Handler: src/handler.handle
      Events:
        ApiEvent:
          Type: Api
          Properties:
            Path: /{id}
            Method: GET
            RestApiId: !Ref MyApi

根据这个在AWS SAM中使用CORS和那个https://github.com/aws/serverless-application-model/issues/373,cors配置应该可以工作,但是不幸的是,在API响应上没有设置头,如下所示。

代码语言:javascript
运行
复制
< HTTP/2 200 
< content-type: application/json
< content-length: 770
< date: Tue, 13 Apr 2021 19:55:31 GMT
< x-amzn-requestid: ...
< x-amz-apigw-id: ...
< x-amzn-trace-id: Root=1-...-...;Sampled=0
< x-cache: Miss from cloudfront
< via: 1.1 ...cloudfront.net (CloudFront)
< x-amz-cf-pop: FRA2-C2
< x-amz-cf-id: ...==
< 
* Connection #0 to host ....execute-api.eu-central-1.amazonaws.com left intact
[{"model": ..}]

我还尝试将cors配置添加到API定义(MyApi)本身,就像它在这里的官方医生中声明的那样,但没有成功。

我可以自己在响应中添加标题,但是我宁愿把它放在模板文件中。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2021-04-14 12:14:21

使用SAM/CLoudformation或AWS控制台,您可以为OPTIONS方法设置CORS头,在调用实际的API方法(GE/POST等)之前,该方法将由浏览器调用。从邮递员或任何其他服务,只有您的端点将被调用。

当我们使用带有API网关的lambda代理时,我们需要从lambda中在响应对象中设置CORS头。

若要为Lambda代理集成启用CORS,必须向输出标头中添加访问控制-允许-原产地:域名。域名可以是*任何域名。

代码语言:javascript
运行
复制
return {
        statusCode: 200,
        headers: {
            "Access-Control-Allow-Headers" : "Content-Type",
            "Access-Control-Allow-Origin": "*", // Allow from anywhere 
            "Access-Control-Allow-Methods": "GET" // Allow only GET request 
        },
        body: JSON.stringify(response)
    }
票数 10
EN

Stack Overflow用户

发布于 2021-11-03 11:30:31

解决这个问题的方法是在我的template.yaml中添加以下内容:

代码语言:javascript
运行
复制
Globals:
    Api:
        Cors:
            AllowMethods: "'GET,POST,OPTIONS'"
            AllowHeaders: "'content-type'"
            AllowOrigin: "'*'"
            # AllowCredentials: true  Uncomment only if you choose a specific origin instead of the * wildcard.

就像nirvana124和Nitesh所说的,您还需要在每个端点中返回带有响应的这些头:

代码语言:javascript
运行
复制
return {
    statusCode: 200,
    headers: {
        "Access-Control-Allow-Headers" : "Content-Type",
        "Access-Control-Allow-Origin": "*", // Allow from anywhere 
        "Access-Control-Allow-Methods": "GET" // Allow only GET request 
    },
    body: JSON.stringify(response)
}
票数 7
EN

Stack Overflow用户

发布于 2021-09-11 11:39:35

在您的脚本中,CORS是在API网关上启用的,但是SAM总是从API网关创建代理集成到Lambda,这意味着API网关不能添加任何集成响应,它将传递从LAMBDA接收的响应。这就是为什么您需要处理lambda中的CORS头,而不是依赖于API。下面是从LAMBDA返回的示例代码以及响应。

代码语言:javascript
运行
复制
return {
        statusCode: 200,
        headers: {
            "Access-Control-Allow-Headers" : "Content-Type,X-Amz-Date,Authorization,X-Api-Key,x-requested-with",
            "Access-Control-Allow-Origin": "*", // Allow from anywhere 
            "Access-Control-Allow-Methods": "OPTIONS,POST,GET,PUT,DELETE,PATCH" // Allow only GET request 
        },
        body: JSON.stringify(response)
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67065130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档