如何从Flutter应用向AWS Lambda/API Gateway发起SigV4签名请求?
从Flutter应用向AWS API Gateway/Lambda发起SigV4签名请求的实现方案
问题背景
需要从Flutter(以iOS为例)应用向AWS Lambda或API Gateway发起带SigV4签名的请求。AWS在2022年5月宣布支持Flutter/Dart原生调用AWS后端服务,但目前公开案例仅有用签名器请求Cognito用户池的场景,暂未见到用于Lambda或API Gateway调用的实现,希望找到基于AWS官方Dart包的可行方案,或其他安全调用AWS服务的方法。
已验证的实现步骤
我已成功实现该需求,具体步骤如下:
1. Flutter端代码实现
以下代码中大写内容为需替换的占位符:
import 'dart:convert'; import 'package:aws_common/aws_common.dart'; import 'package:aws_signature_v4/aws_signature_v4.dart'; const signer = AWSSigV4Signer( credentialsProvider: AWSCredentialsProvider.dartEnvironment(), ); const region = 'REGION'; Future<void> invokeAWSService() async { final scope = AWSCredentialScope( region: region, service: AWSService.apiGatewayV2, dateTime: AWSDateTime(DateTime.now()), ); final request = AWSHttpRequest( method: AWSHttpMethod.post, uri: Uri.https('HOST.execute-api.REGION.amazonaws.com','/STAGE_NAME'), headers: const { AWSHeaders.contentType: 'application/x-amz-json-1.1', }, body: json.encode({ 'EVENT_KEY':'EVENT_VALUE', }).codeUnits, ); final signedRequest = await signer.sign( request, credentialScope: scope, ); final resp = await signedRequest.send(); final respBody = await resp.decodeBody(); print('\n\n${signedRequest.headers}\n\n${respBody}\n\n${resp.statusCode}\n\n'); }
2. AWS端资源配置(单一区域内操作)
- 创建具备编程访问权限的IAM用户,为其附加拥有
execute-api:Invoke权限的策略,妥善保存该用户的密钥。 - 创建Lambda函数(可使用默认测试函数)。
- 在API Gateway中创建REST类型API(非私有):
- 选择Regional终端节点
- 添加POST方法:
- 授权类型选择IAM
- 集成类型选择Lambda:
- 关联目标Lambda函数,不要启用Lambda代理集成
- 将创建好的API部署至新的阶段并命名。
3. 代码参数替换
编辑Flutter端的Dart代码,填入AWS端创建的资源信息,包括区域、API网关域名、阶段名称等。
4. API Gateway测试
在API Gateway控制台内测试创建的API,注意:若启用了Lambda代理集成会导致502错误,需确保该选项未勾选。
5. 运行Flutter应用
API测试通过后,在终端执行以下命令启动应用(替换为创建的IAM用户密钥):
flutter run --dart-define=AWS_ACCESS_KEY_ID=你的IAM访问密钥 --dart-define=AWS_SECRET_ACCESS_KEY=你的IAM私有密钥
效果验证
我通过按钮触发上述invokeAWSService函数,保留代码中的打印语句后,可看到类似如下的响应结果:
{"statusCode": 200, "body": "\"Hello from Lambda!\""}
此方案已验证可行,但无法保证在所有环境下都适用,欢迎交流提问和建议。
内容的提问来源于stack exchange,提问作者dutch
相关产品推荐
相关产品推荐

