调用EC2托管Web服务时返回Missing Authentication Token问题求助
我之前也碰到过类似的情况,这个错误看似是没传认证令牌,但很多时候其实是签名过程中的细节没处理到位导致的。你可以从以下几个方面逐一排查:
确认服务名称是否正确
如果你调用的是部署在EC2上的API Gateway服务,serviceName应该设为execute-api,而不是ec2;只有直接调用EC2原生API时才用ec2。很多人会在这里搞错,直接导致签名不匹配。检查Canonical URI的准确性
你代码里的canonicalURI只写了"e...",要确保它和实际请求的URI完全一致:- 比如实际请求路径是
/api/v1/orders,那这里就要填完整的路径 - 注意末尾的斜杠:如果请求的URI是
/api/,签名时的URI也必须带斜杠,不能省略,反之亦然
- 比如实际请求路径是
验证X-Amz-Date的格式和一致性
- 必须严格遵循ISO8601格式:
YYYYMMDD'T'HHMMSS'Z',比如20240520T143000Z - 签名时生成的
X-Amz-Date值必须和请求头里传入的完全一致,而且当前时间和这个时间的差不能超过15分钟,AWS会直接拒绝超时的请求
- 必须严格遵循ISO8601格式:
确保请求方法与签名配置一致
你代码里设置的是POST,要确认实际发送的请求确实是POST方法,不能出现配置是POST但实际发GET的情况,这会直接导致签名失效。检查是否遗漏了关键请求头
AWS V4签名需要把所有参与签名的请求头都纳入计算,最容易漏掉的是Host头。你需要确保在签名时把Host、X-Amz-Date等必要头加入到签名的headers列表中,并且请求时也带上这些头。处理POST请求的请求体(如果有)
如果你的POST请求带有请求体,必须计算请求体的SHA256哈希值,并在生成签名时将这个哈希值包含到canonical request中。如果跳过这一步,签名会不匹配,AWS会返回认证错误。验证Authorization头的格式
你生成的Authorization头应该符合这个格式:AWS4-HMAC-SHA256 Credential=AKIAXXXX/20240520/us-east-1/execute-api/aws4_request, SignedHeaders=host;x-amz-date, Signature=xxxxxx要检查:
- Credential部分的日期(
20240520)必须和X-Amz-Date的日期部分一致 - 区域、服务名称必须和签名配置的一致
- SignedHeaders必须包含所有参与签名的头,多个头用分号分隔,且全部小写
- Credential部分的日期(
如果以上都排查过还是有问题,可以把完整的请求头、签名生成的关键参数(比如canonical request、string to sign)打印出来对比,看看哪一步和AWS的要求不一致。
内容的提问来源于stack exchange,提问作者deksos

