合作伙伴工作台
注册

时间修正

调用需要签名认证的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;
}


这篇文档是否帮助您解决了问题?
如果您愿意进一步帮助我们改进文档 ,请留下您的联系方式。