在iOS中与REST API进行会话时QuickBlox“Unexpected Signature”错误

问题描述:

这可能是一个重复的问题,但我找不到任何有关它的问题,我一直试图通过QuickBlox的rest API生成会话,它已经消耗了5天,但我无法完成。请帮我出在iOS中与REST API进行会话时QuickBlox“Unexpected Signature”错误

定身

NSString *strNonceValue = [NSString stringWithFormat:@"%d", arc4random() % 1000000]; 
    NSString *timeStampValue = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]]; 

NSMutableDictionary *dictSessionInfo = [[NSMutableDictionary alloc] initWithObjectsAndKeys: 
              applicationID, @"application_id", 
              _pAuthorizationKey, @"auth_key", 
              timeStampValue, @"timestamp", 
              strNonceValue, @"nonce", nil]; 

NSString *signature = [self generateSignatureWithText:dataVal andKey:_pAuthorizationKey]; 

[dictSessionInfo setObject:signature forKey:@"signature"]; 

NSData *data = [NSJSONSerialization dataWithJSONObject:dictSessionInfo options:NSJSONWritingPrettyPrinted error:nil]; 
NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

获取签名

- (NSString *)generateSignatureWithText:(NSData *)data andKey:(NSString *)secret { 

    NSData *secretData = [secret dataUsingEncoding:NSUTF8StringEncoding]; 
    NSData *clearTextData = data; 
    uint8_t digest[CC_SHA1_DIGEST_LENGTH] = {0}; 
    CCHmacContext hmacContext; 
    CCHmacInit(&hmacContext, kCCHmacAlgSHA1, secretData.bytes, secretData.length); 
    CCHmacUpdate(&hmacContext, clearTextData.bytes, clearTextData.length); 
    CCHmacFinal(&hmacContext, digest); 
    NSData *result = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH]; 
    NSString *hash = [result description]; 
    hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""]; 
    hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""]; 

    return hash; 
} 

生成的URLRequest

requestURL = [requestURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSURL *url=[NSURL URLWithString:requestURL]; 
NSString *[email protected]""; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
[request setTimeoutInterval:60]; 
[request setURL:url]; 
NSLog(@"HTTP body Fields : %@", combinedDataStr); 
if([requestType isEqualToString:@"POST"]) { 
    NSData *postData = [combinedDataStr dataUsingEncoding:NSASCIIStringEncoding 
            allowLossyConversion:YES]; 
    postLength = [NSString stringWithFormat:@"%ld", (unsigned long)[postData length]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setHTTPBody:postData]; 
} 
else 
    [request setHTTPMethod:@"GET"]; 

[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
[request setValue:@"0.1.0"   forHTTPHeaderField:@"QuickBlox-REST-API-Version"]; 

我收到的反应是:

response dict : { 
    errors =  { 
     base =   (
      "Unexpected signature" 
     ); 
    }; 
} 

请看看这个,让我知道我做错了什么

+0

你解决了你的问题吗?如果是的话,你可以发布解决方案,因为我有同样的问题。 –

据我了解,问题是这一行

NSString *signature = [self generateSignatureWithText:dataVal andKey:_pAuthorizationKey]; 

您使用身份验证密钥来创建签名,但你应该通过这里密钥

所以,尝试用密钥替换_pAuthorizationKey

+0

谢谢@Igor Khomenko,我会测试它,并且很快就会在这里更新 – channi

+1

我刚刚发现你是quickblox.a的开发人员,我试图在我的应用中实现视频聊天。但无法得到有效的签名。您可以帮助我如何获得有效的签名。在这个问题上,我不能不知道在方法中传递了什么'dataval'。如果可能,请尽可能地提供帮助 –

+0

@Igor什么是dataVal?这里需要做什么? – user3344977