二探-七牛Token生成

前面部分我們簡(jiǎn)單介紹了七牛云存儲(chǔ),在上傳中對(duì)于客戶端其中一個(gè)麻煩的就是Token

Token是七牛中上傳文件最重要的東西,本篇文字僅僅對(duì)token的生成進(jìn)行介紹

官方提供一個(gè)在線版本供大家使用,在這里我對(duì)他的作用定義位demo使用以及對(duì)token生成算法的驗(yàn)證
如果想使用在線的請(qǐng)點(diǎn)擊在線生成(網(wǎng)速不好經(jīng)常加載失敗)

這里就需要Access/Secret Key 以及資源庫(kù)的名字(七牛云存儲(chǔ)文章有說明在哪里)

Paste_Image.png

生成token步驟

第一步:確定上策略
第二步:將上傳策略序列化為json格式

 貌似七牛需要一個(gè)純粹的字符串
{
    "scope" : "qtestbucket",
    "deadline" : 1464682657
} //生成的編碼一直不對(duì)  去除\n  空格

{"scope":"qtestbucket","deadline":1464682657} //scope 資源庫(kù)名稱  //deadline  到期日  精確到秒

第三步:對(duì)json序列化后的上傳策略進(jìn)行URL安全的Base64編碼,得到如下encoded

eyJzY29wZSI6InF0ZXN0YnVja2V0IiwiZGVhZGxpbmUiOjE0NTg2MzEzNTh9

第四步:用SecretKey對(duì)編碼后的上傳策略進(jìn)行HMAC-SHA1加密,并且做URL安全的Base64編碼,得到如下的encoded_signed

fjSkz5yohmoARYHhaDN2tIgajfU=

第五步:將 AccessKey、encode_signed 和 encoded 用 “:” 連接起來(lái),得到如下的UploadToken

iN7NgwM31j4-BZacMjPrOQBs34UG1maYCAQmhdCV:fjSkz5yohmoARYHhaDN2tIgajfU=:eyJzY29wZSI6InF0ZXN0YnVja2V0IiwiZGVhZGxpbmUiOjE0NTg2MzEzNTh9

buckeName進(jìn)行base64編碼之后 作為key
SecretKey 字符串做value 進(jìn)行HNAC_SHA1加密
生成NSDate
**注意:簽名結(jié)果是二進(jìn)制數(shù)據(jù),此處輸出的是每個(gè)字節(jié)的十六進(jìn)制表示,以便核對(duì)檢查。
base64編碼

iOS前端生成token

七牛不建議由本地生成token(不安全)
本篇介紹token生成方法

//qiNiuSDK包含以下文件
#import "QiniuAuthPolicy.h"
#import <CommonCrypto/CommonDigest.h>
#include <CommonCrypto/CommonHMAC.h>
#import "QNUrlSafeBase64.h"
#import "QN_GTM_Base64.h"
//
+ (NSString*)dictionryToJSONString:(NSMutableDictionary *)dictionary
{  
    NSError *parseError = nil;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&parseError];

    return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}

//AccessKey  以及SecretKey
+ (NSString *)token{

    return [QiniuAuthPolicy makeToken:@"0E7b15eWUOy70z0xMyZzI4tJavS9dnb2b9mrqszY" secretKey:@"9zyzOj-B-gCca-D81MiOVdctmYFM3Q1YVXcD48wZ"];
}

+ (NSString *) hmacSha1Key:(NSString*)key textData:(NSString*)text
 {
     const char *cData  = [text cStringUsingEncoding:NSUTF8StringEncoding];
     const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
     uint8_t cHMAC[CC_SHA1_DIGEST_LENGTH];
     CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
     NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:CC_SHA1_DIGEST_LENGTH];
     NSString *hash = [QNUrlSafeBase64 encodeData:HMAC];
     return hash;
 }

+ (NSString *)makeToken:(NSString *)accessKey secretKey:(NSString *)secretKey
{
    //名字
    NSString *baseName = [self marshal];
    baseName = [baseName stringByReplacingOccurrencesOfString:@" " withString:@""];
    baseName = [baseName stringByReplacingOccurrencesOfString:@"\n" withString:@""];

    NSData   *baseNameData = [baseName dataUsingEncoding:NSUTF8StringEncoding];
    NSString *baseNameBase64 = [QNUrlSafeBase64 encodeData:baseNameData];
    NSString *secretKeyBase64 =  [QiniuAuthPolicy hmacSha1Key:secretKey textData:baseNameBase64];
    NSString *token = [NSString stringWithFormat:@"%@:%@:%@",  accessKey, secretKeyBase64, baseNameBase64];

    return token;
}

+ (NSString *)marshal
{
    time_t deadline;
    time(&deadline);
    //"ceshi" 是我們七牛賬號(hào)下創(chuàng)建的儲(chǔ)存空間名字“可以自定義”
    NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    [dic setObject:@"ceshi" forKey:@"scope"];
    //3464706673 是token有效期
    NSNumber *escapeNumber = [NSNumber numberWithLongLong:3464706673];
    [dic setObject:escapeNumber forKey:@"deadline"];
    NSString *json = [QiniuAuthPolicy dictionryToJSONString:dic];
    return json;
}
  • 下載Demo

demo地址: QiNiuDemo

最后編輯于
?著作權(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)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 手頭項(xiàng)目用到了七牛圖床, 上傳會(huì)用到upload token. 七牛推薦我們從服務(wù)端獲取token, 沒給出在客戶...
    ice_backy閱讀 2,513評(píng)論 3 1
  • 原文地址:客戶端生成七牛上傳token 在使用七牛iOS SDK上傳圖片時(shí)需要用到上傳的token,雖然七牛建議t...
    宮城_閱讀 4,112評(píng)論 1 8
  • (http://www.cnblogs.com/HMJ-29/p/7148799.html)一、官方參考文檔:1....
    MJBaby閱讀 1,044評(píng)論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,659評(píng)論 19 139
  • 這算是之前面試前給的加試考題,隔天面試的時(shí)候帶稿去。 類似頭腦風(fēng)暴的思考后捕捉到靈感,擬定了文章形式。時(shí)間倉(cāng)促,寫...
    明石Akashi閱讀 203評(píng)論 0 1

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