客戶(hù)端生成七牛上傳token

原文地址:客戶(hù)端生成七牛上傳token

在使用七牛iOS SDK上傳圖片時(shí)需要用到上傳的token,雖然七牛建議token不要在客戶(hù)端生成,這樣做是不安全的,但是我們還是需要了解下客戶(hù)端是如何生成token的

我簡(jiǎn)單地對(duì)生成token和上傳數(shù)據(jù)做了封裝,這是代碼地址:provide simple interface to create token,upload file and upload files

首先我們需要用到三個(gè)參數(shù)scope、AccessKeySecretKey

scope其實(shí)就是資源存放的文件夾名字,例如下圖的cmxj

AccessKeySecretKey在個(gè)人面板 -> 個(gè)人中心 -> 密鑰管理里面就能看到

接下來(lái)就可以創(chuàng)建token了,首先我們將上傳策略中的scopedeadline序列化成json格式,里面的liveTime則是token的有效時(shí)間,可以以天為單位

NSMutableDictionary *authInfo = [NSMutableDictionary dictionary];

[authInfo setObject:self.scope forKey:@"scope"];
[authInfo
setObject:[NSNumber numberWithLong:[[NSDate date] timeIntervalSince1970] + self.liveTime * 24 * 3600]
   forKey:@"deadline"];
?
NSData *jsonData =
[NSJSONSerialization dataWithJSONObject:authInfo options:NSJSONWritingPrettyPrinted error:nil];

再對(duì)json序列化后的上傳策略進(jìn)行URL安全的base64編碼

NSString *encodedString = [self urlSafeBase64Encode:jsonData];

QN_GTM_Base64是七牛SDK提供給用戶(hù)用來(lái)處理base64和WebSafeBase64編碼的類(lèi),然后將里面的+/替換成_

- (NSString *)urlSafeBase64Encode:(NSData *)text {

   NSString *base64 =
   [[NSString alloc] initWithData:[QN_GTM_Base64 encodeData:text] encoding:NSUTF8StringEncoding];
   base64 = [base64 stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
   base64 = [base64 stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
   return base64;
}

然后用secretKey對(duì)編碼后的上傳策略進(jìn)行HMAC-SHA1加密,并且做安全的base64編碼,得到encoded_signed

NSString *encodedSignedString = [self HMACSHA1:self.secretKey text:encodedString];

- (NSString *)HMACSHA1:(NSString *)key text:(NSString *)text {

   const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
   const char *cData = [text cStringUsingEncoding:NSUTF8StringEncoding];
?
   char 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 = [self urlSafeBase64Encode:HMAC];
   return hash;
}

最后將accessKeyencodedSignedStringencodedString拼接,中間用分開(kāi),得到的就是上傳的token

NSString *token = [NSString stringWithFormat:@"%@:%@:%@", self.accessKey, encodedSignedString, encodedString];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容