API 키 인증 및 액세스

모든 API 요청에 EAN의 서명 인증 방법이 필요합니다. CID 및 API 키와 함께 공유 암호를 기반으로 한 서명 해시, API 키, 현재 UNIX 시간 스탬프를 보내야 합니다. 이 해시는 모든 요청에 대한 sig 공통 요소의 값으로 보냅니다.

제휴사 센터에 로그인하고 API 상단 메뉴에서 키 세부 정보를 확인하여 API 키의 공유 암호를 찾을 수 있습니다.

개발 도중에 서명 생성기를 사용하면 Sandbox에서 테스트 요청에 대해 고유한 sig 값을 신속하게 만들거나 구현에서 생성된 값을 검증할 수 있습니다.

IP 인증은 이전에 설정된 계정에 대해서만 계속 지원됩니다.

인증에 공유 암호 사용 및 코드에 디지털 서명 생성

디지털 서명을 사용할 때 sig 값은 API 키, API 사용자 공유 암호, UNIX 시간 스탬프로 구성되는 MD5 해시를 생성하여 계산할 수 있습니다.

시스템은 적절한 시계 드리프트를 수용하기 위해 서버 타임스탬프의 앞쪽 또는 뒤쪽에 최대 5개의 타임스탬프를 허용합니다.

EAN은 NTP(Network Time Protocol)를 사용하여 내부 서버 시간을 동기화합니다. 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은 디지털 서명, API 키, 타임스탬프, 공유 암호를 사용한 Hotel Version 3 서비스에 대한 REST 요청을 보여줍니다.

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 시간을 사용합니다.
  • 밀리초가 아니라 초를 사용합니다. (일부 시스템은 기본적으로 시간을 밀리초로 반환합니다.)
  • sig 요청 시 인증 오류가 나타나면 서버와 시간을 동기화하기 위해 다른 요청을 보낼 때 오류 메시지에서 반환된 서버 정보 타임스탬프를 사용합니다. 예: <ServerInfo serverTime="19:11:13.082-0500" timestamp="1311725473" instance="48" />
매개 변수 설명
apiKey 고객 응용 프로그램 식별자. 최대 255자로 구성된 문자열로, 공백이나 특수 문자는 포함되지 않을 수 있습니다. 응용 프로그램을 등록할 때 사용자에게 지정된 고유한 키입니다.
sig apiKey, 공유 암호 및 타임스탬프의 MD5 해시로 만들어진 요청에 대한 디지털 서명입니다.

모든 sig 값은 적어도 32자여야 하므로 앞에 오는 0을 최종 값에 추가하거나 모두 소문자로 변경하려면 문자열을 조작해야 할 수도 있습니다.

인증 오류가 수신되거나 자체 디지털 서명을 생성할 때 다른 문제가 있으면 EAN 서명 생성기에서 값을 확인하십시오.

추가적인 일반 요청 요소

모든 데이터 요청에 사용되는 일반적인 요청 요소 목록 검토

코드 샘플

프로그래밍 언어로 요청을 전송할 수 있습니다. 다음은 몇 가지 대표적인 언어(PHP, Python, Java, Ruby, Perl, C#)에 대한 코드 샘플입니다. 각 예제는 쿼리 매개변수를 API 키(apiKey) 및 디지털 서명(sig)과 함께 전달하여 데이터를 검색합니다. 응답의 데이터는 언어 간에 변경되지 않습니다.

디지털 서명 없이 요청을 보내려면 API 계정에서 IP 인증 세트를 사용하고 요청에서 공유 암호 및 sig 절차를 제거합니다.

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 예시는 HTTP GET을 통해 웹 서비스의 데이터 요청을 처리하는 방법을 나타냅니다. Apache 소프트웨어 재단의 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(); } } }