Einbettung ohne Cookies

Wenn Looker mithilfe von signierter Einbettung in einen iFrame eingebettet wird, verwenden einige Browser standardmäßig eine Cookierichtlinie, die Cookies von Drittanbietern blockiert. Drittanbieter-Cookies werden abgelehnt, wenn der eingebettete iFrame von einer anderen Domain geladen wird als die Domain, von der die eingebettete Anwendung geladen wird. Diese Einschränkung können Sie im Allgemeinen umgehen, indem Sie eine Vanity-Domain anfordern und verwenden. Vanity-Domains können jedoch in einigen Szenarien nicht verwendet werden. In diesen Fällen kann die Looker-Einbettung ohne Cookies verwendet werden.

Wie funktioniert das Einbetten ohne Cookies?

Wenn Drittanbieter-Cookies nicht blockiert werden, wird ein Sitzungscookie erstellt, wenn sich ein Nutzer zum ersten Mal in Looker anmeldet. Dieses Cookie wird mit jeder Nutzeranfrage gesendet und der Looker-Server verwendet es, um die Identität des Nutzers zu ermitteln, der die Anfrage initiiert hat. Wenn Cookies blockiert sind, wird das Cookie nicht mit einer Anfrage gesendet. Der Looker-Server kann daher den Nutzer nicht identifizieren, der mit der Anfrage verknüpft ist.

Um dieses Problem zu lösen, werden bei der benutzerdefinierten Looker-Einbettung ohne Cookies Tokens mit jeder Anfrage verknüpft, mit denen die Nutzersitzung auf dem Looker-Server neu erstellt werden kann. Es liegt in der Verantwortung der Einbettungsanwendung, diese Tokens abzurufen und für die Looker-Instanz verfügbar zu machen, die im eingebetteten iFrame ausgeführt wird. Der Abruf und die Bereitstellung dieser Tokens werden im Folgenden beschrieben.

Für die Verwendung einer der beiden APIs muss sich die Anwendung, in die eingebettet werden soll, mit Administratorberechtigungen in der Looker API authentifizieren können. Die Domain für die Einbettung muss außerdem entweder in der Zulassungsliste für Domains für die Einbettung aufgeführt sein oder, wenn Looker 23.8 oder höher verwendet wird, kann die Domain für die Einbettung bei der Erfassung der Sitzung ohne Cookies enthalten sein.

Looker-Einbettungs-iFrame erstellen

Das folgende Sequenzdiagramm veranschaulicht das Erstellen eines eingebetteten Iframes. Mehrere Iframes können entweder gleichzeitig oder zu einem späteren Zeitpunkt generiert werden. Bei korrekter Implementierung nimmt der iFrame automatisch an der Sitzung teil, die vom ersten iFrame erstellt wurde. Das Looker Embed SDK vereinfacht diesen Prozess, da die vorhandene Sitzung automatisch beigetreten wird.

Ein Sequenzdiagramm, das die Erstellung eines eingebetteten Iframes veranschaulicht

  1. Der Nutzer führt eine Aktion in der Einbettungsanwendung aus, die zum Erstellen eines Looker-Iframes führt.
  2. Der Client der eingebetteten Anwendung ruft eine Looker-Sitzung ab. Das Looker Embed SDK kann zum Initiieren dieser Sitzung verwendet werden. Dafür muss jedoch eine Endpunkt-URL oder eine Callback-Funktion angegeben werden. Wenn eine Callback-Funktion verwendet wird, wird der Einbettungs-Anwendungsserver aufgerufen, um die Looker-Einbettungssitzung abzurufen. Andernfalls ruft das Embed SDK die angegebene Endpunkt-URL auf.
  3. Der Einbettungsanwendungsserver verwendet die Looker-API, um eine Einbettungssitzung zu übernehmen. Dieser API-Aufruf ähnelt dem Signaturprozess für eingebettete Looker-Objekte, da die Definition des Nutzers für das Einbetten als Eingabe akzeptiert wird. Wenn für den anrufenden Nutzer bereits eine eingebettete Looker-Sitzung vorhanden ist, sollte das zugehörige Sitzungsreferenztoken in den Aufruf aufgenommen werden. Dies wird im Abschnitt Sitzung gewinnen dieses Dokuments ausführlicher erläutert.
  4. Die Verarbeitung des Endpunkts „acquire embed session“ ähnelt dem signierten /login/embed/{signed url)-Endpunkt, da die Definition des Looker-Eingebetteten Nutzers im Textkörper der Anfrage und nicht in der URL erwartet wird. Beim Ablauf zum Abrufen des Endpunkts für die Einbettungssitzung wird der Einbettungsnutzer validiert und erstellt oder aktualisiert. Sie kann auch ein vorhandenes Sitzungsreferenztoken akzeptieren. Das ist wichtig, da mehrere eingebettete Looker-iFrames dieselbe Sitzung verwenden können. Der Einbettungsnutzer wird nicht aktualisiert, wenn ein Sitzungsreferenztoken angegeben wird und die Sitzung noch nicht abgelaufen ist. Dies unterstützt den Anwendungsfall, bei dem ein Iframe mit einer signierten Einbettungs-URL und andere Iframes ohne signierte Einbettungs-URL erstellt werden. In diesem Fall wird das Cookie aus der ersten Sitzung an die Iframes ohne signierte Embed-URLs weitergegeben.
  5. Der Looker API-Aufruf gibt vier Tokens mit jeweils einer Gültigkeitsdauer (TTL) zurück:
    • Autorisierungstoken (TTL = 30 Sekunden)
    • Navigations-Token (TTL = 10 Minuten)
    • API-Token (TTL = 10 Minuten)
    • Sitzungsreferenztoken (TTL = verbleibende Lebensdauer der Sitzung)
  6. Der Anwendungsserver für das Einbetten muss die von den Looker-Daten zurückgegebenen Daten im Blick behalten und sie sowohl dem aufrufenden Nutzer als auch dem User-Agent des Browsers des aufrufenden Nutzers zuordnen. Vorschläge dazu finden Sie in diesem Dokument im Abschnitt Tokens generieren. Bei diesem Aufruf werden das Autorisierungstoken, ein Navigationstoken und ein API-Token sowie alle zugehörigen TTLs zurückgegeben. Das Sitzungsreferenztoken sollte gesichert und nicht im aufrufenden Browser offengelegt werden.
  7. Nachdem die Tokens an den Browser zurückgegeben wurden, muss eine Log-in-URL für die Einbettung von Looker erstellt werden. Das Looker Embed SDK erstellt automatisch die eingebettete Anmelde-URL. Informationen zum Erstellen der eingebetteten Log-in-URL mithilfe der windows.postMessage API finden Sie in diesem Dokument im Abschnitt Looker windows.postMessage API verwenden.

    Die Log-in-URL enthält nicht die Nutzerdetails zum signierten Einbetten. Es enthält den Ziel-URI, einschließlich des Navigationstokens und des Autorisierungstokens als Abfrageparameter. Das Autorisierungstoken muss innerhalb von 30 Sekunden verwendet werden und kann nur einmal verwendet werden. Wenn zusätzliche iFrames erforderlich sind, muss wieder eine Einbettungssitzung abgerufen werden. Wenn jedoch das Sitzungsreferenztoken angegeben ist, wird das Autorisierungstoken derselben Sitzung zugeordnet.

  8. Der Anmeldeendpunkt von Looker bestimmt, ob die Anmeldung für die Einbettung ohne Cookies erfolgt. Dies wird durch das Vorhandensein des Autorisierungstokens angegeben. Wenn das Autorisierungstoken gültig ist, wird Folgendes geprüft:

    • Die verknüpfte Sitzung ist noch gültig.
    • Der verknüpfte Nutzer für das Einbetten ist weiterhin gültig.
    • Der Browser-User-Agent, der mit der Anfrage verknüpft ist, stimmt mit dem Browser-Agent überein, der mit der Sitzung verknüpft ist.
  9. Wenn die Prüfungen aus dem vorherigen Schritt bestanden werden, wird die Anfrage über den Ziel-URI weitergeleitet, der in der URL enthalten ist. Das ist derselbe Vorgang wie bei der Anmeldung für eingebettete Looker-Inhalte.

  10. Diese Anforderung ist die Weiterleitung zum Starten des Looker-Dashboards. Diese Anfrage enthält das Navigationstoken als Parameter.

  11. Bevor der Endpunkt ausgeführt wird, sucht der Looker-Server in der Anfrage nach dem Navigationstoken. Wenn der Server das Token findet, prüft er Folgendes:

    • Die verknüpfte Sitzung ist noch gültig.
    • Der Browser-User-Agent, der mit der Anfrage verknüpft ist, stimmt mit dem Browser-Agent überein, der mit der Sitzung verknüpft ist.

    Wenn gültig, wird die Sitzung für die Anfrage wiederhergestellt und die Dashboard-Anfrage wird ausgeführt.

  12. Die HTML-Datei zum Laden des Dashboards wird an den iFrame zurückgegeben.

  13. Die Looker-Benutzeroberfläche, die im iFrame ausgeführt wird, erkennt, dass die Dashboard-HTML-Datei eine Antwort ohne Cookies ist. Die Looker-Benutzeroberfläche sendet dann eine Nachricht an die Einbettungsanwendung, in der die in Schritt 6 abgerufenen Tokens angefordert werden. Die UI wartet dann, bis sie die Tokens empfängt. Wenn die Tokens nicht ankommen, wird eine Nachricht angezeigt.

  14. Die Anwendung, in die Looker eingebettet ist, sendet die Tokens an den eingebetteten iFrame von Looker.

  15. Wenn die Tokens empfangen werden, startet die Looker-Benutzeroberfläche, die im iFrame ausgeführt wird, den Prozess zum Rendern des Anfrageobjekts. Während dieses Vorgangs sendet die Benutzeroberfläche API-Aufrufe an den Looker-Server. Das in Schritt 15 erhaltene API-Token wird automatisch als Header in alle API-Anfragen eingeschleust.

  16. Bevor ein Endpunkt ausgeführt wird, sucht der Looker-Server in der Anfrage nach dem API-Token. Wenn der Server das Token findet, prüft er Folgendes:

    • Die zugehörige Sitzung ist noch gültig.
    • Der Browser-User-Agent, der mit der Anfrage verknüpft ist, stimmt mit dem Browser-Agent überein, der mit der Sitzung verknüpft ist.

    Wenn die Sitzung gültig ist, wird sie für die Anfrage wiederhergestellt und die API-Anfrage wird ausgeführt.

  17. Dashboard-Daten werden zurückgegeben.

  18. Das Dashboard wird gerendert.

  19. Der Nutzer hat die Kontrolle über das Dashboard.

Neue Tokens generieren

Das folgende Sequenzdiagramm veranschaulicht die Generierung neuer Tokens.

Ein Sequenzdiagramm, das das Generieren neuer Tokens veranschaulicht.

  1. Die Looker-Benutzeroberfläche, die im eingebetteten iFrame ausgeführt wird, überwacht die TTL der Einbettungstokens.
  2. Wenn sich die Tokens nähern, sendet die Looker-Benutzeroberfläche eine Aktualisierungstoken-Nachricht an den Einbettungs-Anwendungsclient.
  3. Der Client für die Einbettungsanwendung fordert dann neue Tokens von einem Endpunkt an, der im Einbettungsanwendungsserver implementiert ist. Das Looker Embed SDK fordert automatisch neue Tokens an. Die Endpunkt-URL oder eine Rückruffunktion muss jedoch angegeben werden. Wenn die Callback-Funktion verwendet wird, ruft sie den Einbettungs-Anwendungsserver auf, um neue Tokens zu generieren. Andernfalls ruft das Embed SDK die angegebene Endpunkt-URL auf.
  4. Die Einbettungsanwendung findet die session_reference_token, die der Einbettungssitzung zugeordnet ist. Im Beispiel im Git-Repository für das Looker Embed SDK werden Sitzungscookies verwendet. Es kann aber auch ein verteilter serverseitiger Cache wie z. B. Redis verwendet werden.
  5. Der eingebettete Anwendungsserver ruft den Looker-Server mit einer Anfrage auf, um Tokens zu generieren. Für diese Anfrage sind neben dem User-Agent des Browsers, der die Anfrage initiiert hat, auch aktuelle API- und Navigationstokens erforderlich.
  6. Der Looker-Server validiert den User-Agent, das Sitzungsreferenztoken, das Navigationstoken und das API-Token. Wenn die Anfrage gültig ist, werden neue Tokens generiert.
  7. Die Tokens werden an den anfragenden Server der eingebetteten Anwendung zurückgegeben.
  8. Der Server der eingebetteten Anwendung entfernt das Sitzungsreferenztoken aus der Antwort und gibt die verbleibende Antwort an den Client der eingebetteten Anwendung zurück.
  9. Der Client der eingebetteten Anwendung sendet die neu generierten Tokens an die Looker-Benutzeroberfläche. Das Looker Embed SDK erledigt das automatisch. Das Einbetten von Anwendungsclients, die die windows.postMessage API verwenden, sind für das Senden der Tokens zuständig. Sobald die Looker-Benutzeroberfläche die Tokens empfangen hat, werden sie in nachfolgenden API-Aufrufen und Seitennavigationen verwendet.

Looker-Einbettung ohne Cookies implementieren

Die Einbettung von Looker ohne Cookies kann entweder mit dem Looker Embed SDK oder der windows.postMessage API implementiert werden. Die Methode, bei der das Looker Embed SDK verwendet wird, ist einfacher, aber es gibt auch ein Beispiel, das zeigt, wie die windows.postMessage API verwendet wird. Ausführliche Erläuterungen zu beiden Implementierungen finden Sie in der README-Datei zum Embed SDK. Das Git-Repository des Embed SDK enthält auch funktionierende Implementierungen.

Looker-Instanz konfigurieren

Die Einbettung ohne Cookies ist mit der signierten Einbettung von Looker vergleichbar. Für die Einbettung ohne Cookies muss SSO-Authentifizierung einbetten aktiviert sein. Im Gegensatz zur signierten Einbettung von Looker wird bei Einbettungen ohne Cookies die Einstellung Secret einbetten jedoch nicht verwendet. Bei der Einbettung ohne Cookies wird ein JSON Web Token (JWT) in Form der Einstellung JWT einbetten verwendet. Diese Einstellung kann im Menü Admin auf der Seite Einbetten im Abschnitt Plattform festgelegt oder zurückgesetzt werden.

Das Festlegen des JWT-Secrets ist nicht erforderlich, da beim ersten Versuch, eine Einbettungssitzung ohne Cookies zu erstellen, das JWT erstellt wird. Setze dieses Token nicht zurück, da dadurch alle aktiven Einbettungssitzungen ohne Cookies ungültig werden.

Im Gegensatz zum Einbettungs-Secret wird das Einbettungs-JWT-Secret nie offengelegt, da es nur intern auf dem Looker-Server verwendet wird.

Anwendungsclient-Implementierung

Dieser Abschnitt enthält Beispiele für die Implementierung einer Einbettung ohne Cookies im Anwendungsclient. Er umfasst die folgenden Unterabschnitte:

Looker Embed SDK installieren oder aktualisieren

Die folgenden Looker SDK-Versionen sind für die Einbettung ohne Cookies erforderlich:

@looker/embed-sdk >= 1.8
@looker/sdk >= 22.16.0

Looker Embed SDK verwenden

Dem Embed SDK wurde eine neue Initialisierungsmethode hinzugefügt, um die Sitzung ohne Cookies zu initiieren. Diese Methode akzeptiert entweder zwei URL-Strings oder zwei Rückruffunktionen. Die URL-Strings sollten auf Endpunkte im Anwendungsserver des Einbettungstools verweisen. Implementierungsdetails dieser Endpunkte auf dem Anwendungsserver finden Sie im Abschnitt Implementierung des Anwendungsservers dieses Dokuments.

LookerEmbedSDK.initCookieless(
  runtimeConfig.lookerHost,
  '/acquire-embed-session',
  '/generate-embed-tokens'
)

Das folgende Beispiel zeigt, wie Callbacks verwendet werden. Callbacks sollten nur verwendet werden, wenn die Clientanwendung für die Einbettung den Status der Looker-Einbettungssitzung kennen muss. Du kannst auch das session:status-Ereignis verwenden, sodass keine Callbacks mit dem Embed SDK erforderlich sind.

const acquireEmbedSessionCallback =
  async (): Promise<LookerEmbedCookielessSessionData> => {
    const resp = await fetch('/acquire-embed-session')
    if (!resp.ok) {
      console.error('acquire-embed-session failed', { resp })
      throw new Error(
        `acquire-embed-session failed: ${resp.status} ${resp.statusText}`
      )
    }
    return (await resp.json()) as LookerEmbedCookielessSessionData
  }

const generateEmbedTokensCallback =
  async (): Promise<LookerEmbedCookielessSessionData> => {
    const { api_token, navigation_token } = getApplicationTokens() || {}
    const resp = await fetch('/generate-embed-tokens', {
      method: 'PUT',
      headers: { 'content-type': 'application/json' },
      body: JSON.stringify({ api_token, navigation_token }),
    })
    if (!resp.ok) {
      if (resp.status === 400) {
        return { session_reference_token_ttl: 0 }
      }
      console.error('generate-embed-tokens failed', { resp })
      throw new Error(
        `generate-embed-tokens failed: ${resp.status} ${resp.statusText}`
      )
    }
    return (await resp.json()) as LookerEmbedCookielessSessionData
  }


    LookerEmbedSDK.initCookieless(
      runtimeConfig.lookerHost,
      acquireEmbedSessionCallback,
      generateEmbedTokensCallback
    )

Looker windows.postMessage API verwenden

Ein detailliertes Beispiel für die Verwendung der windows.postMessage API findest du in den Dateien message_example.ts und message_utils.ts im Git-Repository des Embed SDK. Die wichtigsten Punkte des Beispiels werden hier beschrieben.

Im folgenden Beispiel wird gezeigt, wie die URL für den Iframe erstellt wird. Die Callback-Funktion ist mit dem acquireEmbedSessionCallback-Beispiel identisch.

  private async getCookielessLoginUrl(): Promise<string> {
    const { authentication_token, navigation_token } =
      await this.embedEnvironment.acquireSession()
    const url = this.embedUrl.startsWith('/embed')
      ? this.embedUrl
      : `/embed${this.embedUrl}`
    const embedUrl = new URL(url, this.frameOrigin)
    if (!embedUrl.searchParams.has('embed_domain')) {
      embedUrl.searchParams.set('embed_domain', window.location.origin)
    }
    embedUrl.searchParams.set('embed_navigation_token', navigation_token)
    const targetUri = encodeURIComponent(
      `${embedUrl.pathname}${embedUrl.search}${embedUrl.hash}`
    )
    return `${embedUrl.origin}/login/embed/${targetUri}?embed_authentication_token=${authentication_token}`
  }

Das folgende Beispiel zeigt, wie Tokenanfragen überwacht, neue Tokens generiert und an Looker gesendet werden. Die Callback-Funktion ist mit der aus dem vorherigen generateEmbedTokensCallback-Beispiel identisch.

      this.on(
        'session:tokens:request',
        this.sessionTokensRequestHandler.bind(this)
      )

  private connected = false

  private async sessionTokensRequestHandler(_data: any) {
    const contentWindow = this.getContentWindow()
    if (contentWindow) {
      if (!this.connected) {
        // When not connected the newly acquired tokens can be used.
        const sessionTokens = this.embedEnvironment.applicationTokens
        if (sessionTokens) {
          this.connected = true
          this.send('session:tokens', this.embedEnvironment.applicationTokens)
        }
      } else {
        // If connected, the embedded Looker application has decided that
        // it needs new tokens. Generate new tokens.
        const sessionTokens = await this.embedEnvironment.generateTokens()
        this.send('session:tokens', sessionTokens)
      }
    }
  }

  send(messageType: string, data: any = {}) {
    const contentWindow = this.getContentWindow()
    if (contentWindow) {
      const message: any = {
        type: messageType,
        ...data,
      }
      contentWindow.postMessage(JSON.stringify(message), this.frameOrigin)
    }
    return this
  }

Anwendungsserverimplementierung

Dieser Abschnitt enthält Beispiele für die Implementierung einer Einbettung ohne Cookies im Anwendungsserver und umfasst die folgenden Unterabschnitte:

Einfache Implementierung

Die Einbettungsanwendung ist erforderlich, um zwei serverseitige Endpunkte zu implementieren, die Looker-Endpunkte aufrufen. Dadurch wird sichergestellt, dass das Sitzungsreferenztoken sicher bleibt. Dies sind die Endpunkte:

  1. Sitzung abrufen: Wenn bereits ein Sitzungsreferenztoken vorhanden und noch aktiv ist, werden Anfragen für eine Sitzung mit der vorhandenen Sitzung verknüpft. „Acquire session“ wird aufgerufen, wenn ein Iframe erstellt wird.
  2. Tokens generieren: Looker löst regelmäßig Aufrufe an diesen Endpunkt aus.

Sitzung abrufen

In diesem TypeScript-Beispiel wird die Sitzung zum Speichern oder Wiederherstellen des Sitzungsreferenztokens verwendet. Der Endpunkt muss nicht in TypeScript implementiert werden.

  app.get(
    '/acquire-embed-session',
    async function (req: Request, res: Response) {
      try {
        const current_session_reference_token =
          req.session && req.session.session_reference_token
        const response = await acquireEmbedSession(
          req.headers['user-agent']!,
          user,
          current_session_reference_token
        )
        const {
          authentication_token,
          authentication_token_ttl,
          navigation_token,
          navigation_token_ttl,
          session_reference_token,
          session_reference_token_ttl,
          api_token,
          api_token_ttl,
        } = response
        req.session!.session_reference_token = session_reference_token
        res.json({
          api_token,
          api_token_ttl,
          authentication_token,
          authentication_token_ttl,
          navigation_token,
          navigation_token_ttl,
          session_reference_token_ttl,
        })
      } catch (err: any) {
        res.status(400).send({ message: err.message })
      }
    }
  )

async function acquireEmbedSession(
  userAgent: string,
  user: LookerEmbedUser,
  session_reference_token: string
) {
  await acquireLookerSession()
    try {
    const request = {
      ...user,
      session_reference_token: session_reference_token,
    }
    const sdk = new Looker40SDK(lookerSession)
    const response = await sdk.ok(
      sdk.acquire_embed_cookieless_session(request, {
        headers: {
          'User-Agent': userAgent,
        },
      })
    )
    return response
  } catch (error) {
    console.error('embed session acquire failed', { error })
    throw error
  }
}

Ab Looker 23.8 kann die Domain für die Einbettung angegeben werden, wenn die Sitzung ohne Cookies abgerufen wird. Dies ist eine Alternative zum Hinzufügen der eingebetteten Domain über die Looker-Funktion Admin > Einbetten. Looker speichert die Einbettungsdomain in der internen Looker-Datenbank. Sie wird daher nicht im Bereich Verwaltung > Einbetten angezeigt. Stattdessen wird die Einbettungsdomain der Sitzung ohne Cookies zugeordnet und ist nur für die Dauer der Sitzung vorhanden. Lesen Sie die Best Practices für die Sicherheit, wenn Sie diese Funktion nutzen möchten.

Tokens generieren

In diesem TypeScript-Beispiel wird die Sitzung zum Speichern oder Wiederherstellen des Sitzungsreferenztokens verwendet. Der Endpunkt muss nicht in TypeScript implementiert werden.

Sie müssen wissen, wie mit 400 Antworten umgegangen wird, die auftreten, wenn Tokens ungültig sind. Eine 400-Antwort sollte nicht zurückgegeben werden. Falls doch, sollten Sie die Looker-Embed-Sitzung beenden. Sie können die Looker-Einbettungssitzung beenden, indem Sie entweder den eingebetteten iFrame löschen oder den Wert session_reference_token_ttl in der session:tokens-Nachricht auf null setzen. Wenn Sie den Wert von session_reference_token_ttl auf null setzen, wird im Looker-iFrame ein Dialogfeld angezeigt, dass die Sitzung abgelaufen ist.

Wenn die Einbettungssitzung abläuft, wird keine 400-Antwort zurückgegeben. Wenn die Einbettungssitzung abgelaufen ist, wird eine Antwort 200 mit dem Wert „0“ für session_reference_token_ttl zurückgegeben.

  app.put(
    '/generate-embed-tokens',
    async function (req: Request, res: Response) {
      try {
        const session_reference_token = req.session!.session_reference_token
        const { api_token, navigation_token } = req.body as any
        const tokens = await generateEmbedTokens(
          req.headers['user-agent']!,
          session_reference_token,
          api_token,
          navigation_token
        )
        res.json(tokens)
      } catch (err: any) {
        res.status(400).send({ message: err.message })
      }
    }
  )
}
async function generateEmbedTokens(
  userAgent: string,
  session_reference_token: string,
  api_token: string,
  navigation_token: string
) {
  if (!session_reference_token) {
    console.error('embed session generate tokens failed')
    // missing session reference  treat as expired session
    return {
      session_reference_token_ttl: 0,
    }
  }
  await acquireLookerSession()
  try {
    const sdk = new Looker40SDK(lookerSession)
    const response = await sdk.ok(
      sdk.generate_tokens_for_cookieless_session(
        {
          api_token,
          navigation_token,
          session_reference_token: session_reference_token || '',
        },
        {
          headers: {
            'User-Agent': userAgent,
          },
        }
      )
    )
    return {
      api_token: response.api_token,
      api_token_ttl: response.api_token_ttl,
      navigation_token: response.navigation_token,
      navigation_token_ttl: response.navigation_token_ttl,
      session_reference_token_ttl: response.session_reference_token_ttl,
    }
  } catch (error: any) {
    if (error.message?.includes('Invalid input tokens provided')) {
      // Currently the Looker UI does not know how to handle bad
      // tokens. This should not happen but if it does expire the
      // session. If the token is bad there is not much that that
      // the Looker UI can do.
      return {
        session_reference_token_ttl: 0,
      }
    }
    console.error('embed session generate tokens failed', { error })
    throw error
  }

Hinweise zur Implementierung

Die Anwendung, in die eingebettet wird, muss das Sitzungsreferenztoken im Blick behalten und sicher aufbewahren. Dieses Token sollte dem Nutzer der eingebetteten Anwendung zugeordnet werden. Das Token der Einbettungsanwendung kann auf eine der folgenden Arten gespeichert werden:

  • In der Nutzersitzung der eingebetteten Anwendung
  • In einem serverseitigen Cache, der in einer clusterübergreifenden Umgebung verfügbar ist
  • In einer Datenbanktabelle, die dem Nutzer zugeordnet ist

Wenn die Sitzung als Cookie gespeichert wird, sollte das Cookie verschlüsselt sein. Im Beispiel im eingebetteten SDK-Repository wird ein Sitzungscookie zum Speichern des Sitzungsreferenztokens verwendet.

Wenn die Looker-Embedding-Sitzung abläuft, wird im eingebetteten iFrame ein Dialogfeld angezeigt. In diesem Moment kann der Nutzer in der eingebetteten Instanz nichts tun. In diesem Fall werden die session:status-Ereignisse generiert. Dadurch kann die eingebettete Anwendung den aktuellen Status der eingebetteten Looker-Anwendung erkennen und eine Aktion ausführen.

Eine Einbettungsanwendung kann feststellen, ob die Einbettungssitzung abgelaufen ist, indem sie prüft, ob der vom generate_tokens-Endpunkt zurückgegebene session_reference_token_ttl-Wert null ist. Wenn der Wert null ist, ist die Einbettungssitzung abgelaufen. Du kannst eine Callback-Funktion zum Generieren von Tokens verwenden, wenn das embed ohne Cookies initialisiert wird. Die Callback-Funktion kann dann feststellen, ob die Einbettungssitzung abgelaufen ist, und den eingebetteten Iframe löschen, anstatt das standardmäßige Dialogfeld „Abgelaufene Einbettungssitzung“ zu verwenden.

Beispiel für die Einbettung von Looker ohne Cookies ausführen

Das Embed SDK-Repository enthält einen einfachen Node Express-Server und -Client, die in TypeScript geschrieben sind und eine einfache Einbettungsanwendung implementieren. Die zuvor gezeigten Beispiele stammen aus dieser Implementierung. Im Folgenden wird davon ausgegangen, dass Ihre Looker-Instanz so konfiguriert wurde, dass sie wie oben beschrieben die Einbettung ohne Cookies verwendet.

Sie können den Server folgendermaßen ausführen:

  1. Embed SDK-Repository klonen: git clone git@github.com:looker-open-source/embed-sdk.git
  2. Ändern Sie das Verzeichnis: cd embed-sdk
  3. Abhängigkeiten installieren: npm install
  4. Konfigurieren Sie den Server wie im Abschnitt Server konfigurieren in diesem Dokument beschrieben.
  5. Server ausführen – npm run server

Server konfigurieren

Erstellen Sie eine .env-Datei im Stammverzeichnis des geklonten Repositorys (dies ist in .gitignore enthalten).

Das Format dafür ist:

LOOKER_EMBED_HOST=your-looker-instance-url.com.
LOOKER_EMBED_API_URL=https://your-looker-instance-url.com
LOOKER_DEMO_HOST=localhost
LOOKER_DEMO_PORT=8080
LOOKER_EMBED_SECRET=embed-secret-from-embed-admin-page
LOOKER_CLIENT_ID=client-id-from-user-admin-page
LOOKER_CLIENT_SECRET=client-secret-from-user-admin-page
LOOKER_DASHBOARD_ID=id-of-dashboard
LOOKER_LOOK_ID=id-of-look
LOOKER_EXPLORE_ID=id-of-explore
LOOKER_EXTENSION_ID=id-of-extension
LOOKER_VERIFY_SSL=true