如何限制AWS Lambda API仅允许特定域名访问?
解决AWS Lambda API仅允许特定域名访问的问题
嘿,我来帮你搞定这个困扰!首先得澄清一个常见误区:单纯设置Access-Control-Allow-Origin只能限制浏览器的跨域请求,无法阻止直接通过工具(比如curl、Postman)发起的请求——因为CORS是浏览器端的安全机制,不是服务器端的访问控制。要真正实现仅允许指定域名访问,你需要在服务器端(Lambda或API Gateway)做主动验证。
下面给你几个可行的解决方案,按实现复杂度从低到高排序:
方案一:在Lambda函数中直接验证Origin头
这是最直接的方法,只需修改你的Lambda处理代码,检查请求的Origin头是否在允许列表内:
- 获取请求的Origin头:根据API Gateway的类型(REST API/HTTP API),从event对象中提取
origin头(API Gateway会把所有请求头转成小写) - 定义允许的域名列表:把你信任的域名(比如
https://www.example.com)加入列表 - 验证并返回响应:如果Origin不在列表里,直接返回403禁止访问;如果在,返回正常响应并带上正确的CORS头
Python Lambda代码示例
import json def lambda_handler(event, context): # 从请求头中获取Origin request_origin = event.get('headers', {}).get('origin', '') # 定义允许访问的域名(注意要包含完整的协议,比如https://) allowed_origins = ["https://www.example.com"] # 验证Origin是否合法 if request_origin not in allowed_origins: return { 'statusCode': 403, 'headers': { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' # 403场景下浏览器会处理跨域,也可以省略 }, 'body': json.dumps({"error": "Forbidden: 仅限指定域名访问"}) } # 这里写你的业务逻辑 response_data = {"message": "API调用成功"} # 返回带正确CORS头的响应 return { 'statusCode': 200, 'headers': { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': request_origin # 只返回当前合法的Origin }, 'body': json.dumps(response_data) }
注意:如果是API Gateway HTTP API,event的结构会略有不同,你可以通过打印event日志来确认
origin头的位置。
方案二:用AWS WAF拦截非法请求
如果你的API通过API Gateway暴露,可以用AWS WAF创建规则来直接拦截不符合要求的请求,无需修改Lambda代码:
- 登录AWS控制台,进入WAF服务
- 创建一个Web ACL,关联到你的API Gateway
- 添加一条规则:选择「匹配条件」为「请求头」,目标头为
Origin,匹配类型为「完全等于」,值填https://www.example.com - 设置规则动作为「允许」,然后添加一条默认规则动作为「阻止」
- 保存并部署Web ACL,之后所有非指定Origin的请求都会被WAF直接拦截
方案三:使用API Gateway自定义授权器(进阶)
如果需要更复杂的访问控制逻辑(比如结合其他验证条件),可以创建自定义授权器:
- 编写一个Lambda授权器函数,在其中验证请求的Origin头
- 在API Gateway中配置这个授权器,指定需要验证的方法
- 只有通过授权器验证的请求才能到达你的业务Lambda函数
这个方案适合有额外授权需求的场景,比如同时验证API密钥和Origin。
额外注意事项
- 确保你填写的允许域名包含完整的协议(
https://或http://),浏览器发送的Origin头是带协议的 - 测试时要覆盖多种场景:从允许的域名用浏览器访问、从其他域名访问、用curl直接调用API,确保验证逻辑生效
内容的提问来源于stack exchange,提问作者Venkatesh Vellingiri
相关产品推荐
相关产品推荐

