首页
/ AWS SAM模板中配置CORS与Cognito认证的最佳实践

AWS SAM模板中配置CORS与Cognito认证的最佳实践

2025-05-24 15:03:56作者:虞亚竹Luna

在使用AWS Serverless Application Model (SAM)构建无服务器应用时,正确配置跨域资源共享(CORS)与Cognito认证是一个常见的技术挑战。本文将深入探讨如何正确配置这些功能,避免常见的陷阱。

核心配置要点

1. API全局CORS设置

在SAM模板的Globals部分,我们可以为所有API设置统一的CORS策略:

Globals:
  Api:
    Cors:
      AllowOrigin: "'*'"
      AllowHeaders: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"
      AllowMethods: "'POST,GET,OPTIONS'"

注意这里的引号使用方式,这是SAM模板的特殊语法要求。

2. 自定义API网关响应头

对于认证失败等特殊情况,需要单独配置响应头:

Resources:
  MyApi:
    Type: AWS::Serverless::Api
    Properties:
      GatewayResponses:
        UNAUTHORIZED:
          StatusCode: 401
          ResponseParameters:
            Headers:
              Access-Control-Allow-Origin: "'*'"
        ACCESS_DENIED:
          StatusCode: 403
          ResponseParameters:
            Headers:
              Access-Control-Allow-Origin: "'*'"

3. Lambda授权函数配置

授权函数是CORS配置中最容易出错的部分。关键点在于:

  1. 授权函数不应在返回的策略中包含响应头
  2. 正确的策略生成函数应该如下:
const generatePolicy = (principalId, effect, resource) => {
  return {
    principalId: principalId,
    policyDocument: {
      Version: "2012-10-17",
      Statement: [{
        Action: "execute-api:Invoke",
        Effect: effect,
        Resource: resource
      }]
    }
  };
};

常见问题解决方案

1. 预检请求(OPTIONS)处理

确保OPTIONS方法不被授权,这是CORS预检请求正常工作的重要前提。在API Gateway控制台中确认OPTIONS方法显示为"NONE"。

2. 响应头设置

在业务Lambda函数中,必须正确设置响应头:

return {
  statusCode: 200,
  headers: {
    "Access-Control-Allow-Origin": "*",
    "Content-Type": "application/json"
  },
  body: JSON.stringify(response)
};

3. 授权函数权限

授权函数需要足够的权限来验证令牌:

Policies:
  - AmazonCognitoPowerUser

最佳实践建议

  1. 生产环境中不建议使用"*"作为AllowOrigin,应该明确指定允许的域名
  2. 考虑使用DefaultAuthorizer简化配置
  3. 测试时先禁用认证,确认CORS正常工作后再启用认证
  4. 使用API Gateway控制台检查方法配置,确保OPTIONS方法不被授权

通过以上配置,可以确保AWS SAM应用同时支持CORS和Cognito认证,为前端应用提供安全的跨域访问能力。

登录后查看全文
热门项目推荐
相关项目推荐