Autenticación de la API de Looker mediante OAuth

Looker usa OAuth para permitir que las aplicaciones cliente de OAuth se autentiquen en la API de Looker sin exponer los IDs de cliente ni los secretos de cliente al navegador que ejecuta la aplicación cliente de OAuth.

Las aplicaciones web que usen OAuth deben cumplir los siguientes requisitos:

  • La autenticación mediante OAuth solo está disponible con la API Looker 4.0.
  • Las aplicaciones cliente de OAuth primero deben registrarse en Looker mediante la API para que los usuarios de la aplicación puedan autenticarse en Looker.
  • Las aplicaciones cliente deben usar HTTPS en todas las solicitudes a la API de Looker. Las aplicaciones cliente que quieran usar las APIs SubtleCrypto proporcionadas por el navegador deben estar alojadas en HTTPS.

Compatibilidad con CORS de la API de Looker

La API de Looker se puede llamar en el navegador y entre orígenes mediante el protocolo uso compartido de recursos entre dominios (CORS). La compatibilidad con CORS de Looker tiene los siguientes requisitos:

  • Solo los orígenes incluidos en la lista de permitidos de dominios insertados pueden llamar a la API mediante CORS.
  • Solo se pueden usar tokens de acceso obtenidos de OAuth o llamando al endpoint de la API /login para hacer llamadas a la API de Looker mediante CORS.

    No se puede llamar al endpoint de la API /login mediante solicitudes CORS. Las aplicaciones cliente que quieran llamar a la API de Looker mediante solicitudes CORS deben usar el proceso de inicio de sesión de OAuth descrito en Realizar el inicio de sesión de usuario con OAuth o recuperar un token de tu servidor de aplicaciones o de llamadas a la API que no sean CORS.

Descripción general de la autenticación OAuth

A continuación, se muestra un resumen del proceso de autenticación OAuth:

  1. Registra la aplicación cliente de OAuth en la API de Looker.
  2. Añade el origen de tu aplicación cliente de OAuth a la lista de permitidos de dominios insertados para la llamada a la API de intercambio de código y cualquier llamada a la API CORS posterior.
  3. Redirige la URL del navegador al endpoint /auth en el nombre de host de la interfaz de usuario de Looker (no en el nombre de host de la API de Looker) cuando la aplicación cliente de OAuth intente autenticar a un usuario. Por ejemplo, https://instance_name.looker.com.
  4. Si el usuario se autentica correctamente e inicia sesión en Looker, Looker devuelve inmediatamente una redirección de OAuth a la aplicación cliente de OAuth. Si el usuario aún no ha iniciado sesión en Looker en el dispositivo y el navegador, se muestra la pantalla de inicio de sesión de Looker y se le pide que inicie sesión en su cuenta de usuario de Looker con su protocolo de autenticación habitual.
  5. Con el código de autorización devuelto en la redirección de OAuth, tu aplicación cliente de OAuth debe hacer una llamada al endpoint /token en el nombre de host de la API de Looker, por ejemplo, https://instance_name.looker.com:19999. El nombre de host de la API puede ser el mismo que el nombre de host de la interfaz de Looker o diferente. El endpoint /token solo existe en el host de la API de Looker, mientras que el endpoint /auth solo existe en el host de la interfaz de Looker.
  6. Si el código de autorización enviado al endpoint /token es válido, Looker devuelve un access_token de la API que está habilitado para las solicitudes de la API CORS desde el dominio de la aplicación cliente de OAuth.

Registrar una aplicación cliente de OAuth

Todas las aplicaciones cliente de OAuth que intenten autenticarse en la API de Looker mediante OAuth deben registrarse primero en la instancia de Looker para que Looker autorice el acceso. Para registrar una aplicación cliente de OAuth, sigue estos pasos:

  1. Abre el Explorador de APIs en tu instancia de Looker.
  2. En el menú desplegable de versiones, elija la versión 4.0 - estable de la API.
  3. En el método Auth, busca el endpoint de la API register_oauth_client_app(). También puedes buscar "aplicación oauth" en el campo Buscar. Puedes usar register_oauth_client_app() para registrar tu aplicación cliente de OAuth en Looker. Haz clic en el botón Ejecutar, introduce los parámetros en el Explorador de APIs y vuelve a hacer clic en Ejecutar para registrar la aplicación cliente OAuth. También puedes usar el endpoint de la API register_oauth_client_app() de forma programática. Los parámetros obligatorios register_oauth_client_app() son los siguientes:

    • client_guid: ID único global de la aplicación.
    • redirect_uri: el URI en el que la aplicación recibirá una redirección de OAuth que incluye un código de autorización.
    • display_name: nombre de la aplicación que se muestra a los usuarios de la aplicación
    • description: descripción de la aplicación que se muestra a los usuarios en una página de divulgación y confirmación cuando inician sesión por primera vez desde la aplicación.

    Los valores de los parámetros client_guid y redirect_uri deben coincidir exactamente con los valores que proporcione la aplicación cliente de OAuth. De lo contrario, se denegará la autenticación.

Realizar el inicio de sesión de usuarios mediante OAuth

  1. Dirige al usuario al endpoint /auth en el host de la interfaz de usuario. Por ejemplo:

    async function oauth_login() {
      const code_verifier = secure_random(32)
      const code_challenge = await sha256_hash(code_verifier)
      const params = {
        response_type: 'code',
        client_id: '123456',
        redirect_uri: 'https://mywebapp.com:3000/authenticated',
        scope: 'cors_api',
        state: '1235813',
        code_challenge_method: 'S256',
        code_challenge: code_challenge,
      }
      const url = `${base_url}?${new URLSearchParams(params).toString()}` // Replace base_url with your full Looker instance's UI host URL, plus the `/auth` endpoint.
      log(url)
    
      // Stash the code verifier we created in sessionStorage, which
      // will survive page loads caused by login redirects
      // The code verifier value is needed after the login redirect
      // to redeem the auth_code received for an access_token
      //
      sessionStorage.setItem('code_verifier', code_verifier)
    
      document.location = url
    }
    
    function array_to_hex(array) {
      return Array.from(array).map(b => b.toString(16).padStart(2,'0')).join('')
    }
    
    function secure_random(byte_count) {
      const array = new Uint8Array(byte_count);
      crypto.getRandomValues(array);
      return array_to_hex(array)
    }
    
    async function sha256_hash(message) {
      const msgUint8 = new TextEncoder().encode(message)
      const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8)
      return base64.urlEncode(hashBuffer))  // Refers to the implementation of base64.encode stored at https://gist.github.com/jhurliman/1250118
    }
    

    Looker intentará autenticar al usuario mediante el sistema de autenticación para el que esté configurada la instancia de Looker.

    • Si el usuario ya ha iniciado sesión en Looker en el navegador actual (es decir, si hay una cookie de inicio de sesión activa), no se le pedirá que introduzca sus credenciales de inicio de sesión.
    • Si es la primera vez que este usuario inicia sesión con esta aplicación cliente de OAuth, Looker le mostrará una página de divulgación y confirmación para que la lea y la acepte. Se mostrará el texto del parámetro description que se usó cuando se registró la aplicación. La descripción debe indicar qué pretende hacer la aplicación con la cuenta de Looker del usuario. Cuando el usuario haga clic en Aceptar, se le redirigirá a la aplicación redirect_uri.
    • Si el usuario ya ha iniciado sesión en Looker en el navegador actual y ya ha aceptado la página de aviso, el inicio de sesión de OAuth es instantáneo y no hay ninguna interrupción visual.
  2. La API de Looker devolverá una redirección de OAuth a la aplicación cliente de OAuth. Guarda el código de autorización que aparece en el parámetro URI. A continuación, se muestra un ejemplo de URI de redirección de OAuth:

    https://mywebapp.com:3000/authenticated?&code=asdfasdfassdf&state=...
    

    El código de autorización se muestra después de &code= en el URI. En este ejemplo, el código de autorización es asdfasdfassdf.

  3. Haz una solicitud web al endpoint /token de la API Looker, pasando el código de autorización y la información de tu aplicación. Por ejemplo:

    async function redeem_auth_code(response_str) {
      const params = new URLSearchParams(response_str)
      const auth_code = params.get('code')
    
      if (!auth_code) {
        log('ERROR: No authorization code in response')
        return
      }
      log(`auth code received: ${auth_code}`)
      log(`state: ${params.get('state')}`)
    
      const code_verifier = sessionStorage.getItem('code_verifier')
      if (!code_verifier) {
        log('ERROR: Missing code_verifier in session storage')
        return
      }
      sessionStorage.removeItem('code_verifier')
      const response = await
      fetch('https://mycompany.looker.com:19999/api/token', {  // This is the URL of your Looker instance's API web service
        method: 'POST',
        mode: 'cors',    // This line is required so that the browser will attempt a CORS request.
        body: stringify({
          grant_type: 'authorization_code',
          client_id: '123456',
          redirect_uri: 'https://mywebapp.com:3000/authenticated',
          code: auth_code,
          code_verifier: code_verifier,
        }),
        headers: {
          'x-looker-appid': 'Web App Auth & CORS API Demo', // This header is optional.
          'Content-Type': 'application/json;charset=UTF-8'  // This header is required.
        },
      }).catch((error) => {
        log(`Error: ${error.message}`)
      })
    
      const info = await response.json()
      log(`/api/token response: ${stringify(info)}`)
    
      // Store the access_token and other info,
      // which in this example is done in sessionStorage
    
      const expires_at = new Date(Date.now() + (info.expires_in * 1000))
      info.expires_at = expires_at
      log(`Access token expires at ${expires_at.toLocaleTimeString()} local time.`)
      sessionStorage.setItem('access_info', stringify(info))
      access_info = info
    }
    

    Si la respuesta es correcta, la aplicación cliente de OAuth recibirá una API access_token. La respuesta también contendrá un refresh_token, que podrás usar más adelante para obtener un nuevo access_token sin interacción del usuario. Una refresh_token tiene una duración de un mes. Almacena el refresh_token de forma segura.

    El administrador de Looker puede revocar todos los tokens de este sistema en cualquier momento.