9

Google Maps Premier API アクションをセットアップしようとしています。そのためには、URL に署名して認証する必要があります。署名の例に進むと、HMAC-SHA1 を介して署名を行う方法を示す Python、C#、および Java コードがいくつかあります。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 エンコード形式であるため、 and を and に変更-_+/機能しません
  2. Python のサンプル コードは実際に機能するため、これは有効な例です。
  3. PHP の代わりに Python でコードベースを完全に書き直しました (私はそれを継承しました)。
4

3 に答える 3

21

少なくとも 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), '+/', '-_');
于 2010-06-27T00:42:13.307 に答える
3

PHP の例はhttp://gmaps-samples.googlecode.com/svn/trunk/urlsigning/UrlSigner.php-sourceにあります。

于 2012-04-26T06:43:03.967 に答える
0

OAuth の URL に署名しようとしていると思いますか?

このライブラリを試してください: http://code.google.com/p/oauth/

于 2010-06-26T21:09:15.273 に答える