对象存储的下载凭证demo

概述:

前端需要把 桶的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)

个人感觉原理 应该是 两端都进行 加上时间戳 的加密算法加密 然后判断是否一致,或者是在服务端进行解密 先进行时间校验 ,然后在加密对比验证

如有错误,恳请指出!

原文地址:https://www.cnblogs.com/blogspring/p/14191773.html