2010-06-26 6 views
9

Я пытаюсь настроить некоторые действия API Google Maps Premier API, и для этого мне нужно подписать мои URL-адреса для аутентификации. Если вы переходите к примерам подписи, есть код Python, C# и Java, чтобы показать вам, как сделать подпись через HMAC-SHA1. Также есть пример, чтобы я мог проверить свою реализацию PHP. Однако я просто не могу заставить его работать.Пытается подписать цифровую подпись через HMAC-SHA1 с PHP

Вот мой код:

$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="; 

Когда я запускаю это, я получаю подпись:

ZDRlNGMwZjIyMTA1MWM1Zjk0Nzc4M2NkYjlmNDQzNDBkYzk4NDI4Zg== 

Что совершенно не соответствует.

Что я думал о:

  1. Ключ в Modified URL формата кодировки, поэтому изменение - и _ к + и / также не работает
  2. Питон пример кода действительно работает, поэтому это допустимый пример.
  3. Полностью переписываем нашу кодовую базу в python вместо PHP (я унаследовал ее).

ответ

20

У вас есть 2 проблемы, по крайней мере,

  1. Google использует специальный URL-сейф Base64. Нормальный base64_decode не работает.
  2. Вам необходимо сгенерировать SHA1 в двоичном формате.

Попробуйте это,

$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

Ваш код работал. Клянусь, я попытался переключить этих двух персонажей вручную и до сих пор не мог видеть правильный результат. Возможно, это было неверно. В любом случае, спасибо за помощь! :) – Conradaroma

+4

@ZZCoder Ваш пример был полезен еще сегодня - спасибо, что написал его; Подписание запросов Amazon S3 ведро очень похоже. '$ signature = rawurlencode (base64_encode (hash_hmac (« sha1 », $ stringToSign, $ secret_access_key, true)));' –

+0

Предложение Geek Stocks для загрузки S3 работает, когда не используется функция rawurlencode. Это решение для загрузки имеет хорошую информацию S3/PHP, которую можно использовать без использования их библиотеки: http://www.plupload.com/docs/v2/Upload-to-Amazon-S3 – Exit