如何在Alexa HTML Web API中校验Authorization头,阻止非Alexa设备访问
针对你遇到的Cloudfront托管下的Alexa技能请求认证问题,结合成本和效率需求,可按以下步骤实现精准校验:
1. 缩小校验范围,减少无效请求处理
Cloudfront默认对所有路径的请求统一处理,但只有Alexa触发的技能入口页面(比如/alexa-skill-entry/*这类专属路径)需要校验。在Cloudfront的缓存行为中配置:
- 仅对技能专属路径启用认证校验逻辑
- 静态资源(CSS、JS、图片等)路径直接设置缓存策略放行,无需经过校验环节
这一步能直接砍掉大部分无需校验的请求,缓解WAF和后续校验服务的压力。
2. 用Cloudfront Functions做轻量前置过滤
Cloudfront Functions成本远低于Lambda@Edge,适合做简单的请求预处理:
- 编写函数检查请求是否携带
Authorization头,且格式符合Bearer <JWT_TOKEN>的规范 - 对不符合格式的请求直接返回
401 Unauthorized,拦截无效请求进入后续环节
示例函数逻辑(简化版):
function handler(event) { const request = event.request; const authHeader = request.headers.authorization; if (!authHeader || !authHeader.value.startsWith('Bearer ')) { return { statusCode: 401, statusDescription: 'Unauthorized', headers: { 'content-type': { value: 'text/plain' } }, body: 'Missing or invalid Authorization header' }; } return request; }
3. 后端完成JWT完整校验
经过前置过滤的请求,需要做JWT的完整合法性验证,确保来自你的Alexa技能:
- 提取JWT:从
Authorization头中取出Bearer后的Token字符串 - 验证签名:使用Alexa官方提供的公钥集合验证JWT签名,确认Token由Alexa签发
- 校验核心声明(Claims):
iss(签发者)必须为https://api.amazonalexa.comaud(受众)必须严格匹配你的Alexa技能ID,确保请求是针对你的技能发起的exp(过期时间)必须未超过当前时间,防止过期Token被复用
低成本实现方式
将校验逻辑部署在API Gateway + Lambda组合中,把API Gateway设为Cloudfront的源站:
- Lambda负责执行JWT校验逻辑,因为前置已过滤大部分无效请求,Lambda调用量会大幅降低,成本可控
- 校验通过后,再转发请求到你的静态页面源站;校验失败则返回401
4. 优化WAF规则(可选)
如果仍需保留WAF,调整规则策略避免流程混乱:
- 仅对技能专属路径配置WAF规则,检查
Authorization头的存在性 - 设置合理的速率限制规则,仅拦截异常高频请求,正常请求放行到后续校验环节
关键注意事项
- 绝对不能仅依赖
Authorization头的存在性做校验,必须完成JWT签名和声明的完整验证,防止伪造请求 - 定期同步Alexa的公钥,确保签名验证的有效性
- Cloudfront Functions仅能做轻量格式检查,无法处理复杂的签名验证,必须配合后端校验
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

