原文地址:客戶(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
、AccessKey
和SecretKey
scope
其實(shí)就是資源存放的文件夾名字,例如下圖的cmxj
AccessKey
和SecretKey
在個(gè)人面板 -> 個(gè)人中心 -> 密鑰管理里面就能看到
接下來(lái)就可以創(chuàng)建token了,首先我們將上傳策略中的scope
和deadline
序列化成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;
}
最后將accessKey
、encodedSignedString
和encodedString
拼接,中間用:
分開(kāi),得到的就是上傳的token
NSString *token = [NSString stringWithFormat:@"%@:%@:%@", self.accessKey, encodedSignedString, encodedString];