七牛云 token獲取工具分享

以前寫(xiě)安卓使用到了七牛進(jìn)行圖片上傳獲取外鏈,在網(wǎng)上搜索token的獲取方法,都沒(méi)有一個(gè)可靠一點(diǎn)的,各種模擬獲取token..連官方文檔也寫(xiě)著token加密方法不屬于androidSDK文檔范疇...

于是這次,本著學(xué)習(xí)javaweb的心態(tài),花了一晚上的時(shí)間把官方服務(wù)器端sdk看了下,了解了加密方式,制作出了java后端token獲取工具。雖然只有最基礎(chǔ)的功能,但也算夠用了,以后如果有需求再增加功能,歡迎大家star,fork

在線(xiàn)post地址

GitHub地址

qiniu.png
由于accessKey這些數(shù)據(jù)很重要,這里我也為大家把核心代碼和步驟分享出來(lái)供大家自己在服務(wù)器上使用。
qiniu2.png

上圖是比較清晰的上傳思路,一共有五步,涉及到Base64和HMAC-SHA1加密

測(cè)試數(shù)據(jù):
Bucket: "qtestbucket",
AK: "iN7NgwM31j4-BZacMjPrOQBs34UG1maYCAQmhdCV",
SK: "6QTOr2Jg1gcZEWDQXKOGZh5PziC2MCV5KsntT70j"
接下來(lái)一步一步用java代碼演示
  1. 序列化上傳策略

    上傳策略在官方sdk文檔上有,最基本的兩條是scope和deadline,對(duì)應(yīng)著bucket名字和截止日期。將上傳策略序列化為json格式

    {
        "scope" : "qtestbucket",
        "deadline" : 1519389163
    }
    
    //截止期限,這里設(shè)置一個(gè)小時(shí),值越大越長(zhǎng),php格式的10位數(shù)值
    long deadline = System.currentTimeMillis() / 1000L + get1Hour();
    //序列化為String類(lèi)型(jsonEncoder是個(gè)傻傻的json參數(shù)拼接方法)
    String s = jsonEncoder(bucket, String.valueOf(deadline));
    
  2. 編碼上傳策略

    對(duì)上傳策略(json)使用Base64編碼,得到encoded

    //Base64編碼使用java內(nèi)置的也行,這里我使用的七牛sdk里的Base64類(lèi)
    Base64.encodeToString(data, 10);
    
  3. HMAC-SHA1加密

    使用encoded對(duì)SecretKey進(jìn)行HMAC-SHA1加密,將加密結(jié)果進(jìn)行Base64編碼,得到encode_signed

    這里有點(diǎn)坑,網(wǎng)上java的HMAC-SHA1加密方式似乎無(wú)法得到正確的結(jié)果,官方sdk的加密方式才行。

    private String sign(byte[] data) {
         //HMAC-SHA1加密
            Mac mac = this.createMac();
         //將HMAC-SHA1加密結(jié)果進(jìn)行Base64編碼
            String encodedSign = encodeToString(mac.doFinal(data));
         //得到encode_signed,返回拼接
            return this.accessKey + ":" + encodedSign;
    }
    //Base64編碼
    private static String encodeToString(byte[] data) {
            return Base64.encodeToString(data, 10);
    }
    //HMAC-SHA1加密
    private Mac createMac() {
            try {
                Mac mac = Mac.getInstance("HmacSHA1");
                mac.init(this.secretKey);
                return mac;
            } catch (GeneralSecurityException var3) {
                var3.printStackTrace();
                throw new IllegalArgumentException(var3);
            }
    }
    
  4. 拼接

    將AccessKey,encode_signed,encoded使用“:”拼接,得到最終token

所有和獲取token有關(guān)的代碼在Util文件夾內(nèi),可自行下載使用,使用方法如下

TokenHelper tokenHelper = TokenHelper.create(accessKey, secretKey);
String token = tokenHelper.getToken(bucket);

至于為啥我寫(xiě)的TokenHelper代碼如此混亂,因?yàn)槲页u了官方sdk的代碼風(fēng)格...

官方的Auth類(lèi)一樣的各種return,還沒(méi)注釋=_=

為了拼接,類(lèi)似return this.accessKey + ":" + encodedSign這樣的方式讓代碼稍微繞了點(diǎn)。

最后把打包后的war包發(fā)出來(lái)qiniu.war

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容