API キーの認証とアクセス

EAN の署名認証メソッドは、すべての API リクエストに必須です。共有秘密キー、API キー、および現在の UNIX タイムスタンプに基づくシグネチャ ハッシュを、CID および API キーと共に送信する必要があります。このハッシュは、すべてのリクエストで sig 共通エレメントの値として送信されます。

アフィリエイト センターにログインし、API トップ メニューの下のキーの詳細を見ると、API キーの共有秘密キーが見つかります。

開発中は、弊社の Sig ジェネレータを使用して、サンドボックス内のテスト リクエスト用に独自の sig 値を迅速に作成したり、実装によって作成された値を確認したりすることができます。

IP 認証がサポートされたままになるのは、すでに確立されたアカウントについてだけです。

認証に共有秘密キーを使用してコードにデジタル シグネチャを作成する

デジタル シグネチャを使用する場合、API キー、API ユーザーの共有秘密キー、および UNIX タイムスタンプからなる MD5 ハッシュを生成することにより、sig の値が計算されます。

ある程度の時間差に対応するため、システムはサーバーのタイムスタンプの前後 5 分までのタイムスタンプを受け付けます。

EAN は Network Time Protocol (NTP) を使用して内部サーバー時間を同期します。NTP も使用すれば、時刻同期の問題は生じません。最新のオペレーティング システムは NTP または類似の時刻同期サービスをサポートしています。OS のドキュメントを参照してください。

ほとんどのプログラミング言語で何らかの MD5() 関数が用意されています。これを使用してシグネチャを生成します。次の例は、PHP を使用して有効なシグネチャを生成する方法を示したものです。

$apiKey = 'xxx-YourAPIkey-xxx'; $secret = 'xxYourSecretxx'; $timestamp = gmdate('U'); // 1427233130 (Tue, 24 Mar 2015 21:38:50 +0000) $sig = md5($apiKey . $secret . $timestamp);

次の URL の例は、REST リクエストでデジタル シグネチャ (API キー、タイムスタンプ、および共有秘密キー) を使用して Hotel Version 3 サービスのリクエストを行った場合を示したものです。

http://api.ean.com/ean-services/rs/hotel/v3/avail? cid=[yourCID] &apiKey=[yourAPIKey] &sig=[youSigValue] &minorRev=[current minorRev #] &customerUserAgent=[xxx] &customerIpAddress=[xxx] &locale=en_US &currencyCode=USD &hotelId=201252

注意 :タイムスタンプが原因となりデジタル シグネチャの生成に失敗することがあります。次の点に留意してください :

  • ローカル時間ではなく、GMT 時間を使用してください。
  • 単位はミリ秒ではなく、秒としてください(システムによっては、デフォルトで時間をミリ秒単位で返します)。
  • シグネチャ リクエストで認証エラーが発生した場合、サーバーと時間を同期させるために、エラー メッセージで返されたサーバー情報のタイムスタンプを使用してもう一度リクエストを送信してください。例 :<ServerInfo serverTime="19:11:13.082-0500" timestamp="1311725473" instance="48" />
パラメータ 説明
apiKey カスタマー アプリケーションの ID。最大 255 文字の文字列で、スペースまたは特殊文字を含むことはできません。アプリケーションを登録する際に割り当てられる一意のキーです。
sig 当該リクエストのデジタル シグネチャ。API キー、共有秘密キー、およびタイムスタンプの MD5 ハッシュ関数として作成されます。

すべての sig 値は小文字 32 文字以上である必要があります。そのため、最低文字長に満たないなら先頭に 0 を追加して最終的な文字長を調整したり、すべての文字を小文字に変更したりして、文字列を操作しなけばならない場合があります。

認証エラーを受け取ったり、ご自分のデジタル シグネチャの生成時に問題が発生したりした場合は、EAN の Sig Generator を使用して自分の sig 値をチェックしてください。

追加の共通リクエスト エレメント

データの各コールに使用される共通リクエスト エレメントのリストを確認してください

コード サンプル

リクエストは任意のプログラミング言語から送信できます。よく使われるいくつかの言語 (PHP、Python、Java、Ruby、Perl、および C#)のサンプル コードを以下に示します。どのサンプル コードでも、パラメータに API キー (apiKey) とデジタル シグネチャ (sig) を指定してクエリを渡すことにより、データを取得しています。レスポンスのデータが言語によって変わることはありません。

デジタル シグネチャを使用せずにリクエストを送信し、ご自分の API アカウントに設定された IP 認証を使用するには、リクエストから共有秘密キーとシグネチャのプロセスを削除してください。

PHP

すべての sig 値は 32 文字以上である必要があります。最低文字長に満たない場合、先頭に 0 を追加して最終的な文字長を調整する必要があります。

<?php $secret = 'xxYourSecretxx'; $host = 'http://api.ean.com/';  // build path $ver = 'v3/'; $method = 'list/'; $path = "ean-services/rs/hotel/{$ver}{$method}";  // query parameters $apiKey = '[YourAPIkey]'; $cid = '[yourCID]'; $minorRev = '[currentMinorRev]'; $customerUserAgent = 'Mozilla/4.0'; $customerIpAddress = '172.16.82.13'; $locale = 'en_US'; $currencyCode = 'USD'; $hotelId = '201252';  $timestamp = gmdate('U'); $sig = md5($apiKey . $secret . $timestamp);  $query = "?apikey={$apiKey}&cid={$cid}&sig={$sig}&minorRev={$minorRev}" . "&customerUserAgent={$customerUserAgent}&customerIpAddress={$customerIpAddress}" . "&locale={$locale}&currencyCode={$currencyCode}&hotelIdList={$hotelId}";  // initiate curl $ch = curl_init();  curl_setopt($ch, CURLOPT_URL, $host . $path . $query); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); curl_setopt($ch, CURLOPT_HTTPHEADER,array('Accept:application/json')); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($ch); $headers = curl_getinfo($ch);  // close curl curl_close($ch);  // return XML data if ($headers['http_code'] != '200') {  echo "An error has occurred."; return false; } else {  echo $data;  return($data); } ?>

Python

資格情報が有効である場合、コールは XML ペイロードを ‘xml’ という名前の変数に返します。

すべての sig 値は 32 文字以上である必要があります。最低文字長に満たない場合、先頭に 0 を追加して最終的な文字長を調整する必要があります。

import urllib2 import md5 import time  service = 'http://api.ean.com/ean-services/rs/hotel/' version = 'v3/' method = 'list/' hotelId = '201252' otherElementsStr = 'cid=55505&minorRev=[x]&customerUserAgent=[xxx]&customerIpAddress=[xxx]&locale=en_US&currencyCode=USD'   apiKey = 'YourAPIkey' secret = 'YourSecret'  hash = md5.new() # seconds since GMT Epoch timestamp = str(int(time.time())) # print timestamp sig = md5.new(apiKey + secret + timestamp).hexdigest() url = service + version + method+ '?apiKey=' + apiKey + '&sig=' + sig + otherElementsStr + '&hotelIdList=' + hotelId # print url xml = urllib2.urlopen(url).read()  print xml

Java

次の Java サンプル コードは、データの Web サービス リクエストを HTTP GET 経由で実行する方法を示しています。Apache Software Foundation が提供する HttpComponents パッケージに基づいています。

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException;  import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient;  public class RestfulCallExample {   public static String service = "http://api.ean.com/ean-services/rs/hotel/";  public static String version = "v3/";  public static String method = "list";  public static String hotelId = "201252";  public static String otherElementsStr = "&cid=55505&minorRev=[x]" + "&customerUserAgent=[xxx]&customerIpAddress=[xxx]&locale=en_US&currencyCode=USD";  public static String apikey = "xxx-YourAPIkey-xxx";  public static String secret = "xxYourSecretxx";   public static void main(String[] args) throws NoSuchAlgorithmException {  MessageDigest md = MessageDigest.getInstance("MD5"); long timeInSeconds = (System.currentTimeMillis() / 1000); String input = apikey + secret + timeInSeconds; md.update(input.getBytes()); String sig = String.format("%032x", new BigInteger(1, md.digest()));  String url = service + version + method+ "?apikey=" + apikey  + "&sig=" + sig + otherElementsStr + "hotelIdList=" + hotelId; System.out.println("URL = " + url); DefaultHttpClient httpclient = new DefaultHttpClient();  // Create an HTTP GET request HttpGet httpget = new HttpGet(url);  // Execute the request httpget.getRequestLine(); HttpResponse response = null; try {  response = httpclient.execute(httpget); } catch (IOException e) {  e.printStackTrace(); return; }   HttpEntity entity = response.getEntity(); // Print the response System.out.println(response.getStatusLine());  if (entity != null) {  try { InputStream inputStream = entity.getContent(); // Process the response BufferedReader bufferedReader = new BufferedReader(  new InputStreamReader(inputStream)); String line; while ((line = bufferedReader.readLine()) != null) {  System.out.println(line); } bufferedReader.close();  } catch (IOException e) { e.printStackTrace();  } } // shut down the connection manager to free up system resources. httpclient.getConnectionManager().shutdown();  } }

Ruby

以下の Ruby の例は、Digest::MD5 を使用してデジタル シグネチャを生成し、Net::HTTP を使用してリクエストを送信します。

すべての sig 値は 32 文字以上である必要があります。最低文字長に満たない場合、先頭に 0 を追加して最終的な文字長を調整する必要があります。

require 'net/http' require 'digest/md5'  # hotelId to send hotelId = '201252'  #additional parameters set in a single string for brevity $otherElemntsStr = '&cid=55505&minorRev=[x]&customerUserAgent=[xxx]&customerIpAddress=[xxx]&locale=en_US&currencyCode=USD'   # API location PRODUCTION_ENDPOINT = 'api.ean.com/ean-services/rs/hotel/' PRODUCTION_PORT = 80  # Your credentials API_KEY = 'YourAPIkey' SHARED_SECRET = 'YourSecret' API_VERSION = 'v3'  current_time = Time.now timestamp = Time.now.to_i.to_s sig = Digest::MD5.hexdigest( API_KEY+SHARED_SECRET+timestamp )  request_url = "/#{API_VERSION}/list}?apiKey=#{API_KEY} & sig=#{sig} & #{otherElementsStr} & hotelIdList=#{hotelId}"  http = Net::HTTP.new( PRODUCTION_ENDPOINT , PRODUCTION_PORT ) http.start do |http| req = Net::HTTP::Get.new(request_url)  resp, data = http.request(req)  print data end

Perl

すべての sig 値は 32 文字以上である必要があります。最低文字長に満たない場合、先頭に 0 を追加して最終的な文字長を調整する必要があります。

# perl  use strict; # use LWP::Simple; use LWP::UserAgent; use Digest::MD5 qw(md5 md5_hex);  my $service = 'http://api.ean.com/ean-services/rs/hotel/'; my $method = 'list/'; my $version= 'v3/'; my $hotelId = '201252'; my $otherElemntsStr = '&cid=[xx]&minorRev=[x]&customerUserAgent=[xxx]&customerIpAddress=[xxx]&locale=en_US&currencyCode=USD';  # key and shared secret obtained from registering application my $apiKey = 'YourAPIkey'; my $secret = 'YourSecret';  my $timestamp = time; #above timestamp needs to be created in PERL !!! Placeholder my $sig = md5_hex($apiKey . $secret . $timestamp);  # print $timestamp,"", $sig, "\n";  my $ua = new LWP::UserAgent; $ua->timeout(120);  my $url=$service . $version . $method. '?apiKey=' . $apiKey . '&sig=' . $sig . $otherElementsStr . '&hotelIdList=' . $hotelId; # print $url, "\n";  my $request = new HTTP::Request('GET', $url); my $response = $ua->request($request); my $xml = $response->content(); print $xml,"\n";

C#

次の C# サンプル コードは、HttpWebRequest と HttpWebResponse を使用しています。

すべての sig 値は 32 文字以上である必要があります。最低文字長に満たない場合、先頭に 0 を追加して最終的な文字長を調整する必要があります。

using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Net; using System.Security.Cryptography;  namespace QuovaRESTSample { class Program { static void Main(string[] args) { string service = "http://api.ean.com/ean-services/rs/hotel/"; string version = "v3/"; string method = "list/"; string hotelId = "201252"; 	string otherElemntsStr = "&cid=[x]&minorRev=[x]&customerUserAgent=[xxx]&customerIpAddress=[xxx]&locale=en_US&currencyCode=USD"; string apiKey = "xxx-YourAPIkey-xxx"; string secret = "xxYourSecretxx"; string sig = MD5GenerateHash(apiKey + secret + (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds); string fullURL = service + version + method+ "?apiKey=" + apiKey + "&sig=" + sig + otherElementsStr + "&hotelIdList=" + hotelId;  // Create the web request HttpWebRequest request = WebRequest.Create(fullURL) as HttpWebRequest;  // Get response using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { // Get the response stream StreamReader reader = new StreamReader(response.GetResponseStream());  // Write response to the console Console.WriteLine(reader.ReadToEnd()); }  }  private static string MD5GenerateHash(string strInput) { // Create a new instance of the MD5CryptoServiceProvider object. MD5 md5Hasher = MD5.Create();  // Convert the input string to a byte array and compute the hash. byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(strInput));  // Create a new Stringbuilder to collect the bytes and create a string. StringBuilder sBuilder = new StringBuilder();  // Loop through each byte of the hashed data and format each one as a hexadecimal string. for (int nIndex = 0; nIndex < data.Length; ++nIndex) { sBuilder.Append(data[nIndex].ToString("x2")); }  // Return the hexadecimal string. return sBuilder.ToString(); } } }