2011-08-14 9 views
0

Objective-Cでの署名付きリクエストのデコード方法を教えてください。Objective-C:署名付きリクエストのデコード

基本的に、このRubyコードをObjective-CまたはCに変換するにはどうすればよいですか?

# Facebook sends a signed_requests to authenticate certain requests. 
# http://developers.facebook.com/docs/authentication/signed_request/ 
def decode_signed_request(signed_request) 
    encoded_signature, encoded_data = signed_request.split('.') 
    signature = base64_url_decode(encoded_signature) 
    expected_signature = OpenSSL::HMAC.digest('sha256', @secret, encoded_data) 
    if signature == expected_signature 
    JSON.parse base64_url_decode(encoded_data) 
    end 
rescue Exception => e 
    puts $!, [email protected] 
end 

def base64_url_decode(string) 
    "#{string}==".tr("-_", "+/").unpack("m")[0] 
end 

SSToolKit Base64 decode NSStringが役に立ちます。

答えて

1

データの署名を検証したいのですか、それとも単に「復号化」しますか?それは後者だ場合、あなただけの署名を無視することができます。

NSString *signedData = ...; 
NSString *base64EncodedData = [[signedData componentsSeparatedByString:@"."] objectAtIndex:1]; 
NSString *jsonString = [NSString stringWithBase64String:base64EncodedData]; 
id jsonObject = ...; 

を私はあなた次第(私はJSONKitをお勧めします)FacebookのSDKを使用して、適切なJSONフレームワークを選択しておきます。

あなたのコメントは、メッセージに含まれているHMACを確認することを示しています。その場合:

unsigned int length = 0; 
unsigned char *expectedHmac = HMAC(EVP_sha256(), [key bytes], [key length], [base64EncodedData UTF8String], [base64EncodedData length], NULL, &length); 
NSData *expectedHmacData = [NSData dataWithBytes:expectedHmac length:length]; 
// compare expected hmac 
+0

また、データの署名も確認したいと考えています。しかしこれは良いスタートです。ありがとう! – ma11hew28

+0

私はそれを反映するために私の答えを更新しました。うまくいけば、それはもっと役に立ちました:) –

関連する問題