API Yetkilendirmesi

Otel API'lerine erişirken uygulamanızı yetkilendirmek için OAuth 2.0 kullanın.

OAuth 2.0 kurulumu

OAuth 2.0, Google Hesabınızla ilişkilendirilmiş bir hizmet hesabı kullanarak kendinizi tanımlamanızı gerektirir. Hizmet hesabı, özel anahtarınızı bir OAuth 2.0 erişim jetonu karşılığında gönderir. Daha sonra bu jetonu, otel fiyatı feed'inizle ilgili salt okunur veriler (ör. fiyat, otel ve teşhis raporlama verileri) için otel API'lerine yapılan çağrılarda kullanabilirsiniz.

Erişim jetonları bir saat (3.600 saniye) süreyle kullanılabilir.

Daha önce ClientLogin'i uyguladıysanız OAuth 2.0 yaklaşımı da aşağıdaki farklılıklara rağmen benzerdir:

  • Uygulamanız API'ye erişmek için bir Google hizmet hesabı kullanır.
  • API'leri çağırırken Authorization HTTP başlığında bir OAuth 2.0 erişim jetonu iletirsiniz.

Hesabınızı Travel Partner API ile OAuth 2.0 kullanacak şekilde ayarlamak için şu adımları uygulayın:

  1. Google Developers Console'da (DevConsole) yeni bir proje oluşturma

  2. Yeni proje için Travel Partner API erişimini etkinleştirin

  3. Bir hizmet hesabı ve kimlik bilgileri oluşturma

  4. Hizmet hesabınızın otel verilerinize erişmesine izin verme

Bu adımların her biri sonraki bölümlerde açıklanmıştır.

1. Adım: Yeni bir DevConsole Projesi oluşturun

Google Developers Console ("DevConsole"), projelerinizin kullandığı Google API'leri için trafik verilerini, kimlik doğrulamasını ve fatura bilgilerini yönetmek ve görüntülemek amacıyla Google'ın sunduğu geliştirici deneyimidir.

DevConsole'da proje, Google Developer API'lerini ve Google Cloud kaynaklarını kullanan, üzerinde çalıştığınız uygulama veya uygulamalarla ilgili ayarlar, kimlik bilgileri ve meta verilerden oluşan bir koleksiyondur.

DevConsole, projenizin bu yönlerini (ör. API kimlik bilgileri oluşturma, API'leri etkinleştirme, projenizle ilişkili ekip ve fatura bilgilerini yönetme) yönettiğiniz yerdir.

Yeni bir DevConsole projesi oluşturmak için:

  1. Gmail/Google Hesabınızda oturum açın.

  2. Google Developers Console'u açın. Bu ilk projenizse ana görünümde basit bir PROJE OLUŞTUR düğmesi görüntülenir:

    fig1

  3. PROJE OLUŞTUR düğmesini tıklayın. DevConsole, Yeni Proje iletişim kutusunu gösterir:

    fig2

    Proje adı giriş alanına yeni projeniz için kolay bir ad girin. Alanın altında yer alan DevConsole, sizin için bir proje kimliği oluşturarak bu kimliğin tüm projelerde benzersiz olmasını sağlar. Örneğin, "My New Project" ifadesini girerseniz DevConsole my-new-project-266022 gibi bir kimlik atar.

  4. Yeni projenizi oluşturmak için Create (Oluştur) düğmesini tıklayın.

  5. Gezinme menüsünü kullanarak API'ler ve Hizmetler > Kontrol Paneli'ni seçin.

    fig3

    Aşağıdaki resimde, DevConsole'un sol üst kısmındaki gezinme menüsü gösterilmektedir. Bu işlem, projenizin Kontrol Paneli görünümünü gösterir:

    fig4

Daha fazla bilgi için Geliştirici Konsolu'nda projeleri yönetme başlıklı makaleyi inceleyin.

Yeni bir proje oluşturduğunuzda henüz bu projeyle ilişkilendirilmiş API yoktur. Sonraki adımda yeni Projeniz için Travel Partner API öğesini etkinleştireceksiniz.

2. Adım: Yeni proje için Travel Partner API özelliğini etkinleştirin

Otel API'lerini kullanmak için yeni DevConsole projenizde Travel Partner API özelliğini etkinleştirmeniz gerekir.

Yeni projenizde otel API'lerini etkinleştirmek için:

  1. Yukarıda açıklandığı şekilde projenizin Kontrol Paneli görünümüne gidin.

  2. API'leri ve Hizmetleri Etkinleştir'i tıklayın. API Kitaplığı karşılama sayfası görüntülenir.

  3. Arama alanına Travel Partner API yazmaya başlayın. Google API Konsolu, yazdıklarınızla eşleşen API'lerin listesini gösterir.

  4. Eşleşen API'ler tablosunda Travel Partner API simgesini tıklayın. DevConsole, API hakkında bir açıklama görüntüler.

  5. Projenizde bu API'yi etkinleştirmek için API'yi Etkinleştir düğmesini tıklayın.

Daha fazla bilgi için API'leri etkinleştirme ve devre dışı bırakma bölümünü inceleyin.

Otel API'leri artık Google Hesabınızın yeni projesi için etkinleştirildi.

Sonraki adım, bir hizmet hesabı ve hesap için anahtarlar oluşturmaktır.

3. Adım: Bir hizmet hesabı ve hesabın kimlik bilgilerini oluşturun

Hizmet hesapları, bir web uygulaması ile otel verileriniz arasındaki etkileşim gibi sunucular arası etkileşimler tarafından kullanılır.

Bir hizmet hesabı oluşturmak ve yapılandırmak için:

  1. Google API Konsolu ana görünümünde, soldaki gezinme bölümünden Kimlik bilgileri'ni tıklayın. DevConsole, Kimlik Bilgileri görünümünü gösterir.

    Kimlik bilgileri görünümü, projenizin istemci kimliklerini ve kimlik bilgilerini gösterir. Uygulamanız OAuth 2.0 erişim jetonu isterken istemci kimliğini kullanır. Yeni projelerde henüz müşteri veya kimlik bilgisi yoktur.

  2. API'ler ve hizmetlerde kimlik bilgileri bağlantısını tıklayın.

  3. Create credentials (Kimlik bilgileri oluştur) düğmesini tıklayın ve açılır menüden Service account key (Hizmet hesabı anahtarı) seçeneğini belirleyin. Hizmet hesabı anahtarı oluştur görünümü görüntülenir.

  4. Hizmet hesabı açılır listesinden Yeni hizmet hesabı'nı seçin.

  5. Hizmet hesabı adı ve hizmet hesabı kimliği girin.

    Ad istediğiniz herhangi bir ad olabilir ancak hesap kimliğinin tüm projeler genelinde benzersiz olması gerekir. DevConsole, girdiğiniz ada göre sizin için benzersiz bir hesap kimliği oluşturur.

  6. Aşağıda gösterildiği gibi, anahtar türü için P12'yi seçin. P12 gereklidir.

    fig5

  7. Oluştur düğmesini tıklayın. DevConsole, projeniz için bir özel/ortak anahtar çifti oluşturur. Özel anahtar, tarayıcınızın indirilenleri depoladığı varsayılan konuma kaydedilir. .json dosya biçimi yerine .p12 biçimini (ikili) indirmeniz gerekir.

    Özel anahtarı, komut dosyalarınızda veya Travel Partner API öğesine erişen diğer uygulamalarda kullanırsınız.

    DevConsole, anahtarları oluşturmayı tamamladığında aşağıdaki bildirimi gösterir:

    fig6

  8. Tamam, anladım düğmesini tıklayın. DevConsole sizi Kimlik Bilgileri görünümüne döndürür. Hizmet hesabınızla ilgili ayrıntıları onaylamak ve projenizle ilişkili hizmet hesaplarını görmek için bu görünümde Hizmet hesaplarını yönet'i tıklayın.

    Hizmet hesabı, kendisiyle ilişkilendirilmiş aşağıdaki kimlik bilgilerine sahiptir:

    • İstemci kimliği: Uygulamanızın OAuth 2.0 erişim jetonu isterken kullandığı benzersiz tanımlayıcı.
    • E-posta adresi: Hizmet hesabı için "account_name@account_name.google.com.iam.gserviceaccount.com" biçiminde oluşturulan bir e-posta adresi.
    • Sertifika dijital parmak izleri: İndirdiğiniz özel anahtarın kimliği.

Daha fazla bilgi için Sunucudan Sunucuya Uygulamalar için OAuth 2.0'ı Kullanma bölümüne bakın.

4. adım: Hizmet hesabının Hotel Center verilerinize erişmesine izin verin

Son adım, yeni hizmet hesabının Hotel Center hesabınıza erişmesini sağlamaktır. Hizmet hesabı, önceki adımda oluşturduğunuz e-posta adresiyle tanımlanır. Hotel Center paylaşım ayarlarını kullanarak bu hesaba erişim sağlarsınız.

Bir hizmet hesabının Hotel Center verilerinize erişmesine izin vermek için:

Hesaba kullanıcı eklemek için uygun erişim izniniz yoksa bize ulaşın formunu kullanarak Google Oteller Ekibi ile iletişime geçin ve hesabınızın sahipliğini ayarlamamızı isteyin. Bir veya daha fazla e-posta adresinin sahibine gönderilmesini isteyebilirsiniz. Hotel Center'a erişim hakkında daha fazla bilgi için Hotel Center ve Google Ads'i bağlama başlıklı makaleyi inceleyin.

  1. Yeni bir tarayıcı penceresinde Hotel Center'ı açın. fig7

  2. Hotel Center by Google banner'ında, paylaşım iletişim kutusunu açmak için kullanıcı ekle simgesini tıklayın.

    fig8

  3. Daha fazla kişi ekle alanına Hotel Center'a eklemek istediğiniz hizmet hesabının e-posta adresini girin.

  4. Kullanıcıları bilgilendir seçeneğini işaretli bırakın.

  5. Açılır menüden Yönet'i seçin.

  6. Davet Et düğmesini tıklayın.

  7. Hotel Center'a kullanıcı ekledikten sonra hizmet hesabınız yaklaşık 24 saat içinde API erişimi için etkinleştirilir.

Google, hizmet hesabınız için API erişiminin etkinleştirildiğini bildirdikten sonra API'ye OAuth ile erişmeye başlayabilirsiniz.

OAuth 2.0'ı kullanma

API'ye erişmek için uygulamanızın, hizmet hesabının oluşturduğu e-posta adresi ve özel anahtarla kendini Google'a tanıtması gerekir. Google'ın kimlik doğrulama mekanizması bu anahtarı, uygulamanızın API çağrılarındaki Authorization başlığında geçirdiğiniz bir OAuth 2.0 erişim jetonuyla değiştirir.

Erişim jetonları (hamiline ait jetonlar olarak da bilinir) OAuth 2.0 standardının bir parçasıdır. HTTP başlığında erişim jetonu belirtmek için kullanılan söz dizimi şöyledir:

Authorization: Bearer *oauth2_access_token*

Aşağıdaki örnekte, Reports API'ye erişen bir isteğin örnek HTTP üst bilgileri gösterilmektedir:

GET /travelpartner/v2.0/42000042/reports/top_opportunity_7_day HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer nd42.fdLSKkljD98344444444444lSDF42fdLSKkljD98344444444444lSDF42
Cache-Control: no-cache

Erişim jetonu oluşturmak için seçtiğiniz dilde bir uygulama oluşturun. Aşağıdaki örnek, jetonu Python'da oluşturur. Daha sonra, bu jetonu Travel Partner API öğesine erişirken isteklerinizin Authorization başlıklarında kullanabilirsiniz.

#!/usr/bin/python2.7
#
""" Sample code to get an auth header that you can use in your HTTP requests
    1. Please see https://developers.google.com/api-client-library/python/start/installation
       to download and install the google-api-python-client package.
    2. Edit lines below marked _SERVICE_ACCOUNT, _KEY_FILE,  _PARTNER_NAME,
       and _API_VERSION.
    3. Run the program using: "python sample.py". The app returns the value that
       you use for the Authorization header's Bearer token in your request.
    4. Copy the token and use it in requests to the Travel Partner API.
       For example (2.0):
       https://www.googleapis.com/travelpartner/2.0/42000042/reports/budget
       For example (1.x):
       https://www.googleapis.com/travelpartner/1.2/reports?report_type=BUDGET
"""
import httplib2
import json
import os
import sys
import urllib

HAS_CRYPTO = False

from apiclient import discovery
from oauth2client.client import flow_from_clientsecrets
try:
  # Some systems may not have OpenSSL installed so can't use SignedJwtAssertionCredentials.
  from oauth2client.client import SignedJwtAssertionCredentials
  HAS_CRYPTO = True
except ImportError:
  print "Unable to import SignedJwtAssertionCredentials"

from oauth2client import tools
from oauth2client.file import Storage

# Authorization scope for our requests (do not change)
_DEFAULT_APISCOPE = 'https://www.googleapis.com/auth/travelpartner'

# Use the service account you set up in the Google Developers Platform.
# It will be of the form "gsaccount_name@project_name.google.com.iam.gserviceaccount.com".
_SERVICE_ACCOUNT = ('myserviceaccount@my-hotel-project.google.com.iam.gserviceaccount.com')

# Set this to the full path to your service account's private binary .p12 key file
# that you downloaded from the Google Developer's Console and stored in a secure place.
# DO NOT use the json version of the certificate.
_KEY_FILE = '../mylocaldir/api-keys/8482bb2bdb08.p12'

# Set this to the case-sensitive "Partner Key", NOT the account
# name in the Hotel Ads Center or the numeric partner ID.
# Check with your TAM if you do not know your "Partner Key" name.
_PARTNER_NAME = 'testpartner2'

class HotelAdsAPIConnection(object):
  def __init__(self, service_account=_SERVICE_ACCOUNT, key=_KEY_FILE, partner=_PARTNER_NAME):
    self.key_file = key
    self.account = service_account
    self.partner = partner

  def InitializeCredentials(self, scope):
    '''Get credentials for use in API requests.
    Generates service account credentials if the key file is present,
    and regular user credentials if the file is not found.
    '''
    if os.path.exists(self.key_file):
      if not HAS_CRYPTO:
        raise Exception("Unable to use cryptographic functions "
                        + "Try installing OpenSSL")
      with open (self.key_file, 'rb') as file:
        key = file.read();
      creds = SignedJwtAssertionCredentials(self.account, key, scope)
      self.credentials = creds

  def authorize(self):
    '''Construct a HTTP client that uses the supplied credentials.'''
    return credentials.authorize(httplib2.Http())

  def print_creds(self):
    '''Prints the Authorization header to use in HTTP requests.'''
    cred_dict = json.loads(self.credentials.to_json())

    if 'access_token' in cred_dict:
      print 'Authorization: Bearer %s' % (cred_dict['access_token'],)
    else:
      print 'creds: %s' % (cred_dict,)

  def GetConnection(self):
    http = httplib2.Http()
    self.credentials.refresh(http)
    http = self.credentials.authorize(http)
    self.print_creds()
    return http

def main(args):
  # Create an instance of the HotelAdsAPIConnection inner class
  api = HotelAdsAPIConnection()

  # Generate credentials
  api.InitializeCredentials(_DEFAULT_APISCOPE)

  # Output the Authorization header to use in HTTP requests
  api.GetConnection()

if __name__ == "__main__":
    main(sys.argv)</pre>

Uygulamanızı geliştirirken API anahtarlarını güvenli bir şekilde kullanmak için en iyi uygulamaları izlediğinizden emin olun.

Örnek Python komut dosyası, aşağıdaki örnekte gösterildiği gibi bir Authorization başlığının hamiline ait jetonunu üretir:

$ python sample.py
Authorization: Bearer ya29.42424242sample_420icu8122KSvoh4T42cRoG3rW1lc0Q
$

İsteklerinizde jetonun değerini kullanın. Kod, oluşturulduktan sonra 1 saat süreyle geçerlidir.

Sorun giderme

Sorun mu yaşıyorsunuz? Aşağıdaki öğeleri hızlıca kontrol etmek sorunu çözebilir.

  1. Google Developers Console'da bir proje oluşturdunuz mu?
  2. Travel Partner API öğesini bulup etkinleştirdiniz mi?
  3. İstemci kimliği oluştur'u tıklayıp Hizmet hesabı'nı seçtikten sonra .p12 dosyası (özel anahtar) indirdiniz mi?
  4. Hizmet hesabı istemci kimliği e-posta adresi olarak şu formu aldınız mı: nnnnnnn@app_name.google.com.iam.gserviceaccount.com?
  5. Bu hesabı paylaş düğmesini tıklayarak Otel Reklamları Merkezi hesabınızı hizmet hesabıyla paylaştınız mı?
  6. Hizmet hesabının e-posta adresini ve iş ortağı kimliğinizi Teknik Hesap Yöneticinize (THY) gönderdiniz mi?
  7. Travel Partner API çağrılarınız Authorization başlığında yakın zamanda alınmış bir jeton geçiriyor mu?
  8. Authorization üst bilginizin hamiline ait jetonu 1 saatten eski mi?

Aşağıdaki tabloda, sık karşılaşılan bazı hatalar ve olası çözümleri listelenmiştir:

Hata Açıklama
Invalid credentials Bu, birkaç anlama gelebilir. Bu hatayla karşılaşırsanız şunlardan emin olun:
  • Geçerli bir hamiline ait jeton içeren Authorization başlığı belirttiniz.
  • Hamiline ait jeton bir saatten kısa bir süre önce oluşturuldu. Jeton yalnızca bir saat süreyle kullanılabilir.
  • Doğru iş ortağı adını belirttiniz (partner sorgu dizesi parametresiyle). Değer, Otel Reklamları Merkezi'nde görünen iş ortağı adınız değil, benzersiz iş ortağı kimliğinizdir. İş ortağı kimliğinizi bilmiyorsanız Teknik Hesap Yöneticinizle (THY) iletişime geçin.
Not found Uç noktanız büyük olasılıkla bozuk. Bir GET isteği gönderdiğinizden ve istek URL'sinin geçerli olduğundan (erişmeye çalıştığınız API söz dizimine uygun olduğundan) emin olun.
Invalid string value Uç noktanın bir veya daha fazla bölümü geçersiz söz dizimi içeriyor. Örneğin, yolun bir kısmını yanlış yazmış olabilirsiniz. Yolun tamamında alt çizgi, büyük harf ve ifadeleri doğru şekilde kullandığınızdan emin olun.
Unsupported output format Bu hata en çok Reports API kullanılırken ortaya çıkar. GET isteğinizin URL'sinde "alt=csv" belirtmeniz gerekir. Reports API, JSON'u desteklemez.
AccessTokenRefreshError/Invalid grant Örnek Python uygulamasını çalıştırırken bu hatanın nedeni aşağıdakilerden biri olabilir:
  • Hizmet hesabı e-posta adresiniz yanlış. Google Developer Console'da e-posta hesabını kontrol edin ve API'ye erişme yetkisine sahip olduğundan emin olun.
  • E-posta adresinin API erişimi yok. E-posta adresinin, otel verilerinize erişim yetkisi olup olmadığını kontrol edin (Hotel Center üzerinden paylaşılır).
  • Anahtar dosyası, hizmet hesabı için doğru dosya değil. Yeni bir .p12 sertifikası indirmek için DevConsole'u kullanın ve Python uygulamanızın doğru sertifikayı gösterdiğinden emin olun.
HotelAdsAPIConnection object has no attribute credentials Örnek Python uygulamasını çalıştırırken .p12 dosyanızın yolu yanlış.
Invalid scope Örnek Python uygulamasını çalıştırırken API kapsamı https://www.googleapis.com/auth/travelpartner olmalıdır.
Forbidden Kullandığınız hesap kimliği, erişim yetkinizin olmadığı bir kimliktir. Alt hesap sahibiyseniz üst veya kök hesap kimliğine erişemeyebilirsiniz.