时间修正
调用需要签名认证的API之前,先要计算客户端与API网关的时间偏移量,避免过时的请求被重复使用。提交请求的时间戳(修正后)与服务器时间相差小于系统参数值clock_skew的时候,请求合法,否则会拒绝请求。如果是不需签名认证的API请求则不校验时间合法性。
开发者可以通过 http://${正式环境地址}/echo 接口的响应报文头的timestamp字段获得服务器时间t1,在服务器返回的同时获得本地时间t2,计算出大致的时间偏移量。
offset = t1-t2
在后续的请求,公共参数中需要提供的timestamp参数,需要根据这个偏移量进行修正后再写入到请求或签名中。
timestamp = System.currentTimeMillis() + offset
具体获取时间偏移量可以参考以下Java代码示例:
public static long getTimeOffset() { long offset = 0; HttpResponse response = null; //构造httpGet请求 CloseableHttpClient httpClient = HttpClientBuilder.create().build(); HttpGet httpTimeGet = new HttpGet("https://ag-api.ctwing.cn/echo"); try { long start = System.currentTimeMillis(); response = httpClient.execute(httpTimeGet); long end = System.currentTimeMillis(); //时间戳在返回的响应的head的x-ag-timestamp中 Header[] headers = response.getHeaders("x-ag-timestamp"); if (headers.length > 0) { long serviceTime = Long.parseLong(headers[0].getValue()); offset = serviceTime - (start + end) / 2L; } httpClient.close(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return offset; }
这篇文档是否帮助您解决了问题?