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

如何在Alexa HTML Web API中校验Authorization头,阻止非Alexa设备访问

验证Alexa HTML Web API请求的Authorization头方案

针对你遇到的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技能:

  1. 提取JWT:从Authorization头中取出Bearer后的Token字符串
  2. 验证签名:使用Alexa官方提供的公钥集合验证JWT签名,确认Token由Alexa签发
  3. 校验核心声明(Claims):
    • iss(签发者)必须为https://api.amazonalexa.com
    • aud(受众)必须严格匹配你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:34:56