You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制AWS Lambda API仅允许特定域名访问?

解决AWS Lambda API仅允许特定域名访问的问题

嘿,我来帮你搞定这个困扰!首先得澄清一个常见误区:单纯设置Access-Control-Allow-Origin只能限制浏览器的跨域请求,无法阻止直接通过工具(比如curl、Postman)发起的请求——因为CORS是浏览器端的安全机制,不是服务器端的访问控制。要真正实现仅允许指定域名访问,你需要在服务器端(Lambda或API Gateway)做主动验证。

下面给你几个可行的解决方案,按实现复杂度从低到高排序:

方案一:在Lambda函数中直接验证Origin头

这是最直接的方法,只需修改你的Lambda处理代码,检查请求的Origin头是否在允许列表内:

  1. 获取请求的Origin头:根据API Gateway的类型(REST API/HTTP API),从event对象中提取origin头(API Gateway会把所有请求头转成小写)
  2. 定义允许的域名列表:把你信任的域名(比如https://www.example.com)加入列表
  3. 验证并返回响应:如果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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:18:22