融雲SDK:獲取用戶Token的方法


  融雲SDK查看ServerAPI里面有個獲取Token的方法,本以為只要傳三個參數就可以。后來發現,在請求頭有幾個必須要傳的參數,否則服務器返回401(未授權)。拿獲取Token接口為例子

  

  如圖所示,請求頭中包含 : App-Key(應用appkey), Nonce(隨機數,不限長度),Timestamp(時間戳from1970),Signature(簽名)。簽名生成的方法 就是 sha1(appsecret+Nonce+Timestamp) 只有這幾個請求頭的值都正確了,接口才能正確返回Token。(至於什么是sha1加密,又稱安全哈希算法,大家自行谷歌。。。)代碼如下:

#import <CommonCrypto/CommonCrypto.h>

@implementation MSTool
single_implementation(MSTool)

//獲取隨機數
-(NSString *)getRandomNonce
{
    NSInteger randomValue = [self getRandomNumber:100000 to:999999];
    return  [NSString stringWithFormat:@"%ld",randomValue];
}
//獲取時間戳 從1970年
-(NSString *)getTimestamp
{
    NSDate *date = [NSDate date];
    NSTimeInterval times =  [date timeIntervalSince1970];
    return [NSString stringWithFormat:@"%.0f",times];
}

//獲取從 from 到  to 的隨機數
-(NSInteger)getRandomNumber:(NSInteger)from to:(NSInteger)to
{
    return (NSInteger)(from + (arc4random() % (to - from + 1)));
}

//sha1 加密
-(NSString *)sha1WithKey:(NSString *)key
{
        const char *cstr = [key cStringUsingEncoding:NSUTF8StringEncoding];
        NSData *data = [NSData dataWithBytes:cstr length:key.length];
        
        uint8_t digest[CC_SHA1_DIGEST_LENGTH];
        
        CC_SHA1(data.bytes, data.length, digest);
        
        NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
        
        for(int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {
            [output appendFormat:@"%02x", digest[i]];
        }
        
        return output;
}

//根據appSecret nonce timestamp 獲取signature
-(NSString *)getSignatureWithAppSecret:(NSString *)appSecret nonce:(NSString *)nonce timestamp:(NSString *)timestamp
{
    NSString *sha1String = [NSString stringWithFormat:@"%@%@%@",appKey,nonce,timestamp];
    return [self sha1WithKey:sha1String];
}
@end

那么這些參數都有了,服務請求我用的AFN,和其他請求的區別就是設置一下請求頭而已,代碼如下:

     //獲取Token的接口
   url = @"https://api.cn.ronghub.com/user/getToken.json"; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.requestSerializer = [AFHTTPRequestSerializer serializer]; NSDictionary *dict = @{@"userId":@"1",@"name":@"panzi",@"portraiUri":@"http://qlogo3.store.qq.com/qzone/645857874/645857874/100?1440900705"}; NSString *appkey = kMSChatAppKey; NSString *nonce = [[MSTool sharedMSTool] getRandomNonce]; NSString *timestamp = [[MSTool sharedMSTool] getTimestamp]; NSString *signature = [[MSTool sharedMSTool]getSignatureWithAppSecret:kMSChatAppSecret nonce:nonce timestamp:timestamp]; NSLog(@"%@",appkey); NSLog(@"%@",nonce); NSLog(@"%@",timestamp); NSLog(@"%@",signature);  //設置請求頭 [manager.requestSerializer setValue:appkey forHTTPHeaderField:@"App-Key"]; [manager.requestSerializer setValue:nonce forHTTPHeaderField:@"Nonce"]; [manager.requestSerializer setValue:timestamp forHTTPHeaderField:@"Timestamp"]; [manager.requestSerializer setValue:signature forHTTPHeaderField:@"Signature"];
  //調用POST方法 [manager POST:url parameters:dict progress:nil success:
^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"%@",responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"%@",error); }];

看看,其實也不是很難啦,根據這個DEMO在稍微封裝一下,就可以支持這種需要Header參數驗證的接口了。融雲還有好多東西,繼續看~~

 

附:swift 獲取token方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM