调用阿里云OSS签名URL
生活随笔
收集整理的這篇文章主要介紹了
调用阿里云OSS签名URL
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
業務場景
由于項目中未來會產生大批量的音視頻文件,全部存在服務器本地將會占用大量的空間;因此決定使用阿里云對象存儲服務(Object Stroage Service, OSS)實現文件上云;本地只保存最近3個月的文件,過期文件將會被刪除。如果要查看過期文件,則先從OSS中下載該文件,然后再進行其他的常規操作。
因為是第一次使用OSS,因此前期做了大量的準備工作。在申請了公司的OSS賬號之后,使用常規的上傳下載會提示沒有權限,因此在獲取OSS連接時,需要加一個參數SecurityToken。而在我獲取SecurityToken的時候,發現直接使用SDK中的AssumeRole請求是無法獲取的,這個原因是因為開發是在內網環境,而OSS的操作只能在外網環境進行訪問,因此還需要通過Proxy代理從內網通過代理服務器訪問外網。通過之前獲取SecurityToken時的報錯信息知道其訪問域名是sts.aliyuncs.com;在官方文檔中找到了公司對應使用的endPoint的STS地址,詳見阿里云STS接入地址。
于是接下來我需要自己來拼接訪問STS的訪問地址,官方也給了使用簽名的文檔,但是感覺不是很好。所以把自己的摸索歷程記下來。
實現代碼
在阿里云官方的簽名機制文檔中,給出了詳細的獲取簽名的步驟,以下代碼中有詳細的說明。
private static String DEMO_ARN = "acs:ram::1234567890123:role/firstrole";private static String DEMO_SESSION_NAME = "client";private static String DEMO_ACCESS_KEY_ID = "testid";private static String DEMO_ACCESS_KEY_SECRET = "testsecret";private static String DEMO_UUID = "571f8fb8-506e-11e5-8e12-b8e8563dc8d2";private static String DEMO_ISO8601TIME = "2015-09-01T05:57:34Z";public static void getSecurityToken() throws NoSuchAlgorithmException, IOException, InvalidKeyException {System.out.println("步驟一、1.使用請求參數構造規范化的請求字符串(Canonicalized Query String)。");//阿里云提供的獲取ISO8601格式時間的方法String iso8601Time = ParameterHelper.getISO8601Time(new Date());String uuid = getUUID();//按照文檔的說明,要先將參數按照字典順序排序,然后對參數進行看起來很復雜的編碼//但實際上已經提供了現成的方法進行編碼:percentEncode//keyList是我自己手動進行排序的參數key值的集合,下面的valueList按順序對應他們的取值List<String> keyList = new ArrayList<>();keyList.add("AccessKeyId");keyList.add("Action");keyList.add("Format");keyList.add("RoleArn");keyList.add("RoleSessionName");keyList.add("SignatureMethod");keyList.add("SignatureNonce");keyList.add("SignatureVersion");keyList.add("Timestamp");keyList.add("Version");List<String> valueList = new ArrayList<>();valueList.add(DEMO_ACCESS_KEY_ID);valueList.add("AssumeRole");valueList.add("JSON");valueList.add(DEMO_ARN);valueList.add(DEMO_SESSION_NAME);valueList.add("HMAC-SHA1");valueList.add(DEMO_UUID);valueList.add("1.0");valueList.add(DEMO_ISO8601TIME);valueList.add("2015-04-01");StringBuilder url = new StringBuilder();//這里對參數的key和value進行編碼,使用的方法是官方提供的percentEncode方法for(int i = 0; i < keyList.size(); i ++){String key = keyList.get(i);String value = valueList.get(i);if(i > 0){url.append("&");}url.append(percentEncode(key)).append("=").append(percentEncode(value));}//url這個變量存儲了獲取簽名必須的內容。System.out.println("CQS=" + url.toString());System.out.println("");System.out.println("2.將構造的規范化字符串按照下面的規則構造成待簽名的字符串。");//要注意的是,官方文檔中給出的示例URL包含https://sts.aliyuncs.com/?//但實際上要進行stringToSign的只是?之后的內容。String stringToSign = "GET&" + percentEncode("/") + "&" + percentEncode(url.toString());System.out.println("待簽名的字符串=" + stringToSign);System.out.println("");System.out.println("步驟二、1.按照RFC2104的定義,計算待簽名字符串(StringToSign)的HMAC值。");System.out.println("期望值:gNI7b0AyKZHxDgjBGPDgJ1Ce3L4=");//這里調用官方提供的方法獲取簽名值//我的日志里可以看出這里并沒有官方文檔中步驟二里的第二個小步驟//因為其實這里算出來的HMAC值,就已經是Signature的值了//我之前就是又對HMAC值進行了Base64編碼,所以生成的地址一直提示簽名不匹配//原因是因為官方的signString方法中已經進行了Base64編碼HmacSHA1Signer sha1Signer = new HmacSHA1Signer();String ShaHmac2Res = sha1Signer.signString(stringToSign, DEMO_ACCESS_KEY_SECRET + "&");System.out.println("HMAC值2=" + ShaHmac2Res);System.out.println("");System.out.println("3.將得到的簽名值作為Signature參數添加到請求參數中。");StringBuilder urlOfSign = new StringBuilder();urlOfSign.append("https://sts.aliyuncs.com/").append("?").append(url).append("&Signature=").append(percentEncode(ShaHmac2Res));System.out.println("HMAC值2的URL=" + urlOfSign.toString());//上面的urlOfSign就是最終有了簽名的訪問地址。System.out.println("over");}總結
以上是生活随笔為你收集整理的调用阿里云OSS签名URL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计世网:IT人员秘密思考的十件事情
- 下一篇: 燃气灶电气线路图及原理_燃气报警器电路图