Looker usa OAuth para permitir que las aplicaciones cliente de OAuth se autentiquen en la API de Looker sin exponer los IDs y los secretos de cliente al navegador que ejecuta la aplicación cliente de OAuth.
Las aplicaciones web que usan OAuth deben cumplir con los siguientes requisitos:
- La autenticación con OAuth solo está disponible con la API de Looker 4.0.
- Las aplicaciones cliente de OAuth primero deben registrarse en Looker a través de la API antes de que los usuarios de la aplicación puedan autenticarse en Looker.
- Las aplicaciones cliente deben usar HTTPS para todas las solicitudes a la API de Looker. Las aplicaciones cliente que deseen usar las APIs de
SubtleCrypto
proporcionadas por el navegador deben estar alojadas en HTTPS.
Compatibilidad de la API de Looker con CORS
La API de Looker admite llamadas en el navegador y entre orígenes con el protocolo Uso compartido de recursos multiorigen (CORS). La compatibilidad con CORS de Looker tiene los siguientes requisitos:
- Solo los orígenes que se indican en la lista de entidades permitidas de dominios incorporados pueden llamar a la API con CORS.
Solo se pueden usar los tokens de acceso obtenidos de OAuth o de la llamada extremo de API de
/login
para realizar llamadas a la API de Looker con CORS.No se puede llamar extremo de API
/login
con solicitudes de CORS. Las aplicaciones cliente que deseen llamar a la API de Looker con solicitudes de CORS deben usar el proceso de acceso de OAuth que se describe en Cómo realizar el acceso del usuario con OAuth o recuperar un token de tu servidor de aplicaciones o de llamadas a la API que no sean de CORS.
Descripción general de la autenticación de OAuth
A continuación, se incluye una descripción general del proceso de autenticación de OAuth:
- Registra la aplicación cliente de OAuth con la API de Looker.
- Agrega el origen de tu aplicación cliente de OAuth a la lista de entidades permitidas de dominios incorporados para la llamada a la API de intercambio de código y cualquier llamada posterior a la API de CORS.
- Redirige la URL del navegador al extremo
/auth
en el nombre de host de la IU de Looker (no en el nombre de host de la API de Looker) cuando la aplicación cliente de OAuth intenta autenticar a un usuario. Por ejemplo,https://instance_name.looker.com
- Si el usuario se autentica y accede a Looker correctamente, Looker devuelve de inmediato un redireccionamiento de OAuth a la aplicación cliente de OAuth. Si el usuario aún no accedió a Looker en el dispositivo y el navegador, se mostrará la pantalla de acceso de Looker y se le solicitará que acceda a su cuenta de usuario de Looker con su protocolo de autenticación habitual.
- Con el código de autorización que se devolvió en el redireccionamiento de OAuth, tu aplicación cliente de OAuth debe realizar una llamada al extremo
/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 igual o diferente del nombre de host de la IU de Looker. El extremo/token
solo existe en el host de la API de Looker, y el extremo/auth
solo existe en el host de la IU de Looker. - Si el código de autorización que se pasó al extremo
/token
es válido, Looker devuelve una APIaccess_token
habilitada para las solicitudes de la API de CORS desde el dominio de la aplicación cliente de OAuth.
Cómo registrar una aplicación cliente de OAuth
Todas las aplicaciones cliente de OAuth que intenten autenticarse en la API de Looker con OAuth primero deben registrarse en la instancia de Looker para que Looker autorice el acceso. Para registrar una aplicación cliente de OAuth, haz lo siguiente:
- Abre el Explorador de APIs en tu instancia de Looker.
- En el menú desplegable de versiones, elige la versión 4.0 - estable de la API.
En el método Auth, busca el extremo de API
register_oauth_client_app()
. También puedes buscar "app oauth" en el campo Buscar. Puedes usarregister_oauth_client_app()
para registrar tu aplicación cliente de OAuth en Looker. Haz clic en el botón Ejecutar, ingresa los parámetros en el Explorador de APIs y vuelve a hacer clic en Ejecutar para registrar la aplicación cliente de OAuth, o bien usa el extremo de API deregister_oauth_client_app()
de forma programática. Los parámetrosregister_oauth_client_app()
obligatorios son los siguientes:client_guid
: Es un ID único a nivel global para la aplicación.redirect_uri
: Es el URI en el que la aplicación recibirá un redireccionamiento de OAuth que incluye un código de autorización.display_name
: Es el nombre de la aplicación que se muestra a los usuarios de la aplicación.description
: Es una descripción de la aplicación que se muestra a los usuarios en una página de divulgación y confirmación cuando un usuario accede por primera vez desde la aplicación.
Los valores de los parámetros
client_guid
yredirect_uri
deben coincidir exactamente con los valores que proporcionará la aplicación cliente de OAuth, o se rechazará la autenticación.
Cómo realizar el acceso de usuarios con OAuth
Navega al usuario al extremo
/auth
en el host de la IU. 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 con el sistema de autenticación para el que está configurada la instancia de Looker.
- Si el usuario ya accedió a Looker en el navegador actual (es decir, hay un estado de cookie de acceso activo), no se le pedirá que ingrese sus credenciales de acceso.
- Si es la primera vez que este usuario accede con esta aplicación cliente de OAuth, Looker mostrará una página de divulgación y confirmación para que el usuario la reconozca y 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, la página lo redireccionará a la aplicaciónredirect_uri
. - Si el usuario ya accedió a Looker en el navegador actual y ya confirmó la página de divulgación, el acceso con OAuth es instantáneo y no hay interrupciones visuales.
La API de Looker devolverá un redireccionamiento de OAuth a la aplicación cliente de OAuth. Guarda el código de autorización que se indica en el parámetro URI. A continuación, se muestra un ejemplo de URI de redireccionamiento 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 esasdfasdfassdf
.Realiza una solicitud web al extremo
/token
en la API de 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 }
Una respuesta correcta proporcionará a la aplicación cliente de OAuth un
access_token
de la API. La respuesta también contendrá unrefresh_token
, que podrás usar más adelante para obtener un nuevoaccess_token
sin interacción del usuario. Unrefresh_token
tiene una vida útil de un mes. Almacena elrefresh_token
de forma segura.El administrador de Looker puede revocar todos los tokens de este sistema en cualquier momento.