Einbettung ohne Cookies

Wenn Looker mithilfe der signierten Einbettung in einen iFrame eingebettet ist, wird in einigen Browsern standardmäßig eine Cookie-Richtlinie verwendet, 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. Sie können diese Einschränkung in der Regel umgehen, indem Sie eine Vanity-Domain anfordern und verwenden. In einigen Fällen können Aliasdomains jedoch nicht verwendet werden. Für diese Szenarien kann die sitzungsübergreifende Einbettung von Looker 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. Die Anwendung, in die eingebettet wird, muss diese Tokens abrufen und für die Looker-Instanz verfügbar machen, die im eingebetteten Iframe ausgeführt wird. Wie du diese Tokens abrufen und bereitstellen kannst, wird im Rest dieses Dokuments 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-iFrame für die Einbettung 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 wird der IFrame automatisch der Sitzung beigetreten, die vom ersten IFrame erstellt wird. 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 verwendet werden, um diese Sitzung zu initiieren. Es muss jedoch eine Endpunkt-URL oder eine Rückruffunktion angegeben werden. Wenn eine Callback-Funktion verwendet wird, wird der Einbettungsserver aufgerufen, um die Looker-Einbettungssitzung abzurufen. Andernfalls ruft das Embed SDK die angegebene Endpunkt-URL auf.
  3. Der Einbettungsserver verwendet die Looker API, um eine Einbettungssitzung zu erhalten. 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 abrufen 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 Endpunktprozess zum Abrufen der Einbettungssitzung wird der Einbettungsnutzer validiert und erstellt oder aktualisiert. Es kann auch ein vorhandenes Sitzungsreferenztoken akzeptieren. Das ist wichtig, da mehrere eingebettete Looker-iFrames dieselbe Sitzung verwenden können. Der eingebettete Nutzer wird nicht aktualisiert, wenn ein Sitzungsreferenztoken angegeben wird und die Sitzung nicht abgelaufen ist. So wird der Anwendungsfall unterstützt, 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)
    • Navigationstoken (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. Dieser Aufruf gibt das Autorisierungstoken, ein Navigationstoken und ein API-Token sowie alle zugehörigen TTLs zurück. Das Sitzungsreferenztoken sollte geschützt und nicht im aufrufenden Browser freigegeben werden.
  7. Nachdem die Tokens an den Browser zurückgegeben wurden, muss eine Anmelde-URL für Looker-Embedding erstellt werden. Das Looker Embed SDK erstellt die Anmelde-URL für die Einbettung automatisch. Beispiele für die Verwendung der windows.postMessage API zum Erstellen der Anmelde-URL für die Einbettung finden Sie in diesem Dokument im Abschnitt Looker windows.postMessage API verwenden.

    Die Anmelde-URL enthält keine Details zum Nutzer, der den eingebetteten Code signiert hat. Er enthält den Ziel-URI, einschließlich des Navigationstokens, und das Autorisierungstoken als Abfrageparameter. Das Autorisierungstoken muss innerhalb von 30 Sekunden verwendet werden und kann nur einmal verwendet werden. Wenn zusätzliche iframes erforderlich sind, muss eine neue Einbettungssitzung abgerufen werden. Wenn jedoch das Sitzungsreferenztoken angegeben wird, wird das Autorisierungstoken derselben Sitzung zugeordnet.

  8. Über den Anmeldeendpunkt für das Looker-Embed wird ermittelt, ob es sich um eine Anmeldung für das Einbetten ohne Cookies handelt. Dies wird durch das Vorhandensein des Autorisierungstokens angezeigt. Wenn das Autorisierungstoken gültig ist, wird Folgendes geprüft:

    • Die zugehörige 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 erfolgreich sind, 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 Anfrage 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 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.

    Ist das Token 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 eingebettete 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 Benutzeroberfläche wartet dann, bis sie die Tokens erhält. Wenn die Tokens nicht ankommen, wird eine Meldung angezeigt.

  14. Die Anwendung für die Einbettung 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. Dabei werden über die Benutzeroberfläche API-Aufrufe an den Looker-Server gesendet. Das in Schritt 15 empfangene API-Token wird automatisch als Header in alle API-Anfragen eingefügt.

  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 die Tokens bald ablaufen, sendet die Looker-Benutzeroberfläche eine Aktualisierungstoken-Nachricht an den Client der eingebetteten Anwendung.
  3. Der Client der eingebetteten Anwendung fordert dann neue Tokens von einem Endpunkt an, der im Server der eingebetteten Anwendung 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, wird der Anwendungsserver für das Einbetten aufgerufen, um neue Tokens zu generieren. Andernfalls ruft das Embed SDK die angegebene Endpunkt-URL auf.
  4. Die Einbettungsanwendung sucht nach der session_reference_token, die der Einbettungssitzung zugeordnet ist. Im Beispiel im Looker Embed SDK Git-Repository werden Sitzungscookies verwendet, aber auch ein verteilter serverseitiger Cache, z. B. Redis, kann verwendet werden.
  5. Der Anwendungsserver für die Einbettung ruft den Looker-Server mit einer Anfrage zum Generieren von Tokens auf. Für diese Anfrage sind neben dem User-Agent des Browsers, über den die Anfrage gestartet wurde, 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 Senden der Tokens ist Sache der eingebetteten Anwendungsclients, die die windows.postMessage API verwenden. Sobald die Looker-Benutzeroberfläche die Tokens empfängt, 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. Es ist aber auch ein Beispiel für die Verwendung der windows.postMessage API verfügbar. Ausführliche Erläuterungen zu beiden Implementierungen finden Sie in der README-Datei des Looker-Embed-SDKs. Das Git-Repository des Embed SDK enthält auch funktionierende Implementierungen.

Looker-Instanz konfigurieren

Die Einbettung ohne Cookies hat Ähnlichkeiten mit der signierten Einbettung in Looker. Für die Einbettung ohne Cookies muss SSO-Authentifizierung einbetten aktiviert sein. Im Gegensatz zum signierten Einbetten in Looker wird beim Einbetten ohne Cookies jedoch nicht die Einstellung Embed Secret verwendet. Für das Einbetten ohne Cookies wird ein JSON Web Token (JWT) in Form der Einstellung Embed JWT Secret (JWT-Secret für das Einbetten) verwendet. Diese Einstellung kann im Menü Verwaltung im Bereich Plattform auf der Seite Einbetten festgelegt oder zurückgesetzt werden.

Das Festlegen des JWT-Secrets ist nicht erforderlich, da das JWT beim ersten Versuch zum Erstellen einer embed-Sitzung ohne Cookies erstellt wird. Setze dieses Token nicht zurück, da dadurch alle aktiven Einbettungssitzungen ohne Cookies ungültig werden.

Im Gegensatz zum Geheimschlüssel für das Einbetten wird das JWT-Geheimnis für das Einbetten nie freigegeben, da es nur intern auf dem Looker-Server verwendet wird.

Implementierung des Anwendungsclients

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

Looker Embed SDK installieren oder aktualisieren

Für die Einbettung ohne Cookies sind die folgenden Looker SDK-Versionen 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 starten. Diese Methode akzeptiert entweder zwei URL-Strings oder zwei Rückruffunktionen. Die URL-Strings sollten auf Endpunkte auf dem Server der eingebetteten Anwendung 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 Aspekte des Beispiels werden hier beschrieben.

Im folgenden Beispiel wird gezeigt, wie die URL für den Iframe erstellt wird. Die Callback-Funktion ist mit der aus dem Beispiel für acquireEmbedSessionCallback 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}`
  }

Im folgenden Beispiel wird gezeigt, wie Sie auf Tokenanfragen warten, neue Tokens generieren und an Looker senden. 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 der bestmöglichen Einbettung ohne Cookies auf dem Anwendungsserver. Er umfasst die folgenden Unterabschnitte:

Einfache Implementierung

Die Anwendung zum Einbetten muss zwei serverseitige Endpunkte implementieren, die Looker-Endpunkte aufrufen. So wird sichergestellt, dass das Sitzungsreferenztoken sicher bleibt. Das 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 Beispiel in TypeScript wird die Sitzung verwendet, um das Sitzungsreferenztoken zu speichern oder wiederherzustellen. 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 Einbettungsdomain über das Looker-Steuerfeld Verwaltung > Einbetten. Looker speichert die Einbettungsdomain in der internen Looker-Datenbank. Sie wird daher nicht im Bereich Verwaltung > Einbetten angezeigt. Stattdessen wird die Embed-Domain der Sitzung ohne Cookies zugeordnet und existiert nur für die Dauer der Sitzung. Lesen Sie die Best Practices für die Sicherheit, wenn Sie diese Funktion nutzen möchten.

Tokens generieren

In diesem Beispiel in TypeScript wird die Sitzung verwendet, um das Sitzungsreferenztoken zu speichern oder wiederherzustellen. Der Endpunkt muss nicht in TypeScript implementiert werden.

Es ist wichtig, dass du weißt, wie du mit 400-Antworten umgehen musst, 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-Embed-Sitzung beenden, indem Sie entweder den Embed-Iframe löschen oder den Wert session_reference_token_ttl in der session:tokens-Nachricht auf null setzen. Wenn Sie den Wert für session_reference_token_ttl auf null setzen, wird im Looker-Iframe ein Dialogfeld mit der Meldung „Sitzung abgelaufen“ angezeigt.

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 sein. Das Token der eingebetteten Anwendung kann auf eine der folgenden Arten gespeichert werden:

  • In der Sitzung des Nutzers 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 Embed SDK-Repository wird ein Sitzungscookie verwendet, um das Sitzungsreferenztoken zu speichern.

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 session:status-Ereignisse generiert, damit die Anwendung, in die eingebettet wird, den aktuellen Status der eingebetteten Looker-Anwendung erkennen und eine bestimmte Aktion ausführen kann.

Eine Anwendung zum Einbetten kann erkennen, ob die Einbettungssitzung abgelaufen ist, indem sie prüft, ob der session_reference_token_ttl-Wert, der vom generate_tokens-Endpunkt zurückgegeben wird, 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 einen Client, der in TypeScript geschrieben ist und eine einfache Einbettungsanwendung implementiert. Die zuvor gezeigten Beispiele stammen aus dieser Implementierung. Im Folgenden wird davon ausgegangen, dass Ihre Looker-Instanz für die Einbettung ohne Cookies konfiguriert wurde, wie oben beschrieben.

So führen Sie den Server aus:

  1. Embed SDK-Repository klonen – git clone git@github.com:looker-open-source/embed-sdk.git
  2. Verzeichnis ändern – 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