2011-09-13 14 views
6

मैं जावा सर्वलेट के डूपोस्ट के अंदर फेसबुक sign_request को पार्स करने की कोशिश कर रहा हूं। और मैं कॉमन्स-कोडेक-1.3 के बेस 64 का उपयोग कर हस्ताक्षरित अनुरोध को डीकोड करता हूं। यहाँ कोड है जो मैं करना चाहता हूँ प्रयोग किया जाता है इसके अंदर सर्वलेट का doPostजावा रिटर्न का उपयोग कर फेसबुक पर हस्ताक्षर किए गए हस्ताक्षर किए गए JSON

String signedRequest = (String) req.getParameter("signed_request"); 
String payload = signedRequest.split("[.]", 2)[1]; 
payload = payload.replace("-", "+").replace("_", "/").trim(); 
String jsonString = new String(Base64.decodeBase64(payload.getBytes())); 

जब मैं jsonString System.out यह विकृत है। कभी-कभी यह JSON के अंत } को याद करता है, कभी-कभी स्ट्रिंग के अंत में "} याद करता है।

मैं फेसबुक से उचित JSON प्रतिक्रिया कैसे प्राप्त कर सकता हूं?

उत्तर

7

फेसबुक यूआरएल के लिए बेस 64 का उपयोग कर रहा है और आप शायद मानक बेस 64 एल्गोरिदम का उपयोग करके टेक्स्ट को डीकोड करने का प्रयास कर रहे हैं। अन्य चीजों के साथ, यूआरएल संस्करण को "=" के साथ पैडिंग की आवश्यकता नहीं है।

  1. आप कोड (गद्दी, आदि) में आवश्यक पात्रों जोड़ सकता है
  2. आप कॉमन्स-कोडेक का उपयोग कर सकते 1.5 (नई Base64 (सही)) है, जहां वे इस एन्कोडिंग के लिए समर्थन जोड़ा गया।
+0

अपाचे कॉमन्स कोडेक के बारे में अधिक जानकारी यहां देखें http://commons.apache.org/proper/commons-codec/ –

1

मैंने जावा में कभी ऐसा नहीं किया है, इसलिए मेरे पास पूर्ण जवाब नहीं है, लेकिन तथ्य यह है कि आप कभी-कभी एक खो रहे हैं और कभी-कभी स्ट्रिंग के अंत से दो वर्ण बताते हैं कि यह बेस 64 पैडिंग के साथ एक समस्या हो सकती है। आप पेलोड के मूल्य को आउटपुट करना चाहते हैं और देख सकते हैं कि जब यह '=' के साथ समाप्त होता है तो jsonString '}' गायब है और जब पेलोड '==' के साथ समाप्त होता है तो jsonString अनुपलब्ध है '}}। अगर ऐसा लगता है मामला तो पेलोड के अंत में बराबर संकेतों की व्याख्या के साथ कुछ गलत हो रहा है, जो खाली बिट्स का प्रतिनिधित्व करने वाले हैं।

संपादित करें: आगे प्रतिबिंब पर मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि फेसबुक बेस 64 यूआरएल एन्कोडिंग का उपयोग कर रहा है (जो नहीं करता है नियमित = बेस के बजाय जोड़ें = पैड चार्स के रूप में), जबकि आपका डिकोडिंग फ़ंक्शन नियमित बेस 64 को पीछे की ओर = चार्स के साथ उम्मीद कर रहा है।

+0

जब मैं प्रिंट हस्ताक्षर_request यह पेलोड के अंत में कोई = या == नहीं दिखा रहा है। क्या इसका मतलब है कि मुझे गलत हस्ताक्षरित अनुरोध मिल रहा है। क्या फेसबुक एप सेटिंग्स के दौरान मैंने यूआरएल के कारण गलत होने का कोई मौका दिया है। – amadamala

+0

मुझे लगता है कि आपका जावा फ़ंक्शन इनपुट को उम्मीद कर रहा है कि इनपुट को = chars के साथ गद्देदार किया जाए, लेकिन फेसबुक उनका उपयोग नहीं कर रहा है। DecodeBase64 स्ट्रिंग के साथ अलग-अलग व्यवहार करते समय payload.getBytes() के बजाय सीधे पेलोड पास करने का प्रयास करें। फिर डीकोडबेस 64 को -_ या +/chars के प्रीपेन्स के आधार पर एन्कोडिंग को स्वत: पहचानने के लिए प्रतिस्थापित कॉल को छोड़ने का प्रयास करें। अगर यह सब विफल हो जाता है, तो आपको बेस 64 के यूआरएल संस्करण को समझने वाली एक और विधि मिलनी होगी, या मिस्चैच के आसपास काम करने के लिए या तो इनपुट या आउटपुट को झुकाएं (जो करने योग्य होना चाहिए क्योंकि यह केवल पिछले 1-2 वर्णों को प्रभावित करेगा)। –

+0

http: // qugstart देखें।com/blog/ruby-and-rails/facebook-base64-url-decode-for-sign_request/ – maximbr

1

मैंने इस कोड के समान कोड का उपयोग करके सामान्य-कोडेक-1.5 में अपग्रेड किया है और मुझे इसका अनुभव नहीं हो रहा है मुद्दा। क्या आपने पुष्टि की है कि ऑनलाइन लोड का उपयोग करके वास्तव में पेलोड खराब है सांकेतिक शब्दों में बदलनेवाला?

4

फेसबुक आपको "अनपढ़" बेस 64 मान (यूआरएल "मानक") भेज रहा है और यह जावा डिकोडर्स के लिए समस्याग्रस्त है जो इसकी अपेक्षा नहीं करते हैं। आप बता सकते हैं कि आप समस्या है जब Base64 इनकोडिंग डेटा है कि आप को डिकोड करने के लिए चाहते लंबाई है कि मैं इस समारोह के लिए इस्तेमाल किया मूल्यों को ठीक करने की 4.

एक गुणक नहीं है है:

public static String padBase64(String b64) { 
    String padding = ""; 
    // If you are a java developer, *this* is the critical bit.. FB expects 
    // the base64 decode to do this padding for you (as the PHP one 
    // apparently 
    // does... 
    switch (b64.length() % 4) { 
    case 0: 
     break; 
    case 1: 
     padding = "==="; 
     break; 
    case 2: 
     padding = "=="; 
     break; 
    default: 
     padding = "="; 
    } 
    return b64 + padding; 

} 
+0

ऐसा किया गया मेरे लिए चाल धन्यवाद! – Ben

+0

मुझे भी। आपका बहुत बहुत धन्यवाद। –

संबंधित मुद्दे