Вопрос по ios, facebook, iphone, objective-c – Facebook подписал запрос на iOS (HMAC SHA256)

4

Я уже несколько недель пытаюсь сгенерировать подписанный запрос HMAC SHA256 для Facebook на iOS. Я отчаянно нуждаюсь в помощи.

Подписанные запросы Facebook состоят из двух частей, разделенных точкой. Первая часть - это HMAC256 полезной нагрузки, а вторая часть - строка полезной нагрузки в кодировке Base64. Я смог воссоздать только вторую часть.

vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsIjAiOiJwYXlsb2FkIn0

Я использовал следующий код, который используют все, но он генерирует другой хеш:

#import <CommonCrypto/CommonHMAC.h>
#import "NSData+Base64.h"

+(NSString*) hmacForSecret:(NSString*)secret data:(NSString*)data {

     const char *cKey  = [secret cStringUsingEncoding:NSASCIIStringEncoding];
     const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];
     unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];

     CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
     NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];

     return [HMAC base64EncodedString];
}

Согласно документам Facebook: https://developers.facebook.com/docs/authentication/signed_request/

Правильный вывод HMAC256 должен быть при использовании & quot;secret& Quot; в качестве ключа:

 vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso

Полезная нагрузка для кодирования:

 {
     "algorithm": "HMAC-SHA256",
     "0": "payload"
 }

ПРИМЕЧАНИЕ. Вы можете Base64 декодировать 2-ю часть подписанного запроса, чтобы получить эту полезную нагрузку.

@Tjirp не включен в iOS SDK. Вы должны создать это самостоятельно. Вот как вы бы это создали:developers.facebook.com/docs/authentication/signed_request Jay Q.
Где вы получили подписанный запрос? Я не могу найти его из Facebook iOS SDK Tjirp

Ваш Ответ

1   ответ
3

se64Url, см .: http://en.wikipedia.org/wiki/Base64#URL_applications

Вот модифицированный метод категории base64EncodedString:

//NSData+Base64.h
 - (NSString *)base64EncodedString
 {
    size_t outputLength;

    char *outputBuffer = NewBase64Encode([self bytes], [self length], true, &outputLength);
    NSString *result = [[[NSString alloc] initWithBytes:outputBuffer length:outputLength encoding:NSASCIIStringEncoding] autorelease];
    free(outputBuffer);

     NSString *b64PayloadClean = [[result componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]] componentsJoinedByString:@""];

     //do URL encoding by replacing "+" and "/" to "-" and "_" respectively
     b64PayloadClean = [b64PayloadClean stringByReplacingOccurrencesOfString:@"=" withString:@""];
     b64PayloadClean = [b64PayloadClean stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
     b64PayloadClean = [b64PayloadClean stringByReplacingOccurrencesOfString:@"/" withString:@"_"];

    return b64PayloadClean;
 }

Похожие вопросы