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

Flutter用AWS SigV4签名请求遇HTTP/2错误(errorCode:1)求助

排查Flutter中AWS SigV4签名API Gateway请求的HTTP/2错误

以下是针对你遇到问题的具体排查方向:

1. 修正SigV4服务类型参数

你的代码中使用了AWSService.apiGatewayManagementApi,但这个服务类型是用于API Gateway WebSocket管理API的。对于REST API类型的API Gateway,必须使用AWSService.executeApi,否则生成的签名scope会不匹配,导致API Gateway拒绝请求:

final scope = AWSCredentialScope(
  region: region, 
  service: AWSService.executeApi // 替换原有的apiGatewayManagementApi
);

2. 确认请求URI的完整路径

检查Uri.https中的PATH是否包含API Gateway的部署阶段(Stage)。比如你的API部署在prod阶段,路径应该是/prod/your-actual-path,而不是仅写PATH。Postman中通常会包含stage路径,若代码中遗漏会导致请求路径不匹配,签名验证失败。

3. 强制使用HTTP/1.1发起请求

Flutter的AWSHttpRequest可能默认使用HTTP/2,部分API Gateway配置或网络环境对HTTP/2的支持存在问题。可以尝试用dart原生http包手动构造请求,带上签名后的头信息,强制使用HTTP/1.1:

// 签名后获取请求头和URI
final signedRequest = await signer.sign(request, credentialScope: scope);
// 用http包发起请求
final response = await http.get(
  signedRequest.uri,
  headers: signedRequest.headers,
);
print("Response: ${response.statusCode}");

4. 对比规范请求(Canonical Request)的细节

SigV4签名的核心是规范请求的一致性,即使请求头看起来一致,以下细节也可能导致签名不匹配:

  • 查询参数排序:SigV4要求查询参数按字母顺序排列,Dart默认Map是无序的,需改用SplayTreeMap确保排序:
    final queryParams = SplayTreeMap<String, String>()
      ..['QUERY_PARAM_1'] = 'ALPHA'
      ..['QUERY_PARAM_2'] = 'BETA';
    final request = AWSHttpRequest.get(
      Uri.https('HOST.execute-api.REGION.amazonaws.com', 'PATH', queryParams),
    );
    
  • Payload哈希:GET请求的Payload为空,对应的哈希值应为e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,确认代码中是否正确生成该值。
  • Host头:确保签名时包含了正确的Host头,部分情况下Flutter可能自动修改头信息,需对比Postman的Host头是否与代码一致。

5. 验证IAM权限的资源路径

检查IAM用户的权限策略中,API Gateway的资源路径是否与代码请求的路径完全匹配。例如策略中的资源是否包含stage部分:

{
  "Effect": "Allow",
  "Action": "execute-api:Invoke",
  "Resource": "arn:aws:execute-api:REGION:ACCOUNT_ID:API_ID/STAGE/PATH/*"
}

若策略中的资源路径与实际请求路径不匹配,即使签名正确也会被拒绝。

内容的提问来源于stack exchange,提问作者bonobo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:20:33