Autorização da API

Use o OAuth 2.0 para autorizar seu aplicativo a acessar as APIs do hotel.

Configuração do OAuth 2.0

O OAuth 2.0 exige que você se identifique usando uma conta de serviço associada à sua Conta do Google. A conta de serviço envia a chave privada em troca de um token de acesso do OAuth 2.0. É possível usar esse token em chamadas para as APIs de hotéis para dados somente leitura, como dados de preços, hotéis e relatórios de diagnósticos sobre seu feed de preços para hotéis.

Os tokens de acesso são válidos por uma hora (3.600 segundos).

Se você já implementou o ConstraintLayout, a abordagem do OAuth 2.0 é semelhante, com as seguintes diferenças:

  • Seu aplicativo usa uma conta de serviço do Google para acessar a API.
  • Você transmite um token de acesso do OAuth 2.0 no cabeçalho HTTP Authorization ao chamar APIs.

Para configurar sua conta para usar o OAuth 2.0 com o Travel Partner API, siga estas etapas:

  1. Criar um novo projeto no Google Developers Console (DevConsole)

  2. Ativar o acesso a Travel Partner API para o novo projeto

  3. Criar uma conta de serviço e as credenciais dela

  4. Permitir que sua conta de serviço acesse os dados do hotel

Cada uma dessas etapas é descrita nas seções a seguir.

Etapa 1: criar um novo projeto no DevConsole

O Google Developers Console ("DevConsole") é a experiência do desenvolvedor do Google para gerenciar e visualizar dados de tráfego, autenticação e informações de faturamento das APIs do Google usadas por seus projetos.

No DevConsole, um projeto é um conjunto de configurações, credenciais e metadados sobre o aplicativo ou os aplicativos em que você está trabalhando que usam as APIs Google Developer e os recursos do Google Cloud.

O DevConsole é onde você gerencia esses aspectos do projeto, como geração de credenciais de API, ativação de APIs e gerenciamento de informações da equipe e de faturamento associadas ao projeto.

Para criar um novo projeto no DevConsole:

  1. Faça login na sua Conta do Google/Gmail.

  2. Abra o Google Developer Console. Se este for seu primeiro projeto, a visualização principal exibirá um botão CREATE PROJECT simples:

    fig1

  3. Clique no botão CRIAR PROJETO. O DevConsole exibe a caixa de diálogo Novo projeto:

    fig2

    Digite um nome amigável para seu novo projeto no campo de entrada Nome do projeto. Abaixo do campo, o DevConsole gera um ID do projeto para você, garantindo que o ID seja exclusivo em todos os projetos. Por exemplo, se você inserir "My New Project", o DevConsole atribuirá um ID como my-new-project-266022.

  4. Clique no botão Criar para criar seu novo projeto.

  5. Use o menu de navegação para selecionar APIs e serviços > Painel.

    fig3

    A imagem abaixo mostra o menu de navegação no canto superior esquerdo do DevConsole. O Painel do projeto vai aparecer:

    fig4

Para ver mais informações, consulte Gerenciar projetos no Developers Console.

Quando você cria um novo projeto, ele ainda não tem APIs associadas a ele. Na próxima etapa, você ativará o Travel Partner API para o novo projeto.

Etapa 2: ativar o Travel Partner API para o novo projeto

Para usar as APIs de hotel, ative Travel Partner API no seu novo projeto no DevConsole.

Para ativar as APIs de hotel no novo projeto:

  1. Vá para a visualização Painel do seu projeto, conforme descrito acima.

  2. Clique em Ativar APIs e serviços. A página de boas-vindas da biblioteca de APIs será exibida.

  3. No campo de pesquisa, comece a digitar Travel Partner API. O Console de APIs do Google exibe uma lista de APIs que correspondem ao que você digitou.

  4. Clique em Travel Partner API na tabela de APIs correspondentes. O DevConsole exibe uma descrição sobre a API.

  5. Clique no botão Ativar API para ativar esta API no projeto.

Para mais informações, consulte Ativar e desativar APIs.

As APIs Hotel agora estão ativadas para o novo projeto da sua Conta do Google.

A próxima etapa é criar uma conta de serviço e gerar chaves para ela.

Etapa 3: criar uma conta de serviço e gerar as credenciais

As contas de serviço são usadas por interações de servidor para servidor, como as que ocorrem entre um aplicativo da Web e os dados do seu hotel.

Para criar e configurar uma conta de serviço, faça o seguinte:

  1. Na visualização principal do Console de APIs do Google, clique em Credenciais na navegação à esquerda. O DevConsole mostra a visualização Credenciais.

    A visualização Credenciais exibe os IDs do cliente e as credenciais do seu projeto. O aplicativo usará o ID do cliente ao solicitar um token de acesso do OAuth 2.0. Novos projetos ainda não terão clientes ou credenciais.

  2. Clique no link Credenciais em APIs e serviços.

  3. Clique no botão Criar credenciais e selecione Chave da conta de serviço no menu suspenso. A visualização Criar chave da conta de serviço é exibida.

  4. No menu suspenso Conta de serviço, selecione Nova conta de serviço.

  5. Insira o nome e o ID da conta de serviço.

    O nome pode ser o que você quiser, mas o ID da conta precisa ser exclusivo em todos os projetos. O DevConsole gerará um ID de conta exclusivo para você, com base no nome inserido.

  6. Selecione P12 para o tipo de chave, conforme mostrado abaixo. O P12 é obrigatório.

    fig5

  7. Clique no botão Criar. O DevConsole gera um par de chaves privada/pública para seu projeto. A chave privada é salva no local padrão em que o navegador armazena os downloads. É preciso fazer o download do formato .p12 (binário), em vez do formato de arquivo .json.

    Você usa a chave privada nos scripts ou em outros aplicativos que acessam o Travel Partner API.

    O DevConsole mostra o seguinte aviso quando termina de gerar as chaves:

    fig6

  8. Clique no botão OK, entendi. O DevConsole retorna à visualização Credenciais. Para confirmar os detalhes sobre a conta de serviço e ver as contas de serviço associadas ao projeto, clique em Gerenciar contas de serviço nessa visualização.

    A conta de serviço agora tem as seguintes credenciais associadas a ela:

    • ID do cliente:um identificador exclusivo usado pelo aplicativo ao solicitar um token de acesso do OAuth 2.0.
    • Endereço de e-mail: um endereço de e-mail gerado para a conta de serviço, no formato "account_name@account_name.google.com.iam.gserviceaccount.com".
    • Impressões digitais de certificado:o ID da chave privada que você fez o download.

Para mais informações, consulte Usar o OAuth 2.0 para aplicativos de servidor para servidor.

Etapa 4: conceder à conta de serviço acesso aos seus dados da Central para Hotéis

A etapa final é fornecer à nova conta de serviço acesso à sua Central para Hotéis. A conta de serviço é identificada pelo endereço de e-mail gerado que você criou na etapa anterior. Você permite o acesso a ela nas configurações de compartilhamento da Central para Hotéis.

Para conceder a uma conta de serviço acesso aos seus dados da Central para Hotéis, faça o seguinte:

Caso você não tenha o acesso necessário para adicionar usuários à conta, entre em contato com a equipe do Google Hotéis usando o formulário Fale conosco e solicite a configuração da propriedade da sua conta. Você pode solicitar que um ou mais e-mails sejam enviados a um proprietário. Para mais informações sobre o acesso à Central para Hotéis, consulte Vincular a Central para Hotéis e o Google Ads.

  1. Em uma nova janela do navegador, abra a Central para Hotéis. fig7

  2. No banner da Central para Hotéis do Google, clique no ícone de adição de usuário para abrir a caixa de diálogo de compartilhamento.

    fig8

  3. No campo Adicionar mais pessoas, insira o endereço de e-mail da conta de serviço que você quer adicionar à Central para Hotéis.

  4. Mantenha a opção Notificar pessoas selecionada.

  5. No menu suspenso, selecione Gerenciar.

  6. Clique no botão Convidar.

  7. Depois de adicionar usuários à Central para Hotéis, sua conta de serviço vai ter acesso à API em cerca de 24 horas.

Depois que o Google notificar que o acesso à API está ativado para sua conta de serviço, você poderá acessar a API com o OAuth.

Como usar o OAuth 2.0

Para acessar a API, seu aplicativo precisa se identificar para o Google com o endereço de e-mail gerado e a chave privada da conta de serviço. O mecanismo de autenticação do Google troca essa chave por um token de acesso do OAuth 2.0 que você transmite no cabeçalho Authorization nas chamadas de API do seu aplicativo.

Os tokens de acesso, também conhecidos como tokens do portador, fazem parte do padrão OAuth 2.0. A sintaxe para especificar um token de acesso em um cabeçalho HTTP é:

Authorization: Bearer *oauth2_access_token*

Veja no exemplo a seguir exemplos de cabeçalhos HTTP de uma solicitação que acessa a API Reports:

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

Para gerar um token de acesso, crie um aplicativo em qualquer linguagem que você escolher. O exemplo a seguir gera o token no Python. Esse token pode ser usado nos cabeçalhos Authorization das suas solicitações ao acessar o Travel Partner API.

#!/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>

Ao desenvolver o aplicativo, siga as Práticas recomendadas para usar as chaves de API com segurança.

O script Python de amostra gera um token do portador de cabeçalho Authorization, como mostra o exemplo a seguir:

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

Use o valor do token em suas solicitações. Ela é útil por uma hora após a geração.

Solução de problemas

Está com problemas? Uma verificação rápida dos itens a seguir pode resolver o problema.

  1. Você criou um projeto no Google Developer Console?
  2. Você encontrou e ativou o Travel Partner API?
  3. Você fez o download de um arquivo .p12, uma chave privada, depois de clicar em Criar ID do cliente e selecionar Conta de serviço?
  4. Você recebeu o endereço de e-mail do ID do cliente de uma conta de serviço de um formulário: nnnnnnn@app_name.google.com.iam.gserviceaccount.com?
  5. Você compartilhou sua conta do Hotel Ads Center com a conta de serviço clicando no botão Share this account?
  6. Você enviou o endereço de e-mail da conta de serviço e o ID do parceiro ao seu Gerente técnico de contas (TAM)?
  7. Suas chamadas Travel Partner API estão transmitindo um token recebido recentemente no cabeçalho Authorization?
  8. O token do portador do seu cabeçalho Authorization tem mais de uma hora?

A tabela a seguir lista alguns erros comuns e possíveis soluções:

Erro Descrição
Invalid credentials Isso pode significar várias coisas. Se você encontrar esse erro, verifique se:
  • Você especificou um cabeçalho Authorization com um token do portador válido.
  • O token do portador tem menos de uma hora. Um token só é válido por uma hora.
  • Você especificou o nome correto do parceiro (com o parâmetro de string de consulta partner). O valor é seu ID exclusivo do parceiro, não o nome do parceiro que aparece na Central de anúncios de hotéis. Se você não souber o ID, entre em contato com seu Gerente técnico de contas (TAM).
Not found É provável que seu endpoint esteja malformado. Verifique se você está enviando uma solicitação GET e se o URL dela é válido (em conformidade com a sintaxe da API que você está tentando acessar).
Invalid string value Uma ou mais partes do endpoint contêm sintaxe inválida. Por exemplo, você pode ter digitado incorretamente parte do caminho. Verifique se você usou os sublinhados, as letras maiúsculas e o texto corretos em todo o caminho.
Unsupported output format Esse erro ocorre com mais frequência ao usar a API Reports. Especifique "alt=csv" no URL da solicitação GET. A API Reports não é compatível com JSON.
AccessTokenRefreshError/Invalid grant Ao executar o app em Python de amostra, esse erro pode ser causado pelo seguinte:
  • O endereço de e-mail da sua conta de serviço está incorreto. Verifique a conta de e-mail no Google Developer Console e confirme se ela tem autorização para acessar a API.
  • O endereço de e-mail não tem acesso à API. Verifique se o endereço de e-mail tem autorização para acessar os dados dos seus hotéis (compartilhados pela Central para Hotéis).
  • O arquivo de chave não é o correto da conta de serviço. Use o DevConsole para fazer o download de um novo certificado .p12 e verifique se seu app Python está apontando para o certo.
HotelAdsAPIConnection object has no attribute credentials Ao executar o app em Python de amostra, o caminho para o arquivo .p12 está incorreto.
Invalid scope Ao executar o app em Python de amostra, o escopo da API precisa ser https://www.googleapis.com/auth/travelpartner.
Forbidden Você não tem autorização para acessar o ID da conta que está usando. Se você for o proprietário de uma subconta, talvez não consiga acessar o ID da conta mãe ou raiz.