Looker verwendet OAuth, damit sich OAuth-Clientanwendungen bei der Looker API authentifizieren können, ohne dass Client-IDs und Clientschlüssel für den Browser freigegeben werden, in dem die OAuth-Clientanwendung ausgeführt wird.
Webanwendungen, die OAuth verwenden, müssen die folgenden Anforderungen erfüllen:
- Die Authentifizierung mit OAuth ist nur mit der Looker API 4.0 verfügbar.
- OAuth-Clientanwendungen müssen zuerst über die API bei Looker registriert werden, bevor sich Nutzer der Anwendung in Looker authentifizieren können.
- Clientanwendungen müssen HTTPS für alle Anfragen an die Looker API verwenden. Clientanwendungen, die die vom Browser bereitgestellten
SubtleCrypto
APIs verwenden möchten, müssen über HTTPS gehostet werden.
CORS-Unterstützung der Looker API
Die Looker API kann über das Protokoll Cross-Origin Resource Sharing (CORS) im Browser und über mehrere Ursprünge hinweg aufgerufen werden. Für die CORS-Unterstützung in Looker gelten die folgenden Anforderungen:
- Nur Ursprünge, die in der Zulassungsliste für eingebettete Domains aufgeführt sind, können die API über CORS aufrufen.
Nur Zugriffstokens, die über OAuth oder durch Aufrufen des
/login
API-Endpunkts abgerufen wurden, können verwendet werden, um die Looker API mit CORS aufzurufen.Der
/login
API-Endpunkt kann nicht mit CORS-Anfragen aufgerufen werden. Clientanwendungen, die die Looker API mithilfe von CORS-Anfragen aufrufen möchten, müssen entweder den unter Nutzeranmeldung mit OAuth beschriebenen OAuth-Anmeldeprozess verwenden oder ein Token von Ihrem Anwendungsserver oder über Aufrufe der Nicht-CORS API abrufen.
OAuth-Authentifizierung
Im Folgenden finden Sie einen Überblick über den OAuth-Authentifizierungsprozess:
- Registrieren Sie die OAuth-Clientanwendung bei der Looker API.
- Fügen Sie die Quelle Ihrer OAuth-Clientanwendung der Zulassungsliste für eingebettete Domains für den API-Aufruf zum Codeaustausch und alle nachfolgenden CORS-API-Aufrufe hinzu.
- Browser-URL an den
/auth
-Endpunkt des Looker-UI-Hostnamens (nicht den Looker API-Hostnamen) weiterleiten, wenn die OAuth-Clientanwendung versucht, einen Nutzer zu authentifizieren. Beispiel:https://instance_name.looker.com
. - Wenn der Nutzer erfolgreich authentifiziert und bei Looker angemeldet ist, gibt Looker sofort eine OAuth-Weiterleitung an die OAuth-Clientanwendung zurück. Wenn der Nutzer auf dem Gerät und im Browser noch nicht in Looker angemeldet ist, wird der Looker-Anmeldebildschirm angezeigt und der Nutzer wird aufgefordert, sich mit seinem regulären Authentifizierungsprotokoll in seinem Looker-Nutzerkonto anzumelden.
- Mit dem Autorisierungscode, der in der OAuth-Weiterleitung zurückgegeben wird, sollte Ihre OAuth-Clientanwendung als Nächstes einen Aufruf an den
/token
-Endpunkt des Looker API-Hostnamens senden, z. B.https://instance_name.looker.com:19999
. Der Hostname der API kann mit dem Hostnamen der Looker-Benutzeroberfläche identisch sein oder davon abweichen. Der Endpunkt/token
ist nur auf dem Looker API-Host und der Endpunkt/auth
nur auf dem Host der Looker-Benutzeroberfläche vorhanden. - Wenn der Autorisierungscode, der an den
/token
-Endpunkt übergeben wurde, gültig ist, gibt Looker eine APIaccess_token
zurück, die für CORS-API-Anfragen aus der Domain der OAuth-Clientanwendung aktiviert ist.
OAuth-Clientanwendung registrieren
Jede OAuth-Clientanwendung, die versucht, sich mit OAuth bei der Looker API zu authentifizieren, muss zuerst bei der Looker-Instanz registriert werden, bevor Looker den Zugriff autorisiert. So registrieren Sie eine OAuth-Clientanwendung:
- Öffnen Sie den API Explorer in Ihrer Looker-Instanz.
- Wählen Sie im Drop-down-Menü „Version“ die Version 4.0 – stabil der API aus.
Suchen Sie unter der Methode Auth den API-Endpunkt
register_oauth_client_app()
. Sie können auch im Feld Suchen nach „oauth app“ suchen. Sie können Ihre OAuth-Clientanwendung mitregister_oauth_client_app()
bei Looker registrieren. Klicken Sie auf die Schaltfläche Run It (Ausführen), geben Sie die Parameter in den API Explorer ein und klicken Sie noch einmal auf Run It (Ausführen), um die OAuth-Clientanwendung zu registrieren, oder verwenden Sie denregister_oauth_client_app()
API-Endpunkt programmatisch. Die erforderlichenregister_oauth_client_app()
-Parameter sind:client_guid
: Eine global eindeutige ID für die Anwendungredirect_uri
: Der URI, unter dem die Anwendung eine OAuth-Weiterleitung mit einem Autorisierungscode erhältdisplay_name
: Der Name der Anwendung, der den Nutzern der Anwendung angezeigt wirddescription
: Eine Beschreibung der Anwendung, die Nutzern auf einer Offenlegungs- und Bestätigungsseite angezeigt wird, wenn sich ein Nutzer zum ersten Mal über die Anwendung anmeldet
Die Werte in den Parametern
client_guid
undredirect_uri
müssen mit den Werten übereinstimmen, die die OAuth-Clientanwendung genau bereitstellt. Andernfalls wird die Authentifizierung verweigert.
Nutzeranmeldung mit OAuth
Rufen Sie den Nutzer zum
/auth
-Endpunkt auf dem UI-Host auf. Beispiel: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 versucht, den Nutzer mit dem Authentifizierungssystem zu authentifizieren, für das die Looker-Instanz konfiguriert ist.
- Wenn der Nutzer im aktuellen Browser bereits bei Looker angemeldet ist (d. h., es gibt einen Cookie-Status für die Live-Anmeldung), wird er nicht zur Eingabe seiner Anmeldedaten aufgefordert.
- Wenn sich dieser Nutzer zum ersten Mal über diese OAuth-Clientanwendung angemeldet hat, wird in Looker eine Offenlegungs- und Bestätigungsseite angezeigt, auf der der Nutzer dies bestätigen und akzeptieren kann. Es wird der Text aus dem Parameter
description
angezeigt, der bei der Registrierung der Anwendung verwendet wurde. Die Beschreibung sollte angeben, was die Anwendung mit dem Looker-Konto des Benutzers tun möchte. Wenn der Nutzer auf Akzeptieren klickt, wird die Seite zur Appredirect_uri
weitergeleitet. - Wenn der Nutzer im aktuellen Browser bereits bei Looker angemeldet und die Offenlegungsseite bereits bestätigt hat, erfolgt die OAuth-Anmeldung sofort und ohne visuelle Unterbrechung.
Die Looker API gibt eine OAuth-Weiterleitung an die OAuth-Clientanwendung zurück. Speichere den Autorisierungscode, der im URI-Parameter aufgeführt ist. Hier sehen Sie ein Beispiel für einen OAuth-Weiterleitungs-URI:
https://mywebapp.com:3000/authenticated?&code=asdfasdfassdf&state=...
Der Autorisierungscode wird im URI nach
&code=
angezeigt. In diesem Beispiel lautet der Autorisierungscodeasdfasdfassdf
.Stellen Sie eine Webanfrage an den Endpunkt
/token
in der Looker API und übergeben Sie den Autorisierungscode und Ihre Anwendungsinformationen. Beispiel: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 }
Bei einer erfolgreichen Antwort wird der OAuth-Clientanwendung ein API-
access_token
bereitgestellt. Die Antwort enthält auch einrefresh_token
, mit dem Sie später ohne Nutzerinteraktion ein neuesaccess_token
abrufen können. Einrefresh_token
hat eine Lebensdauer von einem Monat. Bewahrerefresh_token
an einem sicheren Ort auf.Alle Tokens in diesem System können jederzeit vom Looker-Administrator widerrufen werden.