2010-06-26 13 views
9

Sto tentando di impostare alcune azioni API di Google Maps Premier e, per farlo, devo firmare i miei URL per l'autenticazione. Se si passa agli esempi di firma, vi sono alcuni codici Python, C# e Java per mostrare come eseguire la firma tramite HMAC-SHA1. C'è anche un esempio in modo che io possa testare la mia implementazione PHP. Tuttavia, proprio non riesco a farlo funzionare.Cercando di firmare digitalmente tramite HMAC-SHA1 con PHP

Ecco il mio codice:

$key = "vNIXE0xscrmjlyV-12Nj_BvUPaw="; 

$data = "/maps/api/geocode/json?address=New+York&sensor=false&client=clientID"; 

$my_sign = hash_hmac("sha1", $data, base64_decode($key)); 
$my_sign = base64_encode($my_sign); 

$valid_sign = "KrU1TzVQM7Ur0i8i7K3huiw3MsA="; 

Quando, corro questo, ho una firma:

ZDRlNGMwZjIyMTA1MWM1Zjk0Nzc4M2NkYjlmNDQzNDBkYzk4NDI4Zg== 

Quali totalmente non corrisponde.

Le cose che ho pensato:

  1. La chiave è nel formato URL codificato modificata, in modo da cambiare - e _-+ e / anche non funziona
  2. Il Python codice di esempio fa davvero il lavoro, quindi questo è un esempio valido.
  3. Riscrivere completamente la nostra base di codice in python anziché in PHP (l'ho ereditata).

risposta

20

Hai 2 problemi almeno,

  1. Il Google utilizza speciale sicuro per le URL Base64. Il normale base64_decode non funziona.
  2. È necessario generare SHA1 in binario.

Prova questo,

$key = "vNIXE0xscrmjlyV-12Nj_BvUPaw="; 
$data = "/maps/api/geocode/json?address=New+York&sensor=false&client=clientID"; 
$my_sign = hash_hmac("sha1", $data, base64_decode(strtr($key, '-_', '+/')), true); 
$my_sign = strtr(base64_encode($my_sign), '+/', '-_'); 
+0

Il codice ha funzionato. Giuro che ho provato a commutare questi due personaggi manualmente e ancora non riuscivo a vedere il risultato corretto. Forse non era corretto però. In ogni caso, grazie per il vostro aiuto! :) – Conradaroma

+4

@ZZCoder Il tuo esempio è stato utile ancora oggi - grazie per averlo scritto; la firma delle richieste del bucket Amazon S3 è molto simile. '$ signature = rawurlencode (base64_encode (hash_hmac (" sha1 ", $ stringToSign, $ secret_access_key, true)))' –

+0

Il suggerimento di Geek Stocks per gli upload S3 funziona quando non si utilizza la funzione rawurlencode. Questa soluzione di upload ha buone informazioni S3/PHP che possono essere utilizzate senza mai usare la loro libreria: http://www.plupload.com/docs/v2/Upload-to-Amazon-S3 – Exit

Problemi correlati