概述:
前端需要把 桶的url 和 文件名传入 ,并且我们需要进行验证请求进来用户身份的校验
然后把获取到的 桶域名 和文件名 按照公开空间访问方式构建对应的公开空间访问连接,然后再对这个这个链接进行私有授权签名 ,返回给 前端,和公开资源URL 相比增加了两个参数 一个是e 代表过期时间(秒为单位),还有一个是 token 代表下载凭证
使用的是七牛云 , maven 添加上sdk 依赖
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>[7.2.0, 7.2.99]</version>
</dependency>
编写个单元测试
fileName 是文件名
domainOfBucket 是桶的空间域名, 切记 url 前缀加上 http:// 不然生成的url 会报 token 错误
accessKey 和 secretKey 在密钥管理里面查看
expireInSeconds 是设置的时间 ,以秒为单位
@Test
public void norm() throws UnsupportedEncodingException {
String fileName = "Jellyfish.jpg";
String domainOfBucket = "http://pu3myqsbm.bkt.clouddn.com";
String encodedFileName = URLEncoder.encode(fileName, "utf-8").replace("+", "%20");
String publicUrl = String.format("%s/%s", domainOfBucket, encodedFileName);
String accessKey = "x";
String secretKey = "x";
Auth auth = Auth.create(accessKey, secretKey);
long expireInSeconds = 3600;//1小时,可以自定义链接过期时间
String finalUrl = auth.privateDownloadUrl(publicUrl, expireInSeconds);
System.out.println(finalUrl);
}
token 原理的一些个人理解:
(1)调用 string.getBytes() 将 secretKey(密钥) 转为byte[] 数组
(2) 生成 javax.crypto.spec.SecretKeySpec 对象 参数1( 密钥生成的 byte[] ) , 参数2 ("HmacSHA1") 指定加密算法
( 3)调用 javax.crypto,Mac.getInstance("HmacSHA1") 以hash1 算法 生成 javax.crypto.Mac 对象
(3)调用生成 mac 对象的 init(secretKey) 初始化方法 ,参数是 步骤2 生成的 SecretKeySpec对象的 secretKey
(4)这时候生成了mac 对象 调用 mac.doFinal() 参数是 token 前面的url
http://pu3myqsbm.bkt.clouddn.com/Jellyfish.jpg?e=1562291474 的byte[] 数组 进行加密
(5)然后在进行 Base64的 编码成 string 返回 下载签证
(6)token 的组成拼接: accessKey + : + encodedSign(secretKey生成的加密mac 和 http://pu3myqsbm.bkt.clouddn.com/Jellyfish.jpg?e=1562291474 加密的 data 组合而成的encodedSign)
个人感觉原理 应该是 两端都进行 加上时间戳 的加密算法加密 然后判断是否一致,或者是在服务端进行解密 先进行时间校验 ,然后在加密对比验证
如有错误,恳请指出!