Flutter调用AWS LEX postContent返回403 InvalidSignatureException如何解决
你遇到的403签名错误是因为手动添加x-amz-content-sha256请求头后,底层AWS SigV4签名逻辑没有同步调整导致的。aws_lex_runtime_api依赖的shared_aws_api包默认会计算请求payload的SHA256哈希值用于签名,你手动将请求头设为UNSIGNED-PAYLOAD,但签名计算时仍使用了实际payload的哈希值,两边不匹配就触发了签名校验失败。
解决方案
- 不要直接修改源码硬加请求头,你需要同步调整底层的签名逻辑:找到
shared_aws_api包中RestJsonProtocol.sendRaw方法里的签名计算部分,添加判断逻辑:如果当前请求是Lex的postContent接口,就直接将签名所需的payload哈希值设为字符串UNSIGNED-PAYLOAD,同时自动把对应的请求头加上,不要手动额外加。 - 你当前传入的
inputStream参数格式不对,你现在传的是文本字符串转的字节数组,不符合你指定的audio/x-l16格式要求。需要用flutter_sound等录音库采集16kHz采样率、单声道、16位小端的PCM音频数据,再转成Uint8List传入,否则就算签名校验通过,LEX也无法正常识别语音内容。 - 如果你不想修改依赖包源码,可以换用AWS官方的
amplify_flutter库集成LEX,Amplify官方已经适配了postContent接口的签名逻辑和音频格式要求,不需要自己处理签名相关的细节。 - 排查时可以先通过AWS CLI调用
postContent接口验证你的AK/SK、bot别名、权限配置是否正确,排除服务端权限配置问题后,再定位Flutter端的代码问题。
内容的提问来源于stack exchange,提问作者tderick
相关产品推荐
相关产品推荐

