Looker utilise OAuth pour permettre aux applications clientes OAuth de s'authentifier auprès de l'API Looker sans exposer les ID client et les codes secrets au navigateur qui exécute l'application cliente OAuth.
Les applications Web qui utilisent OAuth doivent répondre aux exigences suivantes :
- L'authentification à l'aide d'OAuth n'est disponible que avec l'API Looker 4.0.
- Les applications clientes OAuth doivent d'abord être enregistrées auprès de Looker à l'aide de l'API pour que les utilisateurs de ces applications puissent s'authentifier dans Looker.
- Les applications clientes doivent utiliser le protocole HTTPS pour toutes les requêtes adressées à l'API Looker. Les applications clientes qui souhaitent utiliser les API
SubtleCrypto
fournies par le navigateur doivent être hébergées sur HTTPS.
Compatibilité CORS avec l'API Looker
L'API Looker peut être appelée dans un navigateur et entre différentes origines à l'aide du protocole Cross-Origin Resource Sharing (CORS). La prise en charge du CORS dans Looker présente les exigences suivantes:
- Seules les origines listées dans la liste d'autorisation de domaines intégrés peuvent appeler l'API via CORS.
Seuls les jetons d'accès obtenus via OAuth ou en appelant le point de terminaison de l'API
/login
peuvent être utilisés pour appeler l'API Looker à l'aide de CORS.Le point de terminaison de l'API
/login
ne peut pas être appelé à l'aide de requêtes CORS. Les applications clientes qui souhaitent appeler l'API Looker à l'aide de requêtes CORS doivent soit utiliser le processus de connexion OAuth décrit dans la section Se connecter avec un utilisateur à l'aide d'OAuth, soit récupérer un jeton à partir du serveur d'applications ou d'appels d'API non CORS.
Présentation de l'authentification OAuth
Voici une présentation du processus d'authentification OAuth :
- Enregistrez l'application cliente OAuth auprès de l'API Looker.
- Ajoutez l'origine de votre application cliente OAuth à la liste d'autorisation de domaines intégrée pour l'appel d'API Code Exchange et tous les appels d'API CORS suivants.
- Redirigez l'URL du navigateur vers le point de terminaison
/auth
sur le nom d'hôte de l'UI Looker (et non sur le nom d'hôte de l'API Looker) lorsque l'application cliente OAuth tente d'authentifier un utilisateur. Exemple :https://instance_name.looker.com
- Si l'utilisateur est authentifié et connecté à Looker, Looker renvoie immédiatement une redirection OAuth vers l'application cliente OAuth. Si l'utilisateur n'est pas déjà connecté à Looker sur l'appareil et dans le navigateur, l'écran de connexion à Looker s'affiche et l'utilisateur est invité à se connecter à son compte utilisateur Looker à l'aide de son protocole d'authentification habituel.
- À l'aide du code d'autorisation renvoyé dans la redirection OAuth, votre application cliente OAuth doit ensuite appeler le point de terminaison
/token
sur l'hôte de l'API Looker, par exemplehttps://instance_name.looker.com:19999
. Le nom d'hôte de l'API peut être identique ou différent du nom d'hôte de l'interface utilisateur Looker. Le point de terminaison/token
n'existe que sur l'hôte de l'API Looker, et le point de terminaison/auth
n'existe que sur l'hôte de l'UI Looker. - Si le code d'autorisation transmis au point de terminaison
/token
est valide, Looker renvoie une APIaccess_token
activée pour les requêtes d'API CORS à partir du domaine de l'application cliente OAuth.
Enregistrer une application cliente OAuth
Chaque application cliente OAuth qui tente de s'authentifier auprès de l'API Looker à l'aide d'OAuth doit d'abord être enregistrée auprès de l'instance Looker pour que Looker autorise l'accès. Pour enregistrer une application cliente OAuth:
- Ouvrez l'explorateur d'API dans votre instance Looker.
- Dans le menu déroulant "Version", choisissez la version 4.0 - stable de l'API.
Sous la méthode Auth, recherchez le point de terminaison de l'API
register_oauth_client_app()
. Vous pouvez également rechercher "application OAuth" dans le champ Rechercher. Vous pouvez utiliserregister_oauth_client_app()
pour enregistrer votre application cliente OAuth auprès de Looker. Cliquez sur le bouton Run It (Exécuter), saisissez les paramètres dans l'explorateur d'API, puis cliquez à nouveau sur Run It (Exécuter) pour enregistrer l'application cliente OAuth ou utilisez le point de terminaison de l'APIregister_oauth_client_app()
de manière programmatique. Les paramètresregister_oauth_client_app()
obligatoires sont les suivants:client_guid
: identifiant unique de l'applicationredirect_uri
: URI où l'application recevra une redirection OAuth incluant un code d'autorisation.display_name
: nom de l'application présenté aux utilisateurs de l'applicationdescription
: description de l'application qui s'affiche sur une page d'informations et de confirmation lorsqu'un utilisateur se connecte pour la première fois depuis l'application
Les valeurs des paramètres
client_guid
etredirect_uri
doivent correspondre exactement à celles fournies par l'application cliente OAuth. Dans le cas contraire, l'authentification sera refusée.
Connexion des utilisateurs à l'aide du protocole OAuth
Redirigez l'utilisateur vers le point de terminaison
/auth
sur l'hôte de l'UI. Exemple :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 tente d'authentifier l'utilisateur à l'aide du système d'authentification pour lequel l'instance Looker est configurée.
- Si l'utilisateur est déjà connecté à Looker dans le navigateur actuel (c'est-à-dire qu'il existe un état de cookie de connexion actif), il n'est pas invité à saisir ses identifiants de connexion.
- S'il s'agit de la première fois que cet utilisateur se connecte à l'aide de cette application cliente OAuth, Looker affiche une page d'informations et de confirmation que l'utilisateur doit lire et accepter. Le texte du paramètre
description
utilisé lors de l'enregistrement de l'application s'affiche. La description doit indiquer ce que l'application prévoit de faire avec le compte Looker de l'utilisateur. Lorsque l'utilisateur clique sur Accepter, la page est redirigée vers l'applicationredirect_uri
. - Si l'utilisateur est déjà connecté à Looker dans le navigateur actuel et qu'il a déjà accusé réception de la page de divulgation, la connexion OAuth est instantanée, sans interruption visuelle.
L'API Looker renvoie une redirection OAuth à l'application cliente OAuth. Enregistrez le code d'autorisation indiqué dans le paramètre URI. Voici un exemple d'URI de redirection OAuth :
https://mywebapp.com:3000/authenticated?&code=asdfasdfassdf&state=...
Le code d'autorisation est affiché après
&code=
dans l'URI. Dans cet exemple, le code d'autorisation estasdfasdfassdf
.Envoyez une requête Web au point de terminaison
/token
de l'API Looker, en transmettant le code d'autorisation et les informations de votre application. Exemple :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 réponse est positive, l'application cliente OAuth disposera d'une API
access_token
. La réponse contiendra également unrefresh_token
, que vous pourrez utiliser ultérieurement pour obtenir un nouvelaccess_token
sans interaction de l'utilisateur. La durée de vie d'unrefresh_token
est d'un mois. Stockez lerefresh_token
de manière sécurisée.Tous les jetons de ce système peuvent être révoqués à tout moment par l'administrateur Looker.