Looker utilizza OAuth per consentire l'autenticazione delle applicazioni client OAuth nell'API Looker senza esporre i client ID e i client secret al browser che esegue l'applicazione client OAuth.
Le applicazioni web che utilizzano OAuth devono soddisfare i seguenti requisiti:
- L'autenticazione con OAuth è disponibile solo con l'API Looker 4.0.
- Prima che gli utenti dell'applicazione possano eseguire l'autenticazione in Looker, è necessario che le applicazioni client OAuth vengano registrate con Looker.
- Le applicazioni client devono utilizzare HTTPS per tutte le richieste all'API Looker. Le applicazioni client che vogliono utilizzare le API
SubtleCrypto
fornite dal browser devono essere ospitate su HTTPS.
Supporto CORS dell'API Looker
L'API Looker supporta la chiamata a browser e in più origini utilizzando il protocollo CORS (Cross-Origin Resource Sharing). Il supporto per CORS di Looker prevede i seguenti requisiti:
- Solo le origini elencate nella lista consentita dei domini incorporati possono chiamare l'API utilizzando CORS.
Solo i token di accesso ottenuti da OAuth o provenienti da chiamate all'endpoint API
/login
possono essere utilizzati per effettuare chiamate all'API Looker utilizzando CORS.L'endpoint API
/login
non può essere chiamato utilizzando le richieste CORS. Le applicazioni client che vogliono chiamare l'API Looker utilizzando le richieste CORS devono utilizzare la procedura di accesso OAuth descritta in Eseguire l'accesso utente utilizzando OAuth o recuperare un token dal server delle applicazioni o dalle chiamate API non CORS.
Panoramica dell'autenticazione OAuth
Di seguito è riportata una panoramica del processo di autenticazione OAuth:
- Registra l'applicazione client OAuth con l'API Looker.
- Aggiungi l'origine della tua applicazione client OAuth alla lista consentita del dominio incorporato per la chiamata API di scambio di codice e per eventuali chiamate API CORS successive.
- Reindirizza l'URL del browser all'endpoint
/auth
nel nome host dell'interfaccia utente di Looker (non al nome host dell'API Looker) quando l'applicazione client OAuth tenta di autenticare un utente. Ad esempio,https://instance_name.looker.com
. - Se l'utente viene autenticato e ha eseguito l'accesso a Looker, Looker restituisce immediatamente un reindirizzamento OAuth all'applicazione client OAuth. Se l'utente non ha già eseguito l'accesso a Looker sul dispositivo e nel browser correnti, viene visualizzata la schermata di accesso di Looker e viene chiesto all'utente di accedere al proprio account utente Looker utilizzando il proprio protocollo di autenticazione.
- Utilizzando il codice di autorizzazione restituito nel reindirizzamento OAuth, la tua applicazione client OAuth dovrebbe poi effettuare una chiamata all'endpoint
/token
sul nome host dell'API Looker, ad esempiohttps://instance_name.looker.com:19999
. Il nome host dell'API potrebbe essere uguale o diverso dal nome host dell'interfaccia utente di Looker. L'endpoint/token
esiste solo nell'host dell'API Looker e l'endpoint/auth
esiste solo nell'host dell'interfaccia utente di Looker. - Se il codice di autorizzazione trasmesso all'endpoint
/token
è valido, Looker restituisce un'APIaccess_token
abilitata per le richieste API CORS dal dominio dell'applicazione client OAuth.
Registrazione di un'applicazione client OAuth
Prima che Looker autorizzi l'accesso, ogni applicazione client OAuth che tenta di eseguire l'autenticazione nell'API Looker utilizzando OAuth deve essere registrata con l'istanza di Looker. Per registrare un'applicazione client OAuth:
- Apri Explorer API nella tua istanza di Looker.
- Dal menu a discesa della versione, scegli la versione 4.0 - stabile dell'API.
Nel metodo Auth, trova l'endpoint API
register_oauth_client_app()
. Puoi anche cercare "app OAuth" nel campo Cerca. Puoi utilizzareregister_oauth_client_app()
per registrare l'applicazione client OAuth con Looker. Fai clic sul pulsante Esegui e inserisci i parametri in Explorer API e fai nuovamente clic su Esegui per registrare l'applicazione client OAuth oppure utilizza l'endpoint APIregister_oauth_client_app()
in modo programmatico. I parametriregister_oauth_client_app()
obbligatori sono:client_guid
: un ID univoco globale per l'applicazioneredirect_uri
: l'URI in cui l'applicazione riceverà un reindirizzamento OAuth che include un codice di autorizzazionedisplay_name
: il nome dell'applicazione mostrata agli utenti dell'applicazionedescription
: una descrizione dell'applicazione che viene mostrata agli utenti in un'informativa e in una pagina di conferma quando un utente accede per la prima volta dall'applicazione.
I valori dei parametri
client_guid
eredirect_uri
devono corrispondere ai valori che l'applicazione client OAuth fornirà esattamente, altrimenti l'autenticazione verrà rifiutata.
Eseguire l'accesso utente tramite OAuth
Vai all'endpoint
/auth
nell'host dell'interfaccia utente. Ecco alcuni esempi: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 }
Il codice campione sopra riportato si basa sulle
SubtleCrypto
API fornite dal browser, ma il browser consentirà l'utilizzo di queste funzioni solo dalle pagine web protette (HTTPS).Looker tenterà di autenticare l'utente utilizzando il sistema di autenticazione per cui è configurata l'istanza di Looker.
- Se l'utente ha già eseguito l'accesso a Looker nel browser corrente (ossia lo stato di un cookie di accesso in tempo reale), non gli verrà chiesto di inserire le sue credenziali di accesso.
- Se è la prima volta che questo utente esegue l'accesso utilizzando questa applicazione client OAuth, Looker mostrerà una pagina informativa e di conferma per l'utente da confermare e accettare. Verrà visualizzato il testo del parametro
description
utilizzato al momento della registrazione dell'applicazione. La descrizione dovrebbe indicare l'obiettivo dell'applicazione con l'account Looker dell'utente. Quando l'utente fa clic su Accetto, la pagina verrà reindirizzata all'applicazioneredirect_uri
. - Se l'utente ha già eseguito l'accesso a Looker nel browser corrente e ha già confermato la pagina dell'informativa, l'accesso ad OAuth è istantaneo senza interruzioni visive.
L'API Looker restituirà un reindirizzamento OAuth all'applicazione client OAuth. Salva il codice di autorizzazione elencato nel parametro URI. Di seguito è riportato un esempio di URI di reindirizzamento OAuth:
https://mywebapp.com:3000/authenticated?&code=asdfasdfassdf&state=...
Il codice di autorizzazione viene visualizzato dopo
&code=
nell'URI. Nell'esempio precedente, il codice di autorizzazione èasdfasdfassdf
.Effettua una richiesta web all'endpoint
/token
nell'API Looker, trasmettendo il codice di autorizzazione e le informazioni dell'applicazione. Ecco alcuni esempi: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 risposta corretta fornirà all'applicazione client OAuth un'API
access_token
. La risposta conterrà anche unrefresh_token
, che puoi utilizzare in seguito per ottenere un nuovoaccess_token
senza interazione dell'utente.refresh_token
ha una durata di un mese. Conservarefresh_token
in modo sicuro.Tutti i token in questo sistema possono essere revocati dall'amministratore di Looker in qualsiasi momento.