2010年03月02日

Google Static Maps API v2のsignatureについて

2010年3月2日より、セキュリティ強化のためにGoogle Static Maps API v2にURL認証機能が導入されました。

これはGoogle Maps API Premierを契約されている方のみ影響します。
無償版には影響されません。2010年3月は、Static Maps API v2のみの導入だそうです。

sigunatureは、Static Maps APIのリクエストするURLのパスの部分と、あらかじめEnterpriseから割り当てらているPrivate keyをHMAC-SHA1アルゴリズムで計算した値をBase64でエンコードした文字列です。
sigunatureの計算が間違っていると、403エラーが返されます。

書籍の方にも、急きょ説明ページを追加しました。

詳しい話は、こちら。(残念ながら英語のみ)

■URL Authentication
http://code.google.com/intl/en/apis/maps/documentation/premier/guide.html#URLSigning

 上記の英語ドキュメントからシグネチャの計算方法の部分だけ、ざっくりとまとめてみました。



シグネチャの計算方法

1.  リクエストするURLを作成します
例:
http://maps.google.co.jp/maps/api/staticmap?center=TokyoStation&sensor=false&zoom=16&size=512x512&maptype=roadmap&client=gme-xxxxxx

2. ドメインの部分を削除します
例:
/maps/api/staticmap?center=TokyoStation&sensor=false&zoom=16&size=512x512&maptype=roadmap&client=gme-xxxxxx

3.
 プライベートキーを Base64エンコード でデコードし、作成したURLのパスと共に、HMAC-SHA1アルゴリズムでシグネチャを計算します。

4. 計算されたシグネチャをリクエストするURLにsignatureパラメータで付加します。バイナリ文字列をURLに含められるようにBase64エンコードを行ないます。このときにもクライアントIDが必要です。
例:
http://maps.google.co.jp/maps/api/staticmap?center=TokyoStation&sensor=false&zoom=16&size=512x512&maptype=roadmap&client=gme-xxxxxx&signature=xxxxxxxxxx



Googleのドキュメントでは、Python, C#, Javaのコードは載っているのですが、PHPが無かったので作ってみました。ご参考まで。

PHP5での計算例

<html>
<body>

<?php

$clientID = "gme-xxxxxxx";
$privateKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx";

/*******************************************************
 1.リクエストURL の作成
********************************************************/
$requestUrl = "http://maps.google.com/maps/api/staticmap?".
              "center=TokyoStation&".
              "sensor=false&".
              "zoom=16&".
              "size=512x512&".
              "maptype=roadmap&".
              "client=". $clientID;

/*******************************************************
 2.パスとクエリの取得
********************************************************/
$parsedUrl = parse_url($requestUrl);
$pathAndQuery = $parsedUrl["path"]."?".$parsedUrl["query"];

/*******************************************************
 3.プライベートキーを Base64エンコード でデコード
    & URLをMAC-SHA1アルゴリズムで暗号化
********************************************************/
$decodedPrivateKey = base64_decode($privateKey, true);
$sigunature = hash_hmac("sha1", $pathAndQuery, $decodedPrivateKey, true);

/*******************************************************
 4.Base64エンコードされたシグネチャの付加
********************************************************/
$sigunature = base64_encode($sigunature);
$requestUrl .= "&sigunature=". $sigunature;

/*******************************************************
 5.表示
********************************************************/
echo "<img src='".$requestUrl."'><br>";

echo $requestUrl;

?>
【Googleの最新記事】
posted by Masashi.K at 09:48| Comment(1) | Google | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
google mapでマイマップに調べた場所・お店の情報を登録し、
マイマップを作成しています。

しかしこの登録したお店がマイマップで詳細を見るとあるすべて同じものが表示されます。
こちらを当初検索で出てきた地図の詳細情報を表記するように出来ないのでしょうか?

それとも都度こちらを変更しないといけないのでしょうか?
Posted by three-amigos at 2010年03月13日 17:38
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: