Autorización mediante la API

Usa OAuth 2.0 para autorizar tu aplicación cuando accedas a las APIs de hoteles.

Configuración de OAuth 2.0

OAuth 2.0 requiere que te identifiques con una cuenta de servicio asociada con tu Cuenta de Google. La cuenta de servicio envía tu clave privada a cambio de un token de acceso de OAuth 2.0. Luego, puedes usar este token en las llamadas a las APIs de hoteles para datos de solo lectura, como datos de precios, hoteles y informes de diagnóstico sobre tu feed de precios de hoteles.

Los tokens de acceso son válidos por una hora (3,600 segundos).

Si ya implementaste ClientLogin, el enfoque de OAuth 2.0 es similar, con las siguientes diferencias:

  • Tu aplicación usa una cuenta de servicio de Google para acceder a la API.
  • Debes pasar un token de acceso de OAuth 2.0 en el encabezado HTTP Authorization cuando llamas a las APIs.

A fin de configurar tu cuenta para usar OAuth 2.0 con la Travel Partner API, sigue estos pasos:

  1. Cómo crear un proyecto nuevo en Google Developers Console (DevConsole)

  2. Habilita el acceso a Travel Partner API para el proyecto nuevo

  3. Crea una cuenta de servicio y sus credenciales

  4. Cómo permitir que tu cuenta de servicio acceda a los datos de tu hotel

Cada uno de estos pasos se describe en las siguientes secciones.

Paso 1: Crea un proyecto nuevo de DevConsole

Google Developers Console ("DevConsole") es la experiencia que ofrece Google a los desarrolladores para administrar y visualizar datos de tráfico, autenticación y datos de facturación de las API de Google que usan tus proyectos.

En DevConsole, un proyecto es una colección de opciones de configuración, credenciales y metadatos sobre la aplicación o aplicaciones en las que estás trabajando y que usan las APIs de Google Developer y los recursos de Google Cloud.

En DevConsole, administras estos aspectos de tu proyecto, como la generación de credenciales de API, la activación de las APIs y la administración de la información del equipo y de facturación asociada con tu proyecto.

Para crear un proyecto nuevo de DevConsole, sigue estos pasos:

  1. Accede a tu Cuenta de Google o Gmail.

  2. Abre Google Developer Console. Si este es tu primer proyecto, la vista principal mostrará un botón simple CREAR PROYECTO:

    fig1

  3. Haz clic en el botón CREAR PROYECTO. En DevConsole, se muestra el cuadro de diálogo New Project:

    fig2

    Ingresa un nombre descriptivo para tu proyecto nuevo en el campo de entrada Nombre del proyecto. Debajo del campo, DevConsole genera un ID de proyecto para ti y se asegura de que el ID sea único en todos los proyectos. Por ejemplo, si ingresas "My New Project", DevConsole asigna un ID como my-new-project-266022.

  4. Haz clic en el botón Crear para crear un proyecto nuevo.

  5. Usa el menú de navegación para seleccionar APIs y servicios > Panel.

    fig3

    En la siguiente imagen, se muestra el menú de navegación en la parte superior izquierda de DevConsole. Se mostrará la vista Dashboard de tu proyecto:

    fig4

Si quieres obtener más información, consulta Administra proyectos en Developers Console.

Cuando creas un proyecto nuevo, este todavía no tiene APIs asociadas. En el siguiente paso, habilitarás el Travel Partner API para tu proyecto nuevo.

Paso 2: Habilita Travel Partner API para el proyecto nuevo

Para usar las APIs de hoteles, debes habilitar Travel Partner API en tu nuevo proyecto de DevConsole.

Sigue estos pasos para habilitar las APIs de hoteles en tu proyecto nuevo:

  1. Dirígete a la vista Panel de tu proyecto como se describió anteriormente.

  2. Haz clic en Habilitar APIs y servicios. Se mostrará la página de bienvenida de la Biblioteca de APIs.

  3. En el campo de búsqueda, comienza a escribir Travel Partner API. La Consola de APIs de Google muestra una lista de APIs que coinciden con lo que escribes.

  4. Haz clic en Travel Partner API en la tabla de APIs coincidentes. En DevConsole, se muestra una descripción sobre la API.

  5. Haz clic en el botón Habilitar API para habilitar esta API en tu proyecto.

Para obtener más información, consulta Cómo activar y desactivar las APIs.

Las APIs de hoteles ya están habilitadas para el nuevo proyecto de tu Cuenta de Google.

El siguiente paso es crear una cuenta de servicio y generar claves para ella.

Paso 3: Crea una cuenta de servicio y genera sus credenciales

Las interacciones servidor a servidor, como las que existen entre una aplicación web y los datos de tu hotel, usan las cuentas de servicio.

Para crear y configurar una cuenta de servicio, sigue estos pasos:

  1. En la vista principal de la Consola de APIs de Google, haz clic en Credenciales en el panel de navegación de la izquierda. DevConsole muestra la vista Credenciales.

    En la vista Credenciales, se muestran los IDs de cliente y las credenciales de tu proyecto. Tu aplicación usará el ID de cliente cuando solicite un token de acceso de OAuth 2.0. Los proyectos nuevos aún no tendrán clientes ni credenciales.

  2. Haz clic en el vínculo Credenciales en las APIs y los servicios.

  3. Haz clic en el botón Crear credenciales y selecciona Clave de cuenta de servicio en el menú desplegable. Aparecerá la vista Crear clave de cuenta de servicio.

  4. En el menú desplegable Cuenta de servicio, selecciona Nueva cuenta de servicio.

  5. Ingresa un nombre y un ID para la cuenta de servicio.

    El nombre puede ser el que desees, pero el ID de la cuenta debe ser único en todos los proyectos. DevConsole generará un ID de cuenta único para ti, según el nombre que hayas ingresado.

  6. Selecciona P12 para el tipo de clave, como se muestra a continuación. El P12 es obligatorio.

    fig5

  7. Haz clic en el botón Crear (Create). DevConsole genera un par de claves pública/privada para tu proyecto. La clave privada se guarda en la ubicación predeterminada en la que el navegador almacena las descargas. Debes descargar el formato .p12 (binario), en lugar del formato de archivo .json.

    Usas la clave privada en tus secuencias de comandos o en otras aplicaciones que acceden a Travel Partner API.

    En DevConsole, se muestra el siguiente aviso cuando termina de generar las claves:

    fig6

  8. Haz clic en el botón Entendido. DevConsole te lleva de regreso a la vista Credenciales. Para confirmar los detalles de tu cuenta de servicio y ver las cuentas de servicio asociadas con tu proyecto, haz clic en Administrar cuentas de servicio en esta vista.

    La cuenta de servicio ahora tiene las siguientes credenciales asociadas:

    • ID de cliente: Es un identificador único que usa tu aplicación cuando solicita un token de acceso de OAuth 2.0.
    • Dirección de correo electrónico: Una dirección de correo electrónico generada para la cuenta de servicio, con el formato “account_name@account_name.google.com.iam.gserviceaccount.com”.
    • Huellas digitales del certificado: el ID de la clave privada que descargaste.

Si quieres obtener más información, consulta Usa OAuth 2.0 para aplicaciones de servidor a servidor.

Paso 4: Otorga a la cuenta de servicio acceso a tus datos de Hotel Center

El último paso consiste en proporcionar a la cuenta de servicio nueva acceso a Hotel Center. La cuenta de servicio se identifica con la dirección de correo electrónico generada que creaste en el paso anterior. Para proporcionar acceso a esta cuenta, debes usar la configuración de uso compartido de Hotel Center.

Sigue estos pasos para permitir que una cuenta de servicio acceda a tus datos de Hotel Center:

Si no tienes el acceso adecuado para agregar usuarios a la cuenta, comunícate con el equipo de Hoteles de Google a través del formulario de contacto y solicítanos que configuremos la propiedad de tu cuenta. Puedes solicitar que se envíen uno o más correos electrónicos a un propietario. Para obtener más información sobre el acceso a Hotel Center, consulta Cómo vincular Hotel Center y Google Ads.

  1. En una nueva ventana del navegador, abre Hotel Center. fig7

  2. En el banner de Hotel Center de Google, haz clic en el ícono de agregar usuario para abrir el diálogo de uso compartido.

    fig8

  3. En el campo Agregar más personas, ingresa la dirección de correo electrónico de la cuenta de servicio que quieras agregar a Hotel Center.

  4. Mantén seleccionada la opción Notificar a las personas.

  5. En el menú desplegable, selecciona Administrar.

  6. Haz clic en el botón Invitar.

  7. Después de agregar usuarios a Hotel Center, deberías habilitar tu cuenta de servicio para el acceso a la API en un plazo de alrededor de 24 horas.

Después de que Google te notifique que el acceso a la API está habilitado para tu cuenta de servicio, puedes comenzar a acceder a la API con OAuth.

A través de OAuth 2.0

Para acceder a la API, tu aplicación debe identificarse ante Google con la dirección de correo electrónico generada y la clave privada de la cuenta de servicio. El mecanismo de autenticación de Google intercambia esta clave por un token de acceso de OAuth 2.0 que pasas en el encabezado Authorization en las llamadas a la API de tu app.

Los tokens de acceso (también conocidos como tokens del portador) forman parte del estándar OAuth 2.0. Esta es la sintaxis para especificar un token de acceso en un encabezado HTTP:

Authorization: Bearer *oauth2_access_token*

En el siguiente ejemplo, se muestran encabezados HTTP de muestra de una solicitud que accede a la API de informes:

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 generar un token de acceso, crea una aplicación en el lenguaje que elijas. En el siguiente ejemplo, se genera el token en Python. Luego, puedes usar este token en los encabezados Authorization de tus solicitudes cuando accedas a 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>

Cuando desarrolles tu aplicación, asegúrate de seguir las prácticas recomendadas para usar claves de API de forma segura.

La secuencia de comandos de Python de muestra genera un token del portador del encabezado Authorization, como se muestra en el siguiente ejemplo:

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

Usa el valor del token en tus solicitudes. Es válido durante 1 hora después de que se genera.

Solución de problemas

¿Tienes problemas? Hacer una verificación rápida de los siguientes elementos podría resolver el problema.

  1. ¿Creaste un proyecto en Google Developer Console?
  2. ¿Encontraste y habilitaste Travel Partner API?
  3. ¿Descargaste un archivo .p12, una clave privada después de hacer clic en Crear ID de cliente y seleccionar Cuenta de servicio?
  4. ¿Obtuviste una dirección de correo electrónico del ID de cliente de la cuenta de servicio de un formulario: nnnnnnn@app_name.google.com.iam.gserviceaccount.com?
  5. ¿Compartiste tu cuenta de Hotel Ads Center con la cuenta de servicio cuando hiciste clic en el botón Compartir esta cuenta?
  6. ¿Enviaste la dirección de correo electrónico de la cuenta de servicio y tu ID de socio a tu administrador técnico de cuentas (TAM)?
  7. ¿Tus llamadas a Travel Partner API pasan un token que se obtuvo recientemente en el encabezado Authorization?
  8. ¿El token del portador de tu encabezado Authorization tiene más de 1 hora de antigüedad?

En la siguiente tabla, se enumeran algunos errores comunes y posibles soluciones:

Error Descripción
Invalid credentials Esto puede significar varias cosas. Si encuentras este error, verifica lo siguiente:
  • Especificaste un encabezado Authorization con un token del portador válido.
  • El token del portador tiene menos de una hora de antigüedad. Un token solo es válido por una hora.
  • Especificaste el nombre de socio correcto (con el parámetro de cadena de consulta partner). El valor es tu ID de socio único, no el nombre de socio que aparece en Hotel Ads Center. Si no conoces tu ID de socio, comunícate con tu administrador técnico de cuentas (TAM).
Not found Es probable que el extremo tenga errores de formato. Verifica que estás enviando una solicitud GET y que la URL de la solicitud sea válida (conforme a la sintaxis de la API a la que intentas acceder).
Invalid string value Una o más partes del extremo contienen sintaxis no válida. Por ejemplo, es posible que hayas escrito una parte de la ruta de forma incorrecta. Verifica que hayas usado los guiones bajos, las mayúsculas y la redacción correctos en toda la ruta de acceso.
Unsupported output format Este error ocurre con mayor frecuencia cuando se usa la API de Reports. Debes especificar "alt=csv" en la URL de tu solicitud GET. La API de informes no admite JSON.
AccessTokenRefreshError/Invalid grant Cuando ejecutas la app de Python de muestra, este error puede deberse a lo siguiente:
  • La dirección de correo electrónico de la cuenta de servicio es incorrecta. Revisa la cuenta de correo electrónico en Google Developers Console y asegúrate de que esté autorizada para acceder a la API.
  • La dirección de correo electrónico no tiene acceso a la API. Verifica que la dirección de correo electrónico esté autorizada para acceder a los datos de tus hoteles (que se comparten a través de Hotel Center).
  • El archivo de claves no es el correcto para la cuenta de servicio. Usa DevConsole para descargar un nuevo certificado .p12 y asegúrate de que tu app de Python apunte al correcto.
HotelAdsAPIConnection object has no attribute credentials Cuando se ejecuta la app de Python de muestra, la ruta al archivo .p12 es incorrecta.
Invalid scope Cuando ejecutas la app de Python de muestra, el permiso de la API debe ser https://www.googleapis.com/auth/travelpartner.
Forbidden El ID de la cuenta que usas es aquel para el que no tienes autorización para acceder. Si eres propietario de una cuenta secundaria, es posible que no puedas acceder al ID de la cuenta principal o raíz.