Autorización mediante la API

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

Configuración de OAuth 2.0

OAuth 2.0 requiere que te identifiques usando 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 obtener datos de solo lectura, como datos de informes de precios, hoteles y diagnóstico sobre tu feed de precios de hoteles.

Los tokens de acceso tienen una validez de 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.
  • Pasas un token de acceso de OAuth 2.0 en el encabezado HTTP Authorization cuando llamas a las APIs.

Sigue estos pasos a fin de configurar tu cuenta para usar OAuth 2.0 con Travel Partner API:

  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. Permite 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 de los desarrolladores de Google para administrar y ver los datos de tráfico, la autenticación y los datos de facturación de las APIs de Google que usan tus proyectos.

En DevConsole, un proyecto es una colección de configuraciones, credenciales y metadatos sobre las aplicaciones en las que estás trabajando y que usan las APIs de Google Developers y los recursos de Google Cloud.

DevConsole es donde administras estos aspectos de tu proyecto, como generar credenciales de API, activar APIs y administrar los datos del equipo y de facturación asociados con tu proyecto.

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

  1. Accede a tu Cuenta de Google o Gmail.

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

    fig1

  3. Haz clic en el botón CREAR PROYECTO. Dev Console muestra el cuadro de diálogo New Project:

    fig2

    Ingresa un nombre descriptivo para el proyecto nuevo en el campo de entrada Nombre del proyecto. Debajo del campo, Dev Console genera un ID del proyecto para ti que garantiza 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 tu proyecto nuevo.

  5. En el menú de navegación, selecciona APIs y servicios > Panel.

    fig3

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

    fig4

Para obtener más información, consulta Cómo administrar proyectos en Developers Console.

Cuando creas un proyecto nuevo, aún no tiene ninguna API asociada. En el siguiente paso, habilitarás Travel Partner API para tu proyecto nuevo.

Paso 2: Habilita el Travel Partner API para el proyecto nuevo

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

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

  1. Accede a la vista del 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. DevConsole muestra una descripción de 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 Hotel ahora 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 cuentas de servicio se usan en interacciones de servidor a servidor, como las entre una aplicación web y los datos de tu hotel.

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

  1. En la vista principal de la Consola de API de Google, haz clic en Credenciales en el panel de navegación izquierdo. Dev Console muestra la vista Credenciales.

    En la vista Credentials, se muestran los ID de cliente y las credenciales de tu proyecto. Tu aplicación utilizará 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 de cuenta de servicio.

    Puedes elegir el nombre 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. Se requiere P12.

    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 tu navegador almacena las descargas. Debes descargar el formato .p12 (binario), a diferencia 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 regresa 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 asociadas las siguientes credenciales:

    • 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: Es una dirección de correo electrónico generada para la cuenta de servicio, con el formato “account_name@project_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: Permite que la cuenta de servicio acceda a tus datos de Hotel Center

El paso final es proporcionarle 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. Proporciona acceso a esta cuenta mediante 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 mediante el formulario de contacto y solicita 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 quieres 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, tu cuenta de servicio debería habilitarse para el acceso a la API en un plazo 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 y la clave privada generadas por 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. La sintaxis para especificar un token de acceso en un encabezado HTTP es la siguiente:

Authorization: Bearer *oauth2_access_token*

El siguiente ejemplo incluye 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álida durante 1 hora después de generarla.

Solución de problemas

¿Tienes problemas? Realizar una verificación rápida de los siguientes elementos puede resolver el problema.

  1. ¿Creaste un proyecto en la 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 con el ID de cliente de una 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 haciendo 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 obtenido 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 muestran algunos errores comunes y posibles soluciones:

Error Descripción
Invalid credentials Esto podría significar varias cosas. Si encuentras este error, comprueba 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 el ID único de tu socio, no el nombre 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 tu extremo tenga errores de formato. Verifica que envíes una solicitud GET y que la URL de la solicitud sea válida (se ajuste a la sintaxis de la API a la que intentas acceder).
Invalid string value Una o más partes del extremo contienen una sintaxis no válida. Por ejemplo, es posible que hayas escrito mal parte de la ruta. Verifica si usaste los guiones bajos, las mayúsculas y la redacción correctos en toda la ruta.
Unsupported output format Este error suele ocurrir cuando se usa la API de informes. Debes especificar "alt=csv" en la URL de tu solicitud GET. La API de informes no admite JSON.
AccessTokenRefreshError/Invalid grant Cuando se ejecuta la aplicación de muestra de Python, este error puede deberse a los siguientes motivos:
  • La dirección de correo electrónico de tu cuenta de servicio es incorrecta. Verifica 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 tenga autorización para acceder a los datos de tus hoteles (compartidos 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 ejecutas la app de ejemplo de Python, la ruta a tu archivo .p12 es incorrecta.
Invalid scope Cuando ejecutes la app de ejemplo de Python, el permiso de la API debe ser https://www.googleapis.com/auth/travelpartner.
Forbidden El ID de la cuenta que usas es uno para el que no tienes autorización de acceso. Si eres propietario de una cuenta secundaria, es posible que no puedas acceder al ID de la cuenta principal o raíz.