背景
随着公司跟chinaCache公司的cdn服务到期,最终选择了微软的Azure Cdn进行合作,因此需要在将原有的接口上进行拓展,支持Azure Cdn接口的支持。
官网对接文档:https://docs.azure.cn/zh-cn/cdn/cdn-api-signature
各位假如直接看官方接口文档进行对接,可能多少会有点懵,因为接口比较多,不知道具体要对接哪几个,以及请求header入参等多少都会有些坑。
如果大家以前公司用的是CHINACACHE公司的cdn产品的话,应该都知道这个对接,是直接通过输入用户名、密码、task的json格式进行传输。而Azure CDN 跟这种方式传输还是蛮大差别的。最近接口对接也已经上线, 我这边整理了自己对接的一些感受,还有遇到过的坑,希望对有需要的朋友有帮助。
步骤
建议可以先去看下官方的对接文档,先大致熟悉下对接流程。
我这边主要需要用到以下几个菜单,大家可以直接参考官网
- CDN API签名机制
- 节点管理-获取订阅下所有节点信息
- 缓存刷新-添加缓存刷新
对接流程也是按照上面几个步骤进行的,下面我会结合代码分别进行介绍
1.CDN API签名机制
这一步主要根据入参条件不同生成不同的签名字符串,签名生成方法封装到AzureSignTool
package com.trendy.ccp.server.cdn.tool;
import java.net.URL;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
/****
*
* @ClassName: AzureSignTool
* @Description: 微软生产api签名
* @author youqiang.xiong
* @date 2018年1月10日下午5:30:35
*
*/
publicclass AzureSignTool {
/**
* Calculate the authorization header
*
* @param requestURL Complete request URL with scheme, host, path and queries
* @param requestTime UTC request time with format "yyyy-MM-dd hh:mm:ss"
* @param keyID API key ID
* @param keyValue API key value
* @param httpMethod HTTP method in upper case
* @return Calculated authorization header
*/
publicstatic String calculateAuthorizationHeader(String requestURL,
String requestTime, String keyID, String keyValue, String httpMethod)
throws Exception {
URL url = new URL(requestURL);
String path = url.getPath();
// Get query parameters
String query = url.getQuery();
String[] params = query.split("&");
Map<String, String> paramMap = new TreeMap<String, String>();
for (String param : params) {
String[] paramterParts = param.split("=");
if (paramterParts.length != 2) {
continue;
}
paramMap.put(paramterParts[0], paramterParts[1]);
}
String orderedQueries = paramMap.entrySet().stream()
.map(entry -> entry.getKey() + ":" + entry.getValue())
.collect(Collectors.joining(", "));
String content = String.format("%s\r\n%s\r\n%s\r\n%s", path,
orderedQueries, requestTime, httpMethod);
Mac sha256HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(keyValue.getBytes(),"HmacSHA256");
sha256HMAC.init(secret_key);
byte[] bytes = sha256HMAC.doFinal(content.getBytes());
StringBuffer hash = new StringBuffer();
for (inti = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(0xFF & bytes[i]);
if (hex.length() == 1) {
hash.append('0');
}
hash.append(hex);
}
return String.format("AzureCDN %s:%s", keyID, hash.toString()
.toUpperCase());
}
String orderedQueries = paramMap.entrySet().stream()
.map(entry -> entry.getKey() + ":" + entry.getValue())
.collect(Collectors.joining(", "));
注意:以上这段代码采用的jdk1.8的stream语法,需要使用jdk1.8进行编译,如果原来并未使用1.8的话,需要将1.8的语法转化成低版本的语法