#ios #objective-c #rest #quickblox #hmacsha1
#iOS #objective-c #rest #quickblox #hmacsha1
Вопрос:
Это может быть повторяющийся вопрос, но я ничего не могу найти о том, что в нем не так, я пытался сгенерировать сеанс через rest API QuickBlox, на это ушло 5 дней, но я не могу его завершить. Пожалуйста, помогите мне
Настройка тела
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(amp;hmacContext, kCCHmacAlgSHA1, secretData.bytes, secretData.length);
CCHmacUpdate(amp;hmacContext, clearTextData.bytes, clearTextData.length);
CCHmacFinal(amp;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;
}
Генерация URL-запроса
requestURL = [requestURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url=[NSURL URLWithString:requestURL];
NSString *postLength=@"";
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"
);
};
}
Пожалуйста, изучите это и дайте мне знать, что я делаю неправильно
Комментарии:
1. вы решили свою проблему? если да, то можете ли вы опубликовать решение, поскольку у меня такая же проблема.
Ответ №1:
Та же проблема, с которой я столкнулся. Я пытался решить эту проблему, пожалуйста, попробуйте выполнить следующий шаг
-
Удалить
модуль ‘QuickBlox’ -
Переустановите файл Quickblox pod, для этого потребуется последняя платформа и проекты перестройки,
Вы увидите волшебство этой проблемы, решив 🙂 Пожалуйста, дайте мне знать, что вышеуказанные шаги сработали для вас?
Спасибо
Ответ №2:
Насколько я понимаю, проблема в этой строке
NSString *signature = [self generateSignatureWithText:dataVal andKey:_pAuthorizationKey];
вы используете ключ аутентификации для создания подписи, но вы должны передать здесь секретный ключ
итак, попробуйте заменить _pAuthorizationKey секретным ключом
Комментарии:
1. Спасибо @Igor Khomenko, я протестирую ее и скоро обновлю здесь
2. я только что обнаружил, что вы являетесь разработчиком в quickblox. я пытаюсь реализовать видеочат в своем приложении. но не удается получить действительную подпись. можете ли вы помочь мне, как получить действительную signature.in этот вопрос, я не могу понять, что
dataval
передается в методе. пожалуйста, помогите, если это возможно3. @Igor что такое dataVal? Что здесь нужно сделать?