Looker API-Authentifizierung mit OAuth

Looker verwendet OAuth, damit OAuth-Clientanwendungen sich bei der Looker API authentifizieren können, ohne Client-IDs und Clientschlüssel an den Browser weiterzugeben, in dem die OAuth-Clientanwendung ausgeführt wird.

Webanwendungen, die OAuth verwenden, müssen die folgenden Anforderungen erfüllen:

  • Eine Authentifizierung mit OAuth ist nur mit der Looker API 4.0 möglich.
  • OAuth-Clientanwendungen müssen zuerst über die API bei Looker registriert werden, bevor Nutzer der Anwendung sich bei 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 HTTPS-gehostet sein.

CORS-Unterstützung der Looker API

Die Looker API unterstützt das Cross-Origin Resource Sharing (CORS)-Protokoll im Browser und ursprungsübergreifend. Für den CORS-Support von 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.
  • Für Aufrufe der Looker API mit CORS können nur Zugriffstokens verwendet werden, die über OAuth oder den API-Endpunkt /login abgerufen wurden.

    Der API-Endpunkt /login 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:

  1. Registrieren Sie die OAuth-Clientanwendung bei der Looker API.
  2. Fügen Sie den Ursprung Ihrer OAuth-Clientanwendung für den Code Exchange API-Aufruf und alle nachfolgenden CORS API-Aufrufe Ihrer Zulassungsliste für eingebettete Domains hinzu.
  3. 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.
  4. Wenn der Nutzer erfolgreich authentifiziert und bei Looker angemeldet ist, gibt Looker sofort eine OAuth-Weiterleitung an die OAuth-Clientanwendung zurück. Wenn der Benutzer auf dem Gerät und im Browser noch nicht bei Looker angemeldet ist, wird der Anmeldebildschirm von Looker angezeigt und der Benutzer wird aufgefordert, sich mit seinem regulären Authentifizierungsprotokoll in seinem Looker-Nutzerkonto anzumelden.
  5. 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 Looker-UI-Hostnamen übereinstimmen 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.
  6. Wenn der an den Endpunkt /token übergebene Autorisierungscode gültig ist, gibt Looker eine access_token der API zurück, die für CORS API-Anfragen von 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:

  1. Öffnen Sie auf der Looker-Instanz den API Explorer.
  2. Wählen Sie im Drop-down-Menü „Version“ die API-Version 4.0 - Stable aus.
  3. 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 register_oauth_client_app() verwenden, um Ihre OAuth-Clientanwendung bei Looker zu 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 den register_oauth_client_app() API-Endpunkt programmatisch. Die erforderlichen register_oauth_client_app()-Parameter sind:

    • client_guid: Eine global eindeutige ID für die Anwendung
    • redirect_uri: URI, an den die Anwendung eine OAuth-Weiterleitung mit einem Autorisierungscode empfängt
    • display_name: Der Name der Anwendung, der den Nutzern der Anwendung angezeigt wird
    • description: 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 und redirect_uri müssen mit den Werten übereinstimmen, die die OAuth-Clientanwendung genau bereitstellt. Andernfalls wird die Authentifizierung verweigert.

Nutzeranmeldung mit OAuth ausführen

  1. 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 der Nutzer 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 App redirect_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.
  2. Die Looker API gibt eine OAuth-Weiterleitung an die OAuth-Clientanwendung zurück. Speichern Sie 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 Autorisierungscode asdfasdfassdf.

  3. 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 ein refresh_token, mit dem Sie später eine neue access_token ohne Nutzerinteraktion abrufen können. Ein refresh_token hat eine Lebensdauer von einem Monat. Bewahre refresh_token an einem sicheren Ort auf.

    Alle Tokens in diesem System können jederzeit vom Looker-Administrator widerrufen werden.