亚马逊接口NextToken分页调用时AuthFailure问题的解决

使用 aws 第四代签名算法 API(非 SDK 方式)访问亚马逊云接口,比如 DescribeInstanceTypes 首次请求会返回100条数据和 NextToken 用于分页请求其余数据,但用 NextToken 再次请求时报错:

<?xml version="1.0" encoding="utf-8"?>

<Response> 
  <Errors> 
    <Error> 
      <Code>AuthFailure</Code>  
      <Message>AWS was not able to validate the provided access credentials</Message> 
    </Error>
  </Errors>  
  <RequestID>bc04724d-d051-4381-80f0-f442b9c5228e</RequestID>
</Response>

这是由于 NextToken 含有 = 号,比如:

AAIAATUFTwRD6DG2RbXdzNAO1krlm9wTzNX2iAYK8p0Fgf1qTdcn4GcbFV0MDclb6dpurh0YYmm0p4rrFw_bUWhfefWnHA4dvsqSNxxENqnlHOBgGopD5LN32ci3mAOh1SDqlFCSCrE0fAOIo8KRsqgHA7GOLBXCdg==

这种将导致 url 传的参数和签名参数不一致而导致 aws 签名失败,返回 AuthFailure。
解决办法是 GET 请求 url 拼接参数的时候,进行 URL 转义:

url += entry.getKey() + "=" + URLEncoder.encode(entry.getValue(),"UTF-8") + "&";

这就可以了,不要再对 AmazonAWSV4Auth、请求头的参数转义,继续请求就可以正常返回了。

posted @ 2021-05-12 12:08  Defonds  阅读(196)  评论(0编辑  收藏  举报