2010-06-26 38 views
9

Tôi đang cố gắng thiết lập một số hành động API Google Maps Premier và để làm như vậy, tôi cần ký các URL của mình để xác thực. Nếu bạn đi xuống ví dụ Signature, có một số Python, C# và mã Java để chỉ cho bạn cách thực hiện chữ ký thông qua HMAC-SHA1. Ngoài ra còn có một ví dụ để tôi có thể kiểm tra việc triển khai PHP của mình. Tuy nhiên, tôi dường như không thể làm cho nó hoạt động được.Cố gắng ký điện tử qua HMAC-SHA1 với PHP

Dưới đây là mã của tôi:

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

Khi nào, tôi chạy này, tôi nhận được một chữ ký của:

ZDRlNGMwZjIyMTA1MWM1Zjk0Nzc4M2NkYjlmNDQzNDBkYzk4NDI4Zg== 

nào hoàn toàn không phù hợp.

Những điều tôi đã nghĩ về:

  1. Điều quan trọng là ở định dạng URL mã hóa thay đổi, vì vậy thay đổi -_-+/ cũng không hoạt động
  2. Các Python dụ mã không thực sự làm việc, vì vậy đây là một ví dụ hợp lệ.
  3. Viết lại hoàn toàn mã cơ sở của chúng tôi trong python thay vì PHP (tôi đã kế thừa nó).

Trả lời

20

Bạn có 2 vấn đề ít nhất,

  1. Google sử dụng đặc biệt Base64 URL-an toàn. Base64_decode bình thường không hoạt động.
  2. Bạn cần tạo SHA1 theo dạng nhị phân.

Hãy thử điều này,

$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

Mã của bạn làm việc. Tôi thề rằng tôi đã cố gắng chuyển đổi hai ký tự đó theo cách thủ công và vẫn không thể thấy kết quả chính xác. Có lẽ đó không phải là chính xác mặc dù. Trong mọi trường hợp, cảm ơn sự giúp đỡ của bạn! :) – Conradaroma

+4

@ZZCoder Ví dụ của bạn hữu ích cho đến hôm nay - cảm ơn bạn đã viết nó; việc ký các yêu cầu thùng của Amazon S3 rất giống nhau. '$ signature = rawurlencode (base64_encode (hash_hmac (" sha1 ", $ stringToSign, $ secret_access_key, true));' –

+0

Geek Stocks gợi ý cho tải lên S3 hoạt động khi không sử dụng hàm rawurlencode. Giải pháp tải lên này có thông tin S3/PHP tốt có thể được sử dụng mà không cần sử dụng thư viện của họ: http://www.plupload.com/docs/v2/Upload-to-Amazon-S3 – Exit

Các vấn đề liên quan