2013-12-13 18 views
10

Facebook richiede che creo un appsecret_proof: https://developers.facebook.com/docs/graph-api/securing-requestsC# aiuto necessario per la creazione di Facebook AppSecret_Proof HMACSHA256

E ho fatto questo utilizzando il seguente codice:

public string FaceBookSecret(string content, string key) 
{ 
     var encoding = new System.Text.ASCIIEncoding(); 
     byte[] keyByte = encoding.GetBytes(key); 
     byte[] messageBytes = encoding.GetBytes(content); 
     using (var hmacsha256 = new HMACSHA256(keyByte)) 
     { 
      byte[] hashmessage = hmacsha256.ComputeHash(messageBytes); 
      return Convert.ToBase64String(hashmessage); 
     } 
} 

Tutto sembra bene per me, comunque facebook dice che appecret_proof non è valido. Ho effettuato l'accesso, posso fare tutto normalmente quando rimuovo la chiave. Quindi, per risparmiare un po 'di tempo:

  • Sì sto postando l'URL corretto
  • Sì sto passando una valida access_token
  • Sì sto usando lo stesso access_token nella dimostrazione, come io sono nella richiesta
  • Sì mio appsecret va bene, e funziona

esempio nell'uso

dynamic results = client.Post("/" + model.PostAsId + "/feed", new { message = model.Message, appsecret_proof = FaceBookSecret(postAs.AuthToken, AppSecret) }); 

Penso che probabilmente abbia qualcosa a che fare con la codifica o qualcosa del genere, ma per essere onesti, non lo so.

Sono anche utilizzando il Facebook SDK .NET tuttavia questo non ha molto nella documentazione, e non sembra colpire su qualche cosa a che fare con l'automazione, le operazioni lato server ecc

Grazie

+0

si può mostrare più codice si prega di - come si fa a creare 'Client'? Sei sicuro di utilizzare la stessa app.Id sia per hash che per richiesta? Inoltre, prova 'Encoding.UTF8.GetBytes' nel caso in cui - potrebbe essere che farà il trucco ... – avs099

+0

Ho avuto lo stesso problema e risolto per le API di facebook v2.4 qui: http://stackoverflow.com/questions/31932675/how-to-send-appsecret-proof-using-facebook-c-sharp-sdk/31933544 # 31933544 – Yovav

risposta

1

Il il segreto dell'app è una stringa in base 16, quindi è necessario convertirlo in un array di byte. Dai un'occhiata a How can I convert a hex string to a byte array? per i dettagli su come farlo. L'access_token deve essere convertito in un array di byte utilizzando la codifica ASCII. Una volta generato HMAC, codificalo come una stringa base-16 da utilizzare come appecret_proof. Il seguente codice convertirà un array di byte in base16.

public static class Base16 
{ 
    private static readonly char[] encoding; 

    static Base16() 
    { 
     encoding = new char[16] 
     { 
      '0', '1', '2', '3', '4', '5', '6', '7', 
      '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' 
     }; 
    } 

    public static string Encode(byte[] data) 
    { 
     char[] text = new char[data.Length * 2]; 

     for (int i = 0, j = 0; i < data.Length; i++) 
     { 
      text[j++] = encoding[data[i] >> 4]; 
      text[j++] = encoding[data[i] & 0xf]; 
     } 

     return new string(text); 
    } 

Il codice per generare l'appsecret_proof sarebbe poi

private string GenerateAppSecretProof(string accessToken, string appSecret) 
{ 
    byte[] key = Base16.Decode(appSecret); 
    byte[] hash; 
    using (HMAC hmacAlg = new HMACSHA1(key)) 
    { 
     hash = hmacAlg.ComputeHash(Encoding.ASCII.GetBytes(accessToken)); 
    } 
    return Base16.Encode(hash); 
} 

Facebook sembra accettare sia uno SHA256 HMAC o SHA1 HMAC.

+0

nice one, grazie – davethecoder

+0

Questa risposta manca l'implementazione Base16.Decode. Dovremmo capire tutto questo per noi stessi? Mi stupisce che questa sia la risposta accettata al posto di quella data da Eric Kassan che è completa, corretta e funziona senza troppi problemi. – MoSs

+0

Non ho incluso il codice per Base16.Decode perché ci sono molte soluzioni a questo già nella domanda che ho collegato a (e il duplicato associato). http: // stackoverflow.it/questions/321370/convert-hex-string-to-byte-array http://stackoverflow.com/questions/311165/how-do-you-convert-byte-array-to-hexadecimal-string-and -vice-versa La soluzione di Eric Kassan è interessante a sé stante perché ha appena usato UTF8.GetBytes per decodificare l'appSecret. Ciò implicherebbe che Facebook convalidi le appecret_proof con più variazioni dell'algoritmo. – Steve

13

Ho usato il seguito con successo con Facebook

using System.Security.Cryptography; 
using System.Text; 

internal static string FaceBookSecret(string content, string key) 
{ 
    byte[] keyBytes = Encoding.UTF8.GetBytes(key); 
    byte[] messageBytes = Encoding.UTF8.GetBytes(content); 
    byte[] hash; 
    using (HMACSHA256 hmacsha256 = new HMACSHA256(keyBytes)) 
    { 
     hash = hmacsha256.ComputeHash(messageBytes); 
    } 

    StringBuilder sbHash = new StringBuilder(); 
    for (int i = 0; i < hash.Length; i++) 
    { 
     sbHash.Append(hash[i].ToString("x2")); 
    } 
    return sbHash.ToString(); 
} 
Problemi correlati