获取CDN日志接口总是返回bad token

api地址:http://fusion.qiniuapi.com/v2...

headers:{
Authorization=QBox zHJrjjwccB_n30O16CAixLvfJ_0bs0gftZv8oOoH:tbfLTwioEfsTkKnuheKkeAHXGUU=
Content-Type=application/json
}

body:{"day":"2016-11-06"}

Authorization生成方式:

String authorization = "QBox " + getQbox("/v2/tune/log/list",null,"application/json","{\"day\":\"2016-11-06\"}");

accessToken生成方式:

  /**
   * 获取管理凭证
   * @param path 请求路径
   * @param query 查询参数
   * @param contentType Content-Tyoe
   * @param body 请求数据
   * @return 管理凭证
   */
  protected static String getQbox(String path,String query,String contentType,String body){
    try {
      Mac mac = createMac();
      mac.update(path.getBytes("UTF-8"));
      if (query != null && query.length() != 0) {
        mac.update("?".getBytes("UTF-8"));
        mac.update(query.getBytes("UTF-8"));
      }
      mac.update("\n".getBytes("UTF-8"));

      if (body != null && body.getBytes("UTF-8").length > 0 && contentType != null) {
        if (contentType.equals("application/x-www-form-urlencoded")
            || contentType.equals("application/json")) {
          mac.update(body.getBytes("UTF-8"));
        }
      }

      String sign = urlSaveEncode(mac.doFinal());
      String accessToken = ak + ":" + sign;
      return accessToken;
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
      return null;
    }
  }

  private static String urlSaveEncode(byte[] data){
    try {
      return Base64.encodeToString(data,Base64.URL_SAFE | Base64.NO_WRAP);
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
  }

使用这个代码可以操作资源,但是无法获取CDN日志,这是什么情况?

问题补充:
经过测试:你们的SDK里给的代码是有问题的,我请求的application/json的body数据不参与签名是可以通过权限校验的...
图片描述

阅读 2.9k
2 个回答

感觉是您的生成AccessToken的生成方式有问题,导致的bad token ,
算法

1.生成待签名的原始字符串:
抽取请求 URL 中 <path> 或 <path>?<query> 的部分与请求内容部分即 HTTP Body,用 n 连接起来。如无请求内容,该部分必须为空字符串。注意:当 Content-Type 为 application/x-www-form-urlencoded 时,签名内容必须包括请求内容。

signingStr = "<path>?<query>n"

signingStr = "<path>?<query>n<body>"
2.使用SecertKey对上一步生成的原始字符串计算HMAC-SHA1签名:

sign = hmac_sha1(signingStr, "<SecretKey>")
3.对签名进行URL安全的Base64编码:

encodedSign = urlsafe_base64_encode(sign)
4.将AccessKey和 encodedSign 用英文符号 : 连接起来:

accessToken = "<AccessKey>:<encodedSign>"

clipboard.png

新手上路,请多包涵

我也出现了这个问题,但是我仔细一看文档

1.生成待签名的原始字符串:
抽取请求 URL 中 <path> 或 <path>?<query> 的部分与请求内容部分即 HTTP Body,用 n
连接起来。如无请求内容,该部分必须为空字符串。注意:当 Content-Type 为
application/x-www-form-urlencoded 时,签名内容必须包括请求内容。

意思是说,application/x-www-form-urlencoded才需要传body进去进行签名,其他的Content-Type算签名时不需要包含body。

logo
七牛云问答
子站问答
访问
宣传栏