以上で完了です。

開発を始めるには、デベロッパー ドキュメント をご覧下さい。

Google Maps Time Zone API をアクティベートする

まず初めに Google Developers Console で次の作業を行います。

  1. プロジェクトを作成または選択する
  2. Google Maps Time Zone API をアクティベートする
  3. 適切なキーを作成する
続ける

キーの取得、認証

すべての Google Maps Time Zone API アプリケーションに認証が必要です。

  • 標準 API のユーザー: 標準プランで API を使用している場合は、プロジェクトで設定されている API キーを使用する必要があります。詳細は、標準 API 向けの API キーをご覧ください。

    リクエストにキーを含めることによって、Google API Console でアプリケーションの API 使用状況を監視したり、十分な量の 1 日あたりの無料の割り当てを利用したり、必要な場合には、Google からアプリケーションについての問い合わせができるようになります。

  • Premium Plan ユーザー: Google Maps APIs Premium Plan で API を使用している場合は、次の 2 つの認証方法があります。
    • Google Maps APIs Premium Plan プロジェクト(Premium Plan を購入した際に作成されたプロジェクト)で設定された API キーを使用します。
        
    • API キーの代わりに、クライアント ID とデジタル署名を含めます。

    最適な認証方式の選択に関する情報については、以下の Google Maps APIs Premium Plan のセクションをご覧ください。

標準 API 向けの認証 - API キー

API キーを取得する

Google Maps Time Zone API の使用を開始するには、以下のボタンをクリックして、Google Maps Time Zone API を自動でアクティベートしてください。

キーを取得する

または、次の手順で API キーを取得します。

  1. Google API Console に移動します。
  2. プロジェクトを作成または選択します。
  3. [Continue] をクリックして API を有効にします。
  4. [Credentials] ページで API キーを取得します(さらに、API キーの制限を設定します)。
    注: 制限のない既存の API キーまたはサーバーの制限が設定されたキーを所有している場合は、そのキーを使用することもできます。
  5. 割り当て量の盗用を防ぐため、ベスト プラクティスに従って API キーを保護します。
  6. (オプション)課金を有効化します。詳細については、使用制限をご覧ください。


Google API Console で、既存のキーを探すこともできます。

Google API Console の使用に関する詳細については、API Console のヘルプをご覧ください。

API キーの制限のタイプ

Google Maps API は、Android または iOS アプリ、ウェブブラウザ、HTTP 経由のウェブサービスで使用できます。どのプラットフォームの API でも、汎用的な(制限されていない)API キーを使用できます。必要に応じて、API キーに制限(たとえば、IP アドレス)を追加できます。制限されたキーは、その制限タイプをサポートするプラットフォーム上でのみ機能します。キーや認証情報の詳細については、こちらをご覧ください

リクエストでキーを指定する

リクエストでキーを指定するには、キーを key パラメータの値として含めます。

次に例を示します。

https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510&timestamp=1331161200&key=YOUR_API_KEY

Google Maps APIs Premium Plan ユーザーの認証

このセクションの情報は、2016 年 1 月 6 日から利用可能になった新しい Google Maps APIs Premium Plan のみに適用されます。

以前の Maps APIs for Work または Maps API for Business を所有している場合は、Maps APIs for Work ライセンス ガイドをご覧ください。以前のライセンスがあるかどうかを確認するには、Google Cloud Support Portal で、左側にある [Maps: Usage Report] をクリックします。レポートの最上部にある ID が次の形式になっている場合は、新しい Premium Plan があります。
gme-[company] & proj-[number] ([type])
そうでない場合は、以前のライセンスがあります。

Google Maps APIs Premium Plan ライセンスで Google Maps Time Zone API を使用する場合、API キーまたはクライアント ID でアプリケーションを認証する必要があります。また、クライアント ID を使用したリクエストにはデジタル署名が必要です。注: 以前の Maps API for Business ライセンスを所有している場合は、API キーではなく、クライアント ID を使用する必要があります。

使用する認証方式を決定する際は、以下の点を考慮してください。

  • API キー(Google Maps APIs Premium Plan ユーザーは利用可能ですが、以前の Maps API for Business ライセンスの所有者は利用できません)- API キーを使用してリクエストを認証すると、次のことができます。
    • Google API Console ですべての API を管理する
    • Google API Console でアプリケーションのリアルタイムの使用状況データと 30 日間の使用状況履歴データにアクセスする
    • Google Cloud Support Portal で 30 日間を超えるデータが反映された使用状況レポートを表示する
  • クライアント ID - (API キーではなく)クライアント ID を使用してリクエストを認証すると、次のことができます。
    • channel パラメータをリクエストに追加して、より詳細な使用状況レポートを表示する
    • Google Cloud Support Portal で 30 日間を超えるデータが反映された使用状況レポートを表示する
    • Maps JavaScript API の Maps Analytics ツールを使用する

詳細は、Premium Plan ユーザーが利用できるレポートをご覧ください。

API キーを使用する

API キーを使用して Time Zone API を認証するには、下のボタンをクリックして Google API Console を表示し、指示に従って操作します。

重要: [Project] プルダウン メニューでは、Premium Plan を購入した際に作成されたプロジェクトを選択する必要があります。プロジェクト名の先頭は、Google Maps APIs for Business or Google Maps for Work or Google Maps です。*

キーを取得する

または、次の手順で API キーを取得します。

  1. Google API Console に移動します。
  2. [Project] ドロップダウン メニューから、Google Maps Premium プロジェクト*を選択します。
  3. [Continue] をクリックします。
  4. [Credentials] ページで API キーを取得します(さらに、API キーの制限を設定します)。
    注: 制限のない既存の API キーまたはサーバーの制限が設定されたキーを所有している場合は、そのキーを使用することもできます。
  5. 割り当て量の盗用を防ぐため、ベスト プラクティスに従って API キーを保護します。

* 注: [Project] ドロップダウン メニューでは、Premium Plan を購入した際に作成されたプロジェクトを選択する必要があります。プロジェクト名の先頭は、Google Maps APIs for Business or Google Maps for Work or Google Maps です。重要: 以前の Maps API for Business ライセンスを所有している場合は、API キーではなく、クライアント ID を使用する必要があります。


Google API Console で、既存のキーを探すこともできます。

Google API Console の使用に関する詳細については、API Console のヘルプをご覧ください。

リクエストでキーを指定する

リクエストでキーを指定するには、キーを key パラメータの値として含めます。

次に例を示します。

https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510&timestamp=1331161200&key=YOUR_API_KEY

クライアント ID を使用する

API キーではなく、クライアント ID を使用して Time Zone API を認証するには、2 つの認証パラメータ(クライアント ID と一意のデジタル署名)が必要です。

以前に認証のために API キーを使用しており、今回クライアント ID の使用に切り替える場合は、リクエストから key パラメータを削除する必要があります。Google Maps API ウェブサービスでは、クライアント ID と API キーの両方を使用して作成されたリクエストは拒否されます

クライアント ID と署名

Google Maps APIs Premium Plan ライセンスを購入すると、Google からクライアント ID秘密暗号化キーが含まれたウェルカム メールが届きます。

  • クライアント ID は、Google Maps APIs Premium Plan の特別な機能にアクセスする際に使用します。すべてのクライアント ID は接頭辞 gme- で始まります。クライアント ID は client パラメータの値として渡します。

  • 一意のデジタル署名は、秘密暗号化キーを使用して生成されます。この署名は signature パラメータの値として渡します。署名の生成については、以下のデジタル署名のセクションで詳しく説明しています。

    https://maps.googleapis.com/maps/api/timezone/json
      ?location=39.6034810,-119.6822510
      &timestamp=1331161200
      &client=YOUR_CLIENT_ID
      &signature=SIGNATURE

クライアント ID または秘密暗号化キーを紛失した場合は、Google Cloud Support Portal にログインして、ページの左側にあるリンクの [Maps: Manage Client ID] をクリックすると、クライアント ID または秘密暗号化キーを再取得することができます。

レポート用のオプションのパラメータ

API 認証にクライアント ID を使用する場合、次のオプションのパラメータが使用できます。

  • channel を使用すると、レポートのさまざまなチャンネルを個別にグループ化して、追加でレポートの詳細を指定できます。詳細については、プレミアム プランのレポートの概要をご覧ください。

デジタル署名

Google Maps APIs Premium Plan ユーザーが Time Zone API にリクエストを送信する場合は、ウェルカム メールで提供された秘密暗号化キーを使って生成したデジタル signature が必要です。

署名プロセスでは、暗号化アルゴリズムによって URL とキーが統合されます。生成された一意の署名により、Google のサーバーでは、クライアント ID を使用してリクエストを生成しているサイトにその処理が承認されていることを確認できます。また、署名は URL ごとに一意であるため、新しい署名の生成を求めることなく、クライアント ID を使用したリクエストを変更することはできません。

秘密暗号化キー

秘密暗号化 URL 署名キーはクライアント ID で発行され、ユーザーと Google 間の「シークレット共有キー」になります。この署名キーはユーザー個人のものであり、クライアント ID に固有のキーです。そのため、署名キーのセキュリティを確保する必要があります。このキーをリクエストで渡したり、ウェブサイトに保存したり、公開フォーラムに投稿したりしないでください。この署名キーを取得した誰かが、あなたの ID を使用してリクエストを偽装する可能性があります。

注: この秘密暗号化署名キーは、Google API Console で発行された API キーと同じではありません

秘密暗号化キーを紛失した場合は、Google Cloud Support Portal にログインし、[Maps: Manage Client ID] をクリックしてキーを再取得してください。

デジタル署名を生成する

無効な署名を使用して Time Zone API へのアクセスを試みると、HTTP 403 (Forbidden) エラーが発生します。アプリケーションを変更して URL 署名を使用するときは、署名をテストして、有効なリクエストが開始されるようにする必要があります。まず元の URL が有効かどうかに加えて、正しい署名が生成されるかどうかをテストする必要があります。

次の手順でリクエストのデジタル署名を作成します。

  1. client パラメータを必ず含め、署名なしでリクエスト URL を作成します。非標準文字は URL エンコードする必要があることに注意してください。

    https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510&timestamp=1331161200&client=clientID

    注: すべての Google サービスに UTF-8 文字エンコード(暗黙的に ASCII を含む)が必要です。アプリケーションが他の文字セットを使用して動作している場合は、UTF-8 を使用して URL を作成し、その文字セットが正しく URL にエンコードされるようにしてください。

  2. パスとクエリのみを残して、リクエストのドメイン部分を取り除きます。

    /maps/api/timezone/json?location=39.6034810,-119.6822510&timestamp=1331161200&client=clientID

  3. URL 用 Modified Base64 でエンコードされた秘密キーを取得し、HMAC-SHA1 アルゴリズムを使用して上記の URL に署名します。場合によっては、このキーを元のバイナリ形式にデコードする必要があります。なお、ほとんどの暗号化ライブラリで生成される署名はバイナリ形式です。

    注: URL 用 Modified Base64 では、標準の Base64 の + 文字と / 文字がそれぞれ -_ に置き換えられるため、これらの Base64 署名は URL にエンコードする必要はなくなりました。

  4. 生成されたバイナリ署名を、URL 用 Modified Base64 でエンコードして、この署名を URL 内で渡すことができるように変換します。

  5. この署名を signature パラメータの URL に付加します。

    https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510&timestamp=1331161200&client=clientID&signature=base64signature

サーバー側のコードを使用して URL 署名を実装する方法を示したサンプルについては、URL 署名のサンプル コードをご覧ください。

今すぐ URL に署名するには、以下に URL と URL 署名シークレットを入力します。URL はステップ 1 で説明した形式に従い、URL エンコードされている必要があります。

URL 署名のサンプル コード

次のセクションでは、サーバー側のコードを使用して URL 署名を実装する方法について説明します。暗号化キーがユーザーに表示されないように、URL への署名は常にサーバー側で行う必要があります。

Python

次の例では、標準の Python ライブラリを使用して URL に署名しています。(コードのダウンロード

#!/usr/bin/python
# -*- coding: utf-8 -*-
""" Signs a URL using a URL signing secret """

import hashlib
import hmac
import base64
import urlparse

def sign_url(input_url=None, secret=None):
  """ Sign a request URL with a URL signing secret.

      Usage:
      from urlsigner import sign_url

      signed_url = sign_url(input_url=my_url, secret=SECRET)

      Args:
      input_url - The URL to sign
      secret    - Your URL signing secret

      Returns:
      The signed request URL
  """

  if not input_url or not secret:
    raise Exception("Both input_url and secret are required")

  url = urlparse.urlparse(input_url)

  # We only need to sign the path+query part of the string
  url_to_sign = url.path + "?" + url.query

  # Decode the private key into its binary format
  # We need to decode the URL-encoded private key
  decoded_key = base64.urlsafe_b64decode(secret)

  # Create a signature using the private key and the URL-encoded
  # string using HMAC SHA1. This signature will be binary.
  signature = hmac.new(decoded_key, url_to_sign, hashlib.sha1)

  # Encode the binary signature into base64 for use within a URL
  encoded_signature = base64.urlsafe_b64encode(signature.digest())

  original_url = url.scheme + "://" + url.netloc + url.path + "?" + url.query

  # Return signed URL
  return original_url + "&signature=" + encoded_signature

if __name__ == "__main__":
  input_url = raw_input("URL to Sign: ")
  secret = raw_input("URL signing secret: ")
  print "Signed URL: " + sign_url(input_url, secret)

Java

次の例では、JDK 1.8 から利用できる java.util.Base64 クラスを使用しています。それより古いバージョンでは、Apache Commons またはそれに類するものを使用する必要があります。(コードのダウンロード

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;  // JDK 1.8 only - older versions may need to use Apache Commons or similar.
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class UrlSigner {

  // Note: Generally, you should store your private key someplace safe
  // and read them into your code

  private static String keyString = "YOUR_PRIVATE_KEY";
  
  // The URL shown in these examples is a static URL which should already
  // be URL-encoded. In practice, you will likely have code
  // which assembles your URL from user or web service input
  // and plugs those values into its parameters.
  private static String urlString = "YOUR_URL_TO_SIGN";

  // This variable stores the binary key, which is computed from the string (Base64) key
  private static byte[] key;
  
  public static void main(String[] args) throws IOException,
    InvalidKeyException, NoSuchAlgorithmException, URISyntaxException {
    
    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
    
    String inputUrl, inputKey = null;

    // For testing purposes, allow user input for the URL.
    // If no input is entered, use the static URL defined above.    
    System.out.println("Enter the URL (must be URL-encoded) to sign: ");
    inputUrl = input.readLine();
    if (inputUrl.equals("")) {
      inputUrl = urlString;
    }
    
    // Convert the string to a URL so we can parse it
    URL url = new URL(inputUrl);
 
    // For testing purposes, allow user input for the private key.
    // If no input is entered, use the static key defined above.   
    System.out.println("Enter the Private key to sign the URL: ");
    inputKey = input.readLine();
    if (inputKey.equals("")) {
      inputKey = keyString;
    }
    
    UrlSigner signer = new UrlSigner(inputKey);
    String request = signer.signRequest(url.getPath(),url.getQuery());
    
    System.out.println("Signed URL :" + url.getProtocol() + "://" + url.getHost() + request);
  }
  
  public UrlSigner(String keyString) throws IOException {
    // Convert the key from 'web safe' base 64 to binary
    keyString = keyString.replace('-', '+');
    keyString = keyString.replace('_', '/');
    System.out.println("Key: " + keyString);
    // Base64 is JDK 1.8 only - older versions may need to use Apache Commons or similar.
    this.key = Base64.getDecoder().decode(keyString);
  }

  public String signRequest(String path, String query) throws NoSuchAlgorithmException,
    InvalidKeyException, UnsupportedEncodingException, URISyntaxException {
    
    // Retrieve the proper URL components to sign
    String resource = path + '?' + query;
    
    // Get an HMAC-SHA1 signing key from the raw key bytes
    SecretKeySpec sha1Key = new SecretKeySpec(key, "HmacSHA1");

    // Get an HMAC-SHA1 Mac instance and initialize it with the HMAC-SHA1 key
    Mac mac = Mac.getInstance("HmacSHA1");
    mac.init(sha1Key);

    // compute the binary signature for the request
    byte[] sigBytes = mac.doFinal(resource.getBytes());

    // base 64 encode the binary signature
    // Base64 is JDK 1.8 only - older versions may need to use Apache Commons or similar.
    String signature = Base64.getEncoder().encodeToString(sigBytes);
    
    // convert the signature to 'web safe' base 64
    signature = signature.replace('+', '-');
    signature = signature.replace('/', '_');
    
    return resource + "&signature=" + signature;
  }
}

C#

次の例では、デフォルトの System.Security.Cryptography ライブラリを使用して URL リクエストに署名しています。URL セーフ バージョンを実装するには、デフォルトの Base64 エンコーディングを変換する必要があります。(コードのダウンロード

using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;

namespace SignUrl {

  public struct GoogleSignedUrl {

    public static string Sign(string url, string keyString) {
      ASCIIEncoding encoding = new ASCIIEncoding();

      // converting key to bytes will throw an exception, need to replace '-' and '_' characters first.
      string usablePrivateKey = keyString.Replace("-", "+").Replace("_", "/");
      byte[] privateKeyBytes = Convert.FromBase64String(usablePrivateKey);

      Uri uri = new Uri(url);
      byte[] encodedPathAndQueryBytes = encoding.GetBytes(uri.LocalPath + uri.Query);

      // compute the hash
      HMACSHA1 algorithm = new HMACSHA1(privateKeyBytes);
      byte[] hash = algorithm.ComputeHash(encodedPathAndQueryBytes);

      // convert the bytes to string and make url-safe by replacing '+' and '/' characters
      string signature = Convert.ToBase64String(hash).Replace("+", "-").Replace("/", "_");
            
      // Add the signature to the existing URI.
      return uri.Scheme+"://"+uri.Host+uri.LocalPath + uri.Query +"&signature=" + signature;
    }
  }

  class Program {

    static void Main() {
    
      // Note: Generally, you should store your private key someplace safe
      // and read them into your code

      const string keyString = "YOUR_PRIVATE_KEY";
  
      // The URL shown in these examples is a static URL which should already
      // be URL-encoded. In practice, you will likely have code
      // which assembles your URL from user or web service input
      // and plugs those values into its parameters.
      const  string urlString = "YOUR_URL_TO_SIGN";
      
      string inputUrl = null;
      string inputKey = null;
    
      Console.WriteLine("Enter the URL (must be URL-encoded) to sign: ");
      inputUrl = Console.ReadLine();
      if (inputUrl.Length == 0) {
        inputUrl = urlString;
      }     
    
      Console.WriteLine("Enter the Private key to sign the URL: ");
      inputKey = Console.ReadLine();
      if (inputKey.Length == 0) {
        inputKey = keyString;
      }
      
      Console.WriteLine(GoogleSignedUrl.Sign(inputUrl,inputKey));
    }
  }
}

次の URL と秘密キーをテストして、正しい署名が生成されるかどうかを確認できます。この秘密キーはテスト専用のキーであり、いかなる Google サービスでも検証されないことに注意してください。

  • URL: https://maps.googleapis.com/maps/api/geocode/json?address=New+York&client=clientID
  • 秘密キー: vNIXE0xscrmjlyV-12Nj_BvUPaw=
  • URL の署名する部分: /maps/api/geocode/json?address=New+York&client=clientID
  • 署名: chaRF2hTJKOScPr-RQCEhZbSzIE=
  • 完全に署名された URL: https://maps.googleapis.com/maps/api/geocode/json?address=New+York&client=clientID&signature=chaRF2hTJKOScPr-RQCEhZbSzIE=

その他の言語の例

その他の言語の例については、URL 署名プロジェクトをご覧ください。

認証の問題のトラブルシューティング

リクエストが不正であるか、または無効な署名を提供する場合は、Google Maps Time Zone API から HTTP 403 (Forbidden) エラーが返されます。

個々の URL をトラブルシューティングするために、URL Signing Debugger を使用できます。これを使用すると、URL やアプリケーションによって生成された署名をすばやく検証できます。

または、Google Maps APIs Premium Plan ユーザーは、Google Cloud Support Portal にログインし、[Resources] > [Google Maps APIs Premium Plan online tools] > [URL Signing Debugger for Web Service and Image APIs] を選択して、個々の URL のトラブルシューティングを行うことができます。

フィードバックを送信...

Google Maps Time Zone API
Google Maps Time Zone API
ご不明な点がありましたら、Google のサポートページをご覧ください。