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数据不参与签名是可以通过权限校验的...
感觉是您的生成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>"