本地生成七牛token

由於某些原因 有時候需要本地生成token

原文 地址http://zeeyang.com/2016/06/13/Qiniu-token/?utm_source=tuicool&utm_medium=referral

這是代碼地址:provide simple interface to create token,upload file and upload files


 首先我們需要用到三個參數 scopeAccessKeySecretKey

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

AccessKeySecretKey 在個人面板 -> 個人中心 -> 密鑰管理裏面就能看到

接下來就可以創建token了,首先我們將上傳策略中的 scopedeadline 序列化成json格式,裏面的 liveTime 則是token的有效時間,可以以天爲單位 

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];

再對json序列化後的上傳策略進行URL安全的base64編碼

NSString *encodedString = [self urlSafeBase64Encode:jsonData];

QN_GTM_Base64 是七牛SDK提供給用戶用來處理base64和WebSafeBase64編碼的類,然後將裏面的 +/ 替換成 _

- (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對編碼後的上傳策略進行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拼接,中間用:分開,得到的就是上傳的token

NSString *token =
    [NSString stringWithFormat:@"%@:%@:%@", self.accessKey, encodedSignedString, encodedString];
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章