2011-01-01 12 views
5

मेरा प्रश्न बहुत समान है this लेकिन मुझे लगता है कि मुझे इसे एक कदम आगे ले जाने की आवश्यकता है।ओएथ 2.0 पढ़ें Signed_Request फेसबुक पंजीकरण सी # एमवीसी

फेसबुक कहता है "डेटा आपके आवेदन पर एक हस्ताक्षरित अनुरोध के रूप में पास हो गया है। हस्ताक्षर किए गए_रेक्वेस्ट पैरामीटर यह सुनिश्चित करने का एक आसान तरीका है कि आप जो डेटा प्राप्त कर रहे हैं वह फेसबुक द्वारा भेजा गया वास्तविक डेटा है।"

उपयोगकर्ता ने मेरे एएसपी सी # एमवीसी साइट में लॉग इन करने के बाद और "रजिस्टर" पर क्लिक किया है, तो रीडायरेक्ट-यूआरएल http://site/account/register है। उस बिंदु पर (खाता/रजिस्टर नियंत्रण पर पोस्ट), मैं हस्ताक्षरित अनुरोध का उपयोग कर उपयोगकर्ता की जानकारी एकत्र करना चाहता हूं ताकि मैं उन्हें स्थानीय रूप से अपनी साइट के साथ पंजीकृत कर सकूं। मैं यह नहीं समझ सकता कि डेटा फेसबुक का उपयोग कैसे किया जा सकता है।

$data = json_decode(base64_url_decode($payload), true); 

सी # के बराबर क्या है? पोस्ट में फेसबुक किस प्रकार का चर/डेटा गुज़र रहा है? और मैं "$ पेलोड" कैसे प्राप्त करूं?

[HttpPost] 
    public ActionResult RegisterFacebook(RegisterFacebookModel model) 
    { 
     Facebook.FacebookSignedRequest sr = Facebook.FacebookSignedRequest.Parse("secret", model.signed_request); 

     return View(model); 
    } 

उत्तर

8

यहां कोड है जिसे हम फेसबुक सी # एसडीके में इस्तेमाल करते हैं। आप इस मैन्युअल रूप से करने के लिए यदि आप हमारे SDK का उपयोग की जरूरत नहीं है, लेकिन अगर आप इसे खुद करने के लिए यहाँ की जरूरत है:

/// <summary> 
/// Parses the signed request string. 
/// </summary> 
/// <param name="signedRequestValue">The encoded signed request value.</param> 
/// <returns>The valid signed request.</returns> 
internal protected FacebookSignedRequest ParseSignedRequest(string signedRequestValue) 
{ 
    Contract.Requires(!String.IsNullOrEmpty(signedRequestValue)); 
    Contract.Requires(signedRequestValue.Contains("."), Properties.Resources.InvalidSignedRequest); 

    string[] parts = signedRequestValue.Split('.'); 
    var encodedValue = parts[0]; 
    if (String.IsNullOrEmpty(encodedValue)) 
    { 
     throw new InvalidOperationException(Properties.Resources.InvalidSignedRequest); 
    } 

    var sig = Base64UrlDecode(encodedValue); 
    var payload = parts[1]; 

    using (var cryto = new System.Security.Cryptography.HMACSHA256(Encoding.UTF8.GetBytes(this.AppSecret))) 
    { 
     var hash = Convert.ToBase64String(cryto.ComputeHash(Encoding.UTF8.GetBytes(payload))); 
     var hashDecoded = Base64UrlDecode(hash); 
     if (hashDecoded != sig) 
     { 
      return null; 
     } 
    } 

    var payloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(Base64UrlDecode(payload))); 
    var data = (IDictionary<string, object>)JsonSerializer.DeserializeObject(payloadJson); 
    var signedRequest = new FacebookSignedRequest(); 
    foreach (var keyValue in data) 
    { 
     signedRequest.Dictionary.Add(keyValue.Key, keyValue.Value.ToString()); 
    } 

    return signedRequest; 
} 

/// <summary> 
/// Converts the base 64 url encoded string to standard base 64 encoding. 
/// </summary> 
/// <param name="encodedValue">The encoded value.</param> 
/// <returns>The base 64 string.</returns> 
private static string Base64UrlDecode(string encodedValue) 
{ 
    Contract.Requires(!String.IsNullOrEmpty(encodedValue)); 

    encodedValue = encodedValue.Replace('+', '-').Replace('/', '_').Trim(); 
    int pad = encodedValue.Length % 4; 
    if (pad > 0) 
    { 
     pad = 4 - pad; 
    } 

    encodedValue = encodedValue.PadRight(encodedValue.Length + pad, '='); 
    return encodedValue; 
} 

आप यहाँ पूर्ण स्रोत कोड प्राप्त कर सकते हैं: http://facebooksdk.codeplex.com/SourceControl/changeset/view/f8109846cba5#Source%2fFacebook%2fFacebookApp.cs

+0

आपकी प्रतिक्रिया, नाथन के लिए धन्यवाद यह करने के लिए है। मैं समय से कम रहा हूं और अभी तक परीक्षण करने का मौका नहीं मिला है, लेकिन जो आपने दिखाया वह समझ में आता है। मैं एसडीके पर भी एक नज़र डालेगा। – Josh

+0

मुझे लगता है कि मुझे अभी भी यह समझ में नहीं आता है कि इसका उपयोग कैसे करें (या एसडीके)। क्या हस्ताक्षरित_रेक्वेस्ट को एफबी में रीडायरेक्ट-यूरी में पोस्ट के रूप में भेजा गया है: पंजीकरण कोड? मैं लॉगिन/पंजीकरण के लिए जेएस एसडीके का उपयोग कर रहा हूं, लेकिन फिर सदस्यता सामग्री को संभालने के बाद फेसबुक एपीआई का उपयोग करने की कोशिश कर रहा हूं जिसे आपने गहन एकीकरण के लिए संदर्भित किया है। मुझे लगता है कि अगर मैं इस बिंदु से पिछला हो सकता हूं, तो मैं अच्छा होगा ... मैं बस लटका हुआ हूं। मैं एक एमवीसी प्रोजेक्ट का निर्माण कर रहा हूं और एक http पोस्ट हैंडलर पर पंजीकरण कॉलबैक को इंगित करने का प्रयास कर रहा हूं, लेकिन उसके बाद जेएसबी ऑब्जेक्ट को डीकोड करने की आवश्यकता है जिसे एफबी भेजना है। लेकिन मुझे कुछ भी वापस नहीं मिला है। – Josh

+0

नाथन - क्या मैं अब एक त्वरित अनुवर्ती पूछ सकता हूं कि मैं एसडीके का उपयोग कर रहा हूं - मैं "पंजीकरण" पैरामीटर को छोड़कर हस्ताक्षरित_रेक्वेस्ट के सभी पैरामीटर देखता हूं। (यानी: "पंजीकरण": { "नाम": "पॉल तारजन" ... क्या मैं कुछ गलत कर रहा हूं? जब मैं फेसबुक टेस्ट पेज पर पोस्ट करता हूं तो मैं उन्हें देखता हूं, लेकिन वे एसडीके डीकोड के माध्यम से जाने के बाद उपलब्ध नहीं हैं । "ईमेल": "[email protected]", "स्थान" { "नाम": "सैन फ्रांसिस्को, कैलिफोर्निया", "id": 114952118516947 }, – Josh

1

के आधार पर आपकी टिप्पणी, ऐसा लगता है कि आप अभी भी उस प्रतिक्रिया की तलाश में हैं जो एफबी भेज रहा है। मुझे विश्वास है कि यह HttpContext अनुरोध ऑब्जेक्ट में फ़ॉर्म संग्रह में निहित है। तो पेज आप रीडायरेक्ट के रूप में निर्दिष्ट से, आप से यह खींचने के लिए सक्षम होना चाहिए:

HttpContext.Current.Request.Form ("signed_request")

आशा में मदद करता है कि कुछ प्रकाश डाला। मैं अभी भी सीख रहा हूं क्योंकि मैं जाता हूं इसलिए यह सबसे अच्छा समाधान नहीं हो सकता है।

धन्यवाद, जेसन

+0

धन्यवाद, जेसन। मैं एक एमवीसी प्रोजेक्ट पर काम कर रहा हूं, इसलिए एचटीपी कॉन्टेक्स्ट नियंत्रक पर्यावरण में उपलब्ध नहीं है, लेकिन मुझे पता चला कि दो उत्तरों को कैसे जोड़ना है और इसे अधिकतर काम करना है! फेसबुक-एसडीके का उपयोग करके लौटा "हस्ताक्षर_request" को संसाधित करना आसान बना दिया। – Josh

1

यहाँ कैसे का उपयोग कर Facebook SDK

var parsedSignedRequest = FacebookSignedRequest.Parse(FacebookApplication.Current, signed_request); 
+4

यदि आप फेसबुक एसडीके v6 का उपयोग कर रहे हैं तो यह पुराना है। अब यह 'var fb = new FacebookClient() है; गतिशील हस्ताक्षर Request = fb.ParseSignedRequest ("app_secret", Request.Params ["sign_request"]); ' –

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