2011-01-01 17 views
5

La mia domanda è molto simile this ma suppongo di dover fare un ulteriore passo avanti.Leggi OAuth2.0 Signed_Request Registrazione Facebook C# MVC

Facebook dice "I dati vengono passati all'applicazione come richiesta firmata. Il parametro signed_request è un modo semplice per assicurarsi che i dati che si stanno ricevendo siano i dati effettivi inviati da Facebook."

Dopo che un utente ha effettuato l'accesso al sito asp C# MVC e ha fatto clic su "Registra", l'URL di redirezione è http://site/account/register. A quel punto (il post per il controllo account/registro), vorrei raccogliere le informazioni dell'utente utilizzando la richiesta firmata in modo che io possa registrarle localmente con il mio sito. Non riesco a capire come accedere ai dati resi disponibili da Facebook.

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

Qual è l'equivalente in C#? Che tipo di variabile/dati sta passando Facebook nel post? E come accedo a "$ payload"?

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

     return View(model); 
    } 

risposta

8

Ecco il codice utilizzato in Facebook C# SDK. Non è necessario farlo manualmente se si utilizza il nostro SDK, ma se hai bisogno di farlo da soli qui è:

/// <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; 
} 

È possibile trovare il codice sorgente completo qui: http://facebooksdk.codeplex.com/SourceControl/changeset/view/f8109846cba5#Source%2fFacebook%2fFacebookApp.cs

+0

Grazie per la vostra risposta, Nathan. Sono stato a corto di tempo e non ho ancora avuto la possibilità di testare ancora, ma ciò che hai mostrato ha senso. Daremo un'occhiata anche all'SDK. – Josh

+0

Suppongo che ancora non capisco come implementare usando questo (o l'SDK). La request_request è stata inviata come post al redirect-uri nel codice di registrazione fb:? Sto utilizzando l'SDK di js per l'accesso/registrazione, ma poi cerco di utilizzare FacebookAPI a cui hai fatto riferimento per un'integrazione più profonda una volta gestita la roba dei membri. Penso che se riuscirò a superare questo punto, sarei bravo ... Sono solo bloccato. Sto costruendo un progetto MVC e sto provando a puntare la callback della registrazione su un gestore di post HTTP, ma poi ho bisogno di decodificare l'oggetto json che dovrebbe essere inviato da fb. Ma non ho niente da ridire. – Josh

+0

Nathan - posso chiedere un rapido follow-up ora che sto usando l'SDK - Vedo tutti i parametri della richiesta firmata tranne i parametri di "Registrazione". (es .: "registration": { "name": "Paul Tarjan" ... sto facendo qualcosa di sbagliato? Quando pubblico sulla pagina di test di Facebook li vedo, ma non sono disponibili dopo aver passato la decodifica dell'SDK . "e-mail": "[email protected]", "location": { "name": "San Francisco, California", "id": 114.952.118.516.947 }, – Josh

1

Sulla base di il tuo commento, sembra che tu stia ancora cercando la risposta che l'FB sta inviando. Credo che sia contenuto nella raccolta Form nell'oggetto HttpContext Request. Così dalla pagina si specifica come il reindirizzamento, si dovrebbe essere in grado di tirare da:

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

Speranza che aiuta a far luce. Sto ancora imparando mentre vado, quindi questa potrebbe non essere la soluzione migliore.

grazie, Jason

+0

Grazie, Jason. Sto lavorando a un progetto MVC, quindi HttpContext non è disponibile nell'ambiente del controller, ma ho capito come combinare le due risposte e farlo funzionare per lo più! L'uso di Facebook-SDK ha facilitato l'elaborazione della "richiesta firmata" restituita. – Josh

1

Ecco come farlo utilizzando Facebook SDK

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

non è aggiornato se si utilizza Facebook SDK v6. Ora è 'var fb = new FacebookClient(); dynamic signedRequest = fb.ParseSignedRequest ("app_secret", Request.Params ["sign_request"]); ' –

Problemi correlati