我正在尝试使用与Native api网关的react-native.相同的代码(纯JS)在ios上运行很好,但在 android上它失败了403错误. var signedRequest={ "headers": { "Content-Type": "application/json", "Accept": "application/json", "
var signedRequest={ "headers": { "Content-Type": "application/json", "Accept": "application/json", "x-amz-date": "20170918T134411Z", "Authorization": "AWS4-HMAC-SHA256 Credential=ASIAIBC7RQ7MFUIRO7QQ/20170918/ap-northeast-1/execute-api/aws4_request, SignedHeaders=accept;content-type;host;x-amz-date, Signature=9fb6d4d4820024097f25aaa70648fxxx7a54a2db1a67d173189693dc073d0a0bac8", "x-amz-security-token": "AgoGb3JpZ2luEKn////////xxxG1iKJBHjjvZH0DxcSqE889Wb3Mv+8PwMqrRe/O5dFFmP+9bQj+fSwVIUvmBplKkQB62x/xTelGHoCEOPXpBWLjT2OAUaBXOti7UZyfyMNgg56/Z58yxk4o2/37xPLbhXfODaL8kydFV8IaPJjdbJIX+a0kXycPLBnVIBdukUp9cMVD27mWN41u3w0VP5J8YiMPzrDnwKtb0U37naoIaknMBqNBDkMGQyHal/TBJ3wjJvJWVntrJvex0QKD8rDLHjaoiIYjBd+a04m2pKsBQJ9WQl02TTCPgRp0bb1oARF2hz0Xpi45Ba6a6E9SAL07UcRShTwX6rmxi0dZ38mkSbBMjI45Xg8r/VaRZx6/OyCq3u+nq4bgLCOMKqb/80F" }, "data": "{\"data\":{\"func\":\"checkIfFacebookSignupComplete\",\"data\":{}}}", "method": "POST", "url": "https://xxx.execute-api.ap-northeast-1.amazonaws.com/dev/user/user" } var apiResponse=await fetch(signedRequest.url, { method: signedRequest.method, body: signedRequest.data, headers: signedRequest.headers, }) console.log("Got api response : ", apiResponse)
在iOS上它收到一个http响应200.但是,在android上它失败了:
“我们计算的请求签名与您提供的签名不匹配.请检查您的AWS秘密访问密钥和签名方法.有关详细信息,请参阅服务文档.
The Canonical String for this request should have been 'POST /dev/user/user accept:application/json content-type:application/json; charset=utf-8 host:uihw7hnkn7.execute-api.ap-northeast-1.amazonaws.com x-amz-date:20170918T134411Z accept;content-type;host;x-amz-date 6b83b80f2875c2425c28b258886ad98603fd802095e35303a3c2a72528374fb5' The String-to-Sign should have been 'AWS4-HMAC-SHA256 20170918T134411Z 20170918/ap-northeast-1/execute-api/aws4_request 008853cdfba53255257d9169e1a9c05500d01299da9efd4695ac8c66cb31e5e7' "
我也尝试过axios.同样的结果. (ios工作正常,android失败)我正在使用react-native 0.42.3.
任何人都知道可能是什么问题?
经过大量挖掘后,问题似乎与此处描述的相关: https://github.com/facebook/react-native/issues/14445. android okHttp库(反应原生地使用)将charset = utf = 8添加到请求中.因此解决方案是使用标头计算sig4值,如下所示:var signedRequest={ "headers": { "Content-Type": "pplication/json; charset=utf-8", "Accept": "application/json", "x-amz-date": "20170918T134411Z", "Authorization": "Calculated sig4 auth", "x-amz-security-token": "AgoGb3JpZ2luEKn////////xxxG1iKJBHjjvZH0DxcSqE889Wb3Mv+8PwMqrRe/O5dFFmP+9bQj+fSwVIUvmBplKkQB62x/xTelGHoCEOPXpBWLjT2OAUaBXOti7UZyfyMNgg56/Z58yxk4o2/37xPLbhXfODaL8kydFV8IaPJjdbJIX+a0kXycPLBnVIBdukUp9cMVD27mWN41u3w0VP5J8YiMPzrDnwKtb0U37naoIaknMBqNBDkMGQyHal/TBJ3wjJvJWVntrJvex0QKD8rDLHjaoiIYjBd+a04m2pKsBQJ9WQl02TTCPgRp0bb1oARF2hz0Xpi45Ba6a6E9SAL07UcRShTwX6rmxi0dZ38mkSbBMjI45Xg8r/VaRZx6/OyCq3u+nq4bgLCOMKqb/80F" }, "data": "{\"data\":{\"func\":\"checkIfFacebookSignupComplete\",\"data\":{}}}", "method": "POST", "url": "https://xxx.execute-api.ap-northeast-1.amazonaws.com/dev/user/user" }