Einbettung ohne Cookies

Wenn Looker mithilfe der signierten Einbettung in einen iFrame eingebettet wird, verwenden einige Browser standardmäßig eine Cookie-Richtlinie, die Drittanbieter-Cookies blockiert. Drittanbieter-Cookies werden abgelehnt, wenn der eingebettete iFrame von einer Domain geladen wird, die sich von der Domain unterscheidet, über die die Einbettungsanwendung geladen wird. Im Allgemeinen können Sie diese Einschränkung umgehen, indem Sie eine Vanity-Domain anfordern und verwenden. Vanity-Domains können jedoch in einigen Szenarien nicht verwendet werden. Für diese Szenarien kann die Looker-Einbettung ohne Cookies verwendet werden.

Wie funktioniert die Einbettung ohne Cookies?

Wenn Drittanbieter-Cookies nicht blockiert werden, wird ein Sitzungscookie erstellt, wenn sich ein Nutzer zum ersten Mal bei Looker anmeldet. Dieses Cookie wird mit jeder Nutzeranfrage gesendet und vom Looker-Server verwendet, 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. Daher kann der Looker-Server den mit der Anfrage verknüpften Nutzer nicht identifizieren.

Um dieses Problem zu lösen, verknüpft die Looker-Einbettung ohne Cookies Tokens mit jeder Anfrage, die verwendet werden kann, um die Nutzersitzung auf dem Looker-Server neu zu erstellen. Es liegt in der Verantwortung der einbettenden Anwendung, diese Tokens abzurufen und sie der Looker-Instanz zur Verfügung zu stellen, die im eingebetteten iFrame ausgeführt wird. Der Prozess zum Abrufen und Bereitstellen dieser Tokens wird im Rest dieses Dokuments beschrieben.

Um eine der beiden APIs zu verwenden, muss sich die Einbettungsanwendung mit Administratorberechtigungen bei der Looker API authentifizieren können. Die Domain für die Einbettung muss auch in der Zulassungsliste für Domains einbetten aufgeführt sein. Wenn Sie Looker 23.8 oder höher verwenden, kann die eingebettete Domain beim Abrufen der Sitzung ohne Cookies eingeschlossen werden.

Einbettungs-iFrame von Looker erstellen

Das folgende Sequenzdiagramm veranschaulicht die Erstellung eines eingebetteten iFrames. Es können mehrere iFrames generiert werden, entweder gleichzeitig oder in Zukunft. Bei korrekter Implementierung nimmt der iFrame automatisch an der Sitzung teil, die vom ersten iFrame erstellt wird. Das Looker Embed SDK vereinfacht diesen Prozess, indem es automatisch der bestehenden Sitzung beitritt.

Ein Sequenzdiagramm, das die Erstellung eines eingebetteten iFrames veranschaulicht

  1. Der Nutzer führt in der Einbettungsanwendung eine Aktion aus, die zur Erstellung eines Looker-iFrames führt.
  2. Der Client der Einbettungsanwendung übernimmt eine Looker-Sitzung. Das Looker Embed SDK kann zum Initiieren dieser Sitzung verwendet werden, allerdings muss eine Endpunkt-URL oder eine Callback-Funktion angegeben werden. Wenn eine Callback-Funktion verwendet wird, wird der Anwendungsserver zum Einbetten aufgerufen, um die Looker-Einbettungssitzung abzurufen. Andernfalls ruft das Embed SDK die angegebene Endpunkt-URL auf.
  3. Der Anwendungsserver für die Einbettung verwendet die Looker API, um eine Einbettungssitzung abzurufen. Dieser API-Aufruf ähnelt dem Signaturprozess von Looker für signierte Einbettungen, da er die Nutzerdefinition zur Einbettung als Eingabe akzeptiert. Wenn für den aufrufenden Nutzer bereits eine Looker-Sitzung zum Einbetten vorhanden ist, sollte das zugehörige Sitzungsreferenztoken im Aufruf enthalten sein. Dies wird im Abschnitt Akquisitionssitzung in diesem Dokument ausführlicher erläutert.
  4. Die Endpunktverarbeitung der Einbettungssitzung ähnelt der des signierten Endpunkts /login/embed/{signed url), da sie die Nutzerdefinition der Looker-Einbettung als Text der Anfrage und nicht in der URL erwartet. Beim Abrufen des Endpunktprozesses für die Einbettung wird der Nutzer für die Einbettung validiert und erstellt oder aktualisiert. Sie kann auch ein vorhandenes Sitzungsreferenztoken annehmen. Das ist wichtig, da so mehrere in Looker eingebettete iFrames dieselbe Sitzung nutzen können. Der eingebettete Nutzer wird nicht aktualisiert, wenn ein Referenztoken für die Sitzung angegeben wurde und die Sitzung nicht abgelaufen ist. Das ist möglich, wenn ein iFrame mit einer signierten Einbettungs-URL und andere iFrames ohne signierte Einbettungs-URL erstellt werden. In diesem Fall übernehmen die iFrames ohne signierte Einbettungs-URLs das Cookie von der ersten Sitzung.
  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)
    • Sitzung – Referenztoken (TTL = verbleibende Lebensdauer der Sitzung)
  6. Der einbettende Anwendungsserver muss die von den Looker-Daten zurückgegebenen Daten erfassen und sowohl mit dem aufrufenden Nutzer als auch dem User-Agent des Browsers des aufrufenden Nutzers verknüpfen. Entsprechende Informationen finden Sie in diesem Dokument im Abschnitt Token generieren. Bei diesem Aufruf werden das Autorisierungstoken, ein Navigationstoken, ein API-Token sowie alle zugehörigen TTLs zurückgegeben. Das Sitzungsreferenztoken sollte gesichert und im aufrufenden Browser nicht offengelegt werden.
  7. Nachdem die Tokens an den Browser zurückgegeben wurden, muss eine Anmelde-URL für die Looker-Einbettung erstellt werden. Das Looker Embed SDK erstellt die Einbettungs-Anmelde-URL automatisch. Beispiele dazu, wie Sie die windows.postMessage API zum Erstellen der eingebetteten Anmelde-URL verwenden, finden Sie in diesem Dokument im Abschnitt Looker windows.postMessage API verwenden.

    Die Anmelde-URL enthält nicht das signierte Einbettungsnutzerdetail. Er enthält den Ziel-URI einschließlich des Navigationstokens sowie 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 noch einmal eine eingebettete Sitzung abgerufen werden. Wird jedoch das Referenztoken für die Sitzung angegeben, wird das Token derselben Sitzung zugeordnet.

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

    • Die verknüpfte Sitzung ist noch gültig.
    • Der zugeordnete Einbettungsnutzer ist weiterhin gültig.
    • Der mit der Anfrage verknüpfte Browser-User-Agent stimmt mit dem Browser-Agent überein, der der Sitzung zugeordnet ist.
  9. Wenn die Prüfungen aus dem vorherigen Schritt bestanden wurden, wird die Anfrage über den Ziel-URI weitergeleitet, der in der URL enthalten ist. Dies ist derselbe Vorgang wie bei der Anmeldung mit Looker-signierter Einbettung.

  10. Diese Anfrage ist die Weiterleitung zum Starten des Looker-Dashboards. Diese Anfrage hat das Navigationstoken als Parameter.

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

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

    Falls gültig, wird die Sitzung für die Anfrage wiederhergestellt und die Dashboardanfrage ausgeführt.

  12. Der HTML-Code zum Laden des Dashboards wird an den iFrame zurückgegeben.

  13. Die im iFrame ausgeführte Looker-Benutzeroberfläche stellt fest, dass der HTML-Code des Dashboards eine Antwort ohne Cookies ist. Dann sendet die Looker-Benutzeroberfläche eine Nachricht an die einbettende Anwendung und fordert die in Schritt 6 abgerufenen Tokens an. Die UI wartet dann, bis sie die Tokens erhält. Wenn die Tokens nicht ankommen, wird eine Meldung angezeigt.

  14. Die Einbettungsanwendung sendet die Tokens an den eingebetteten Looker-iFrame.

  15. Wenn die Tokens empfangen wurden, 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 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. Findet der Server das Token, prüft er Folgendes:

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

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

  17. Dashboarddaten werden zurückgegeben.

  18. Das Dashboard wird gerendert.

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

Neue Tokens werden generiert

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 Client der eingebetteten Anwendung.
  3. Der Client der Einbettungsanwendung fordert dann neue Tokens von einem Endpunkt an, der im Anwendungsserver zum Einbetten implementiert ist. Das Looker Embed SDK fordert automatisch neue Tokens an, aber die Endpunkt-URL oder eine Callback-Funktion muss angegeben werden. Wenn die Callback-Funktion verwendet wird, ruft sie den einbettenden Anwendungsserver auf, um neue Tokens zu generieren. Andernfalls ruft das Embed SDK die angegebene Endpunkt-URL auf.
  4. Die Einbettungsanwendung findet das session_reference_token, das der Einbettungssitzung zugeordnet ist. Im Git-Repository des Looker Embed SDK werden Sitzungscookies verwendet. Es kann aber auch ein verteilter serverseitiger Cache, z. B. Redis, verwendet werden.
  5. Der einbettende Anwendungsserver ruft den Looker-Server mit einer Anfrage zum Generieren von Tokens auf. 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 aufrufenden Anwendungsserver für eingebettete Inhalte zurückgegeben.
  8. Der Anwendungsserver für die Einbettung entfernt das Sitzungsreferenztoken aus der Antwort und gibt die verbleibende Antwort an den Client der Einbettungsanwendung zurück.
  9. Der Client für die Einbettungsanwendung sendet die neu generierten Tokens an die Looker-Benutzeroberfläche. Das Looker Embed SDK erledigt dies automatisch. Das Senden der Tokens erfolgt durch das Einbetten von Anwendungsclients, die die windows.postMessage API verwenden. Sobald die Looker-Benutzeroberfläche die Tokens erhält, werden sie in nachfolgenden API-Aufrufen und Seitennavigationen verwendet.

Looker-Einbettung ohne Cookies implementieren

Die Looker-Einbettung ohne Cookies kann 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 für die Verwendung der windows.postMessage API. Ausführliche Erläuterungen zu beiden Implementierungen finden Sie in der Readme-Datei zum Embed SDK. Das Embed SDK Git-Repository enthält auch funktionierende Implementierungen.

Looker-Instanz konfigurieren

Das Einbetten ohne Cookies hat eine Gemeinsamkeit mit der signierten Einbettung von Looker. Für das Einbetten ohne Cookies muss die Embed SSO Authentication (SSO-Authentifizierung einbetten) aktiviert sein. Anders als bei der Looker-signierten Einbettung wird bei der Einbettung ohne Cookies jedoch nicht die Einstellung Embed Secret (Secret einbetten) verwendet. Bei der Einbettung ohne Cookies wird ein JSON Web Token (JWT) in Form der Einstellung JWT-Secret einbetten verwendet, die im Menü Admin auf der Seite Einbetten im Bereich Plattform festgelegt oder zurückgesetzt werden kann.

Das Festlegen des JWT-Secrets ist nicht erforderlich, da das JWT beim ersten Versuch, eine Einbettungssitzung ohne Cookies zu erstellen, erstellt wird. Vermeiden Sie das Zurücksetzen dieses Tokens, 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 implementieren

Dieser Abschnitt enthält Beispiele für die Implementierung der Einbettung ohne Cookies im Anwendungsclient und enthält die folgenden Unterabschnitte:

Looker Embed SDK installieren oder aktualisieren

Die folgenden Looker SDK-Versionen sind erforderlich, um eine Einbettung ohne Cookies zu verwenden:

@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 Callback-Funktionen. Die URL-Strings sollten auf Endpunkte im einbettenden Anwendungsserver verweisen. Implementierungsdetails dieser Endpunkte auf dem Anwendungsserver finden Sie im Abschnitt Anwendungsserver-Implementierung in diesem Dokument.

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

Das folgende Beispiel zeigt, wie Callbacks verwendet werden. Callbacks sollten nur verwendet werden, wenn es für die einbettende Clientanwendung erforderlich ist, den Status der Looker-Einbettungssitzung zu erkennen. Du kannst auch das session:status-Ereignis verwenden. Callbacks sind dann nicht mehr mit dem Embed SDK erforderlich.

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 finden Sie in den Dateien message_example.ts und message_utils.ts im Git-Repository Embed SDK. Die Highlights aus diesem Beispiel werden hier im Einzelnen aufgeführt.

Das folgende Beispiel zeigt, wie die URL für den iFrame erstellt wird. Die Callback-Funktion ist mit dem zuvor erwähnten 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 auf Tokenanfragen gewartet, neue Tokens generiert und an Looker gesendet werden. Die Callback-Funktion ist mit 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
  }

Implementierung des Anwendungsservers

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

Einfache Implementierung

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

  1. Sitzung abrufen: Wenn ein Referenztoken für die Sitzung bereits vorhanden und noch aktiv ist, werden Anfragen für eine Sitzung der bestehenden Sitzung hinzugefügt. Die Acquire-Sitzung wird aufgerufen, wenn ein iFrame erstellt wird.
  2. Tokens generieren: Looker löst regelmäßig Aufrufe an diesen Endpunkt aus.

Sitzung gewinnen

In diesem Beispiel in TypeScript wird in der Sitzung das Sitzungsreferenztoken gespeichert oder wiederhergestellt. 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 Einbettungsdomain beim Erwerb der Sitzung ohne Cookies einbezogen werden. Dies ist eine Alternative zum Hinzufügen der eingebetteten Domain über den Looker-Bereich Admin > Einbetten. Die eingebettete Domain wird von Looker in der internen Looker-Datenbank gespeichert. Sie wird daher nicht im Bereich Admin > Einbetten angezeigt. Stattdessen wird die eingebettete 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 in der Sitzung das Sitzungsreferenztoken gespeichert oder wiederhergestellt. Der Endpunkt muss nicht in TypeScript implementiert werden.

Sie müssen wissen, wie Sie mit 400-Antworten umgehen, die auftreten, wenn Tokens ungültig sind. Eine 400-Antwort sollte nicht zurückgegeben werden. Falls doch, empfiehlt es sich, die Looker-Einbettungssitzung zu 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, zeigt der Looker-iFrame ein Dialogfeld an, in dem die Sitzung abgelaufen ist.

Nach Ablauf der Einbettungssitzung wird kein 400-Antwortcode zurückgegeben. Wenn die Einbettungssitzung abgelaufen ist, wird die Antwort 200 zurückgegeben, wobei der Wert session_reference_token_ttl auf null gesetzt ist.

  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 Einbettungsanwendung muss das Sitzungsreferenztoken im Blick behalten und sicher aufbewahren. Dieses Token sollte mit dem Nutzer der eingebetteten Anwendung verknüpft sein. Das Anwendungstoken für die Einbettung kann auf eine der folgenden Arten gespeichert werden:

  • In der Nutzersitzung der eingebetteten Anwendung
  • In einem serverseitigen Cache, der in einer Clusterumgebung verfügbar ist
  • In einer Datenbanktabelle, die mit dem Nutzer verknüpft ist

Wenn die Sitzung als Cookie gespeichert wird, muss das Cookie verschlüsselt werden. Im Beispiel im eingebetteten SDK-Repository wird das Sitzungsreferenztoken in einem Sitzungscookie gespeichert.

Wenn die Looker-Einbettungssitzung abläuft, wird im eingebetteten iFrame ein Dialogfeld angezeigt. An diesem Punkt kann der Nutzer in der eingebetteten Instanz nichts tun. In diesem Fall werden die session:status-Ereignisse generiert. So kann die Einbettungsanwendung den aktuellen Status der eingebetteten Looker-Anwendung erkennen und entsprechende Maßnahmen ergreifen.

Eine Einbettungsanwendung kann erkennen, ob die Einbettungssitzung abgelaufen ist. Dazu wird geprüft, ob der vom Endpunkt generate_tokens zurückgegebene session_reference_token_ttl-Wert null ist. Wenn der Wert null ist, ist die Einbettungssitzung abgelaufen. Erwägen Sie die Verwendung einer Callback-Funktion zum Generieren von Tokens, wenn die Einbettung ohne Cookies initialisiert wird. Die Callback-Funktion kann dann ermitteln, ob die Einbettungssitzung abgelaufen ist, und löscht den eingebetteten iFrame, wenn nicht das standardmäßige Dialogfeld für abgelaufene Sitzungen verwendet wird.

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

Das eingebettete 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 für die Verwendung der Einbettung ohne Cookies konfiguriert ist, wie oben beschrieben.

Sie können den Server so ausführen:

  1. Klonen Sie das Embed SDK-Repository: git clone git@github.com:looker-open-source/embed-sdk.git
  2. Verzeichnis wechseln – cd embed-sdk
  3. Installieren Sie die Abhängigkeiten – npm install
  4. Konfigurieren Sie den Server wie im Abschnitt Server konfigurieren dieses Dokuments beschrieben.
  5. Server ausführen – npm run server

Server konfigurieren

Erstellen Sie im Stammverzeichnis des geklonten Repositorys eine .env-Datei (siehe .gitignore).

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