如何在AWS API Gateway的Lambda授权器中验证请求来自自有网站?
解决AWS Lambda授权器校验请求来源的问题
1. 让Lambda授权器获取到Origin请求头
API Gateway默认不会把Origin头传递给Lambda授权器,需手动配置:
- 若使用REQUEST类型授权器:在API Gateway控制台的授权器配置页,找到「Headers」输入框,添加
Origin(HTTP头不区分大小写,按实际请求写法配置即可)。保存后重新部署API,Lambda的event.request.headers中就能拿到Origin字段。 - 若之前用TOKEN类型授权器:建议切换为REQUEST类型——TOKEN授权器仅聚焦令牌解析,默认不传递完整请求头,适配性远不如REQUEST类型。
2. Origin校验核心逻辑
拿到Origin后,在Lambda授权器中执行以下校验:
- 先定义允许的域名白名单,示例:
allowed_origins = ["https://your-website.com", "https://www.your-website.com"] - 从
event['request']['headers'].get('origin', '').lower()获取请求Origin,转小写后与白名单比对,不在列表内则返回拒绝授权的响应:return { "principalId": "unauthorized", "policyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": "execute-api:Invoke", "Effect": "Deny", "Resource": event['methodArn'] } ] } }
3. 结合Auth0 Token的双重校验
仅校验Origin不够,需同时严格校验Auth0的access_token,避免非法令牌滥用:
- 校验
iss字段,确保是你的Auth0域名(如https://your-auth0-domain.us.auth0.com/) - 校验
aud字段,必须是你在Auth0中配置的API标识符,保证令牌是发给你的API的 - 校验
exp字段,确认令牌未过期 - 这些校验可借助Auth0官方SDK(如
jose库)实现,避免手动解析JWT出错。
4. 低成本补充防护(可选)
- 给前端请求添加自定义请求头(如
X-App-Signature),前端基于请求参数+时间戳生成简单签名,Lambda授权器内验证签名合法性。虽无法完全杜绝伪造,但能提升Postman等工具伪造请求的门槛。 - 将API Gateway的CORS配置从
*改为仅允许你的域名,浏览器端的CORS限制可阻止其他网站直接发起请求,配合后端Origin校验形成双层防护。
内容的提问来源于stack exchange,提问作者vpv
相关产品推荐
相关产品推荐

