Incorporamento senza cookie

Quando Looker è incorporato in un iframe utilizzando l'incorporamento firmato, alcuni browser utilizzano per impostazione predefinita norme relative ai cookie che bloccano i cookie di terze parti. I cookie di terze parti vengono rifiutati quando l'iframe incorporato viene caricato da un dominio diverso da quello che carica l'applicazione di incorporamento. In genere, puoi aggirare questa limitazione richiedendo e utilizzando un dominio vanity. Tuttavia, i domini vanity non possono essere utilizzati in alcuni scenari. È per questi scenari che è possibile utilizzare l'embedding senza cookie di Looker.

Come funziona l'incorporamento senza cookie?

Quando i cookie di terze parti non sono bloccati, viene creato un cookie di sessione quando un utente accede inizialmente a Looker. Questo cookie viene inviato con ogni richiesta dell'utente e il server di Looker lo utilizza per stabilire l'identità dell'utente che ha avviato la richiesta. Quando i cookie sono bloccati, il cookie non viene inviato con una richiesta, pertanto il server di Looker non può identificare l'utente associato alla richiesta.

Per risolvere questo problema, l'embedding senza cookie di Looker associa token a ogni richiesta che possono essere utilizzati per ricreare la sessione utente nel server di Looker. È responsabilità dell'applicazione di incorporamento recuperare questi token e renderli disponibili per l'istanza di Looker in esecuzione nell'iframe incorporato. La procedura per ottenere e fornire questi token è descritta nel resto del documento.

Per utilizzare una delle due API, l'applicazione di incorporamento deve essere in grado di autenticarsi nell'API Looker con privilegi amministrativi. Il dominio di incorporamento deve inoltre essere elencato nella lista consentita dei domini di incorporamento oppure, se utilizzi Looker 23.8 o versioni successive, il dominio di incorporamento può essere incluso quando viene acquisita la sessione senza cookie.

Creazione di un iframe di incorporamento di Looker

Il seguente diagramma di sequenza illustra la creazione di un iframe incorporato. È possibile generare più iframe contemporaneamente o in un secondo momento. Se implementato correttamente, l'iframe si unirà automaticamente alla sessione creata dal primo iframe. L'SDK di incorporamento di Looker semplifica questa procedura partecipando automaticamente alla sessione esistente.

Un diagramma di sequenza che illustra la creazione di un iframe incorporato.

  1. L'utente esegue un'azione nell'applicazione di incorporamento che genera la creazione di un iframe di Looker.
  2. Il client dell'applicazione di incorporamento acquisisce una sessione di Looker. L'SDK di incorporamento di Looker può essere utilizzato per avviare questa sessione, ma è necessario fornire un URL endpoint o una funzione di callback. Se viene utilizzata una funzione di callback, verrà chiamato il server dell'applicazione di incorporamento per acquisire la sessione di incorporamento di Looker. In caso contrario, l'SDK di incorporamento chiamerà l'URL dell'endpoint fornito.
  3. Il server dell'applicazione di incorporamento utilizza l'API Looker per acquisire una sessione di incorporamento. Questa chiamata API è simile alla procedura di firma dell'embedding firmato di Looker, in quanto accetta la definizione dell'utente di embedding come input. Se esiste già una sessione di incorporamento di Looker per l'utente che chiama, il token di riferimento della sessione associato deve essere incluso nella chiamata. Questo verrà spiegato in maggiore dettaglio nella sezione Acquisire una sessione di questo documento.
  4. L'elaborazione dell'endpoint della sessione di incorporamento acquisita è simile all'endpoint /login/embed/{signed url) firmato, in quanto prevede la definizione dell'utente di incorporamento di Looker come corpo della richiesta, anziché nell'URL. Il processo di acquisizione dell'endpoint della sessione di incorporamento convalida e crea o aggiorna l'utente di incorporamento. Inoltre, può accettare un token di riferimento della sessione esistente. Questo è importante perché consente a più iframe di Looker incorporati di condividere la stessa sessione. L'utente di incorporamento non verrà aggiornato se viene fornito un token di riferimento della sessione e la sessione non è scaduta. Questo supporta il caso d'uso in cui un iframe viene creato utilizzando un URL di incorporamento firmato e altri iframe vengono creati senza un URL di incorporamento firmato. In questo caso, gli iframe senza URL di incorporamento firmati erediteranno il cookie dalla prima sessione.
  5. La chiamata all'API Looker restituisce quattro token, ciascuno con una durata (TTL):
    • Token di autorizzazione (TTL = 30 secondi)
    • Token di navigazione (TTL = 10 minuti)
    • Token API (TTL = 10 minuti)
    • Token di riferimento della sessione (TTL = durata rimanente della sessione)
  6. Il server delle applicazioni di incorporamento deve tenere traccia dei dati restituiti dai dati di Looker e associarli sia all'utente chiamante sia all'agente utente del browser dell'utente chiamante. I suggerimenti su come eseguire questa operazione sono riportati nella sezione Generare token di questo documento. Questa chiamata restituirà il token di autorizzazione, un token di navigazione e un token API, insieme a tutti i TTL associati. Il token di riferimento della sessione deve essere protetto e non esposto nel browser chiamante.
  7. Una volta che i token sono stati restituiti al browser, è necessario creare un URL di accesso all'embed di Looker. L'SDK Embed di Looker creerà automaticamente l'URL di accesso all'embed. Per utilizzare l'API windows.postMessage per creare l'URL di accesso all'embed, consulta la sezione Utilizzo dell'API windows.postMessage di Looker di questo documento per alcuni esempi.

    L'URL di accesso non contiene i dettagli dell'utente che ha eseguito l'embed firmato. Contiene l'URI target, incluso il token di navigazione, e il token di autorizzazione come parametro di query. Il token di autorizzazione deve essere utilizzato entro 30 secondi e può essere utilizzato una sola volta. Se sono necessari altri iframe, è necessario acquisire di nuovo una sessione di incorporamento. Tuttavia, se viene fornito il token di riferimento della sessione, il token di autorizzazione verrà associato alla stessa sessione.

  8. L'endpoint di accesso all'embed di Looker determina se l'accesso è per l'embed senza cookie, il che è indicato dalla presenza del token di autorizzazione. Se il token di autorizzazione è valido, vengono controllati i seguenti elementi:

    • La sessione associata è ancora valida.
    • L'utente di incorporamento associato sia ancora valido.
    • L'agente utente del browser associato alla richiesta corrisponde all'agente del browser associato alla sessione.
  9. Se i controlli del passaggio precedente vengono superati, la richiesta viene reindirizzata utilizzando l'URI target contenuto nell'URL. Si tratta della stessa procedura utilizzata per l'accesso all'embedding firmato di Looker.

  10. Questa richiesta è il reindirizzamento per avviare la dashboard di Looker. Questa richiesta avrà il token di navigazione come parametro.

  11. Prima dell'esecuzione dell'endpoint, il server Looker cerca il token di navigazione nella richiesta. Se il server trova il token, controlla quanto segue:

    • La sessione associata è ancora valida.
    • L'agente utente del browser associato alla richiesta corrisponde all'agente del browser associato alla sessione.

    Se è valido, la sessione viene ripristinata per la richiesta e la richiesta della dashboard viene eseguita.

  12. Il codice HTML per caricare la dashboard viene restituito all'iframe.

  13. L'interfaccia utente di Looker in esecuzione nell'iframe determina che l'HTML della dashboard è una risposta di incorporamento senza cookie. A questo punto, l'interfaccia utente di Looker invia un messaggio all'applicazione di incorporamento per richiedere i token recuperati nel passaggio 6. L'interfaccia utente attende quindi di ricevere i token. Se i token non arrivano, viene visualizzato un messaggio.

  14. L'applicazione di incorporamento invia i token all'iframe incorporato di Looker.

  15. Quando i token vengono ricevuti, l'interfaccia utente di Looker in esecuzione nell'iframe avvia il processo di rendering dell'oggetto della richiesta. Durante questa procedura, l'interfaccia utente eseguirà chiamate API al server Looker. Il token API ricevuto nel passaggio 15 viene inserito automaticamente come intestazione in tutte le richieste API.

  16. Prima dell'esecuzione di qualsiasi endpoint, il server Looker cerca il token API nella richiesta. Se il token viene trovato, il server controlla quanto segue:

    • La sessione associata è ancora valida.
    • L'agente utente del browser associato alla richiesta corrisponde all'agente del browser associato alla sessione.

    Se la sessione è valida, viene ripristinata per la richiesta e la richiesta API viene eseguita.

  17. I dati della dashboard vengono restituiti.

  18. La dashboard viene visualizzata.

  19. L'utente ha il controllo della dashboard.

Generazione di nuovi token

Il seguente diagramma di sequenza illustra la generazione di nuovi token.

Un diagramma di sequenza che illustra la generazione di nuovi token.

  1. L'interfaccia utente di Looker in esecuzione nell'iframe incorporato monitora il TTL dei token di incorporamento.
  2. Quando i token si avvicinano alla scadenza, l'interfaccia utente di Looker invia un messaggio di aggiornamento del token al client dell'applicazione di incorporamento.
  3. Il client dell'applicazione di incorporamento richiede quindi nuovi token da un endpoint implementato nel server dell'applicazione di incorporamento. L'SDK Embed di Looker richiederà automaticamente nuovi token, ma è necessario fornire l'URL dell'endpoint o una funzione di callback. Se viene utilizzata la funzione di callback, verrà chiamato il server dell'applicazione di incorporamento per generare nuovi token. In caso contrario, l'SDK di incorporamento chiamerà l'URL dell'endpoint fornito.
  4. L'applicazione di incorporamento trova il session_reference_token associato alla sessione di incorporamento. L'esempio fornito nel repository Git dell'SDK Looker Embed utilizza i cookie di sessione, ma è possibile utilizzare anche una cache lato server distribuita, ad esempio Redis.
  5. Il server dell'applicazione di embedding chiama il server di Looker con una richiesta di generazione di token. Questa richiesta richiede anche token di API e navigazione recenti, oltre allo user agent del browser che ha avviato la richiesta.
  6. Il server di Looker convalida lo user agent, il token di riferimento della sessione, il token di navigazione e il token API. Se la richiesta è valida, vengono generati nuovi token.
  7. I token vengono restituiti al server dell'applicazione di incorporamento chiamante.
  8. Il server dell'applicazione di incorporamento rimuove il token di riferimento della sessione dalla risposta e restituisce la risposta rimanente al client dell'applicazione di incorporamento.
  9. Il client dell'applicazione di incorporamento invia i token appena generati all'interfaccia utente di Looker. L'SDK di incorporamento di Looker eseguirà automaticamente questa operazione. L'embedding dei client di applicazione che utilizzano l'API windows.postMessage sarà responsabile dell'invio dei token. Una volta che l'interfaccia utente di Looker riceve i token, questi verranno utilizzati nelle chiamate API e nella navigazione tra le pagine successive.

Implementazione dell'incorporamento senza cookie di Looker

L'inserimento di Looker senza cookie può essere implementato utilizzando l'SDK Embed di Looker o l'API windows.postMessage. Il metodo che utilizza l'SDK Embed di Looker è più semplice, ma è disponibile anche un esempio che mostra come utilizzare l'API windows.postMessage. Nel file README dell'SDK Embed di Looker sono disponibili spiegazioni dettagliate di entrambe le implementazioni. Il repository Git dell'SDK Embed contiene anche implementazioni funzionanti.

Configurazione dell'istanza Looker

L'incorporamento senza cookie presenta analogie con l'incorporamento firmato di Looker. L'incorporamento senza cookie si basa sull'attivazione dell'autenticazione SSO incorporata. Tuttavia, a differenza dell'embedding firmato di Looker, l'embedding senza cookie non utilizza l'impostazione Embed Secret. L'incorporamento senza cookie utilizza un token web JSON (JWT) sotto forma di impostazione Incorpora JWT segreto, che può essere impostata o reimpostata nella pagina Incorpora della sezione Piattaforma del menu Amministrazione.

L'impostazione del segreto JWT non è obbligatoria, poiché il JWT verrà creato al primo tentativo di creare una sessione di incorporamento senza cookie. Evita di reimpostare questo token, perché in questo modo verranno invalidate tutte le sessioni di incorporamento senza cookie attive.

A differenza del secret di incorporamento, il secret JWT di incorporamento non viene mai esposto, in quanto viene utilizzato solo internamente nel server Looker.

Implementazione dell'applicazione client

Questa sezione include esempi di come implementare l'embedding senza cookie nel client dell'applicazione e contiene le seguenti sottosezioni:

Installazione o aggiornamento dell'SDK di incorporamento di Looker

Per utilizzare l'incorporamento senza cookie sono necessarie le seguenti versioni dell'SDK di Looker:

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

Utilizzo dell'SDK di incorporamento di Looker

Nell'SDK Embed è stato aggiunto un nuovo metodo di inizializzazione per avviare la sessione senza cookie. Questo metodo accetta due stringhe URL o due funzioni di callback. Le stringhe URL devono fare riferimento agli endpoint nel server dell'applicazione di incorporamento. I dettagli di implementazione di questi endpoint sul server di applicazioni sono trattati nella sezione Implementazione del server di applicazioni di questo documento.

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

L'esempio seguente mostra come vengono utilizzati i callback. I richiami devono essere utilizzati solo quando è necessario che l'applicazione client di incorporamento sia a conoscenza dello stato della sessione di incorporamento di Looker. Puoi anche utilizzare l'evento session:status, rendendo non necessario l'utilizzo dei callback con l'SDK Embed.

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
    )

Utilizzo dell'API windows.postMessage di Looker

Puoi visualizzare un esempio dettagliato dell'utilizzo dell'API windows.postMessage nei file message_example.ts e message_utils.ts nel repository Git dell'SDK Embed. I punti salienti dell'esempio sono descritti qui.

L'esempio seguente mostra come creare l'URL per l'iframe. La funzione di callback è identica all'esempio acquireEmbedSessionCallback visto in precedenza.

  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}`
  }

Il seguente esempio mostra come ascoltare le richieste di token, generare nuovi token e inviarli a Looker. La funzione di callback è identica a quella dell'esempio generateEmbedTokensCallback precedente.

      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
  }

Implementazione del server delle applicazioni

Questa sezione include esempi di come implementare l'embedding senza cookie nel server dell'applicazione e contiene le seguenti sottosezioni:

Implementazione di base

L'applicazione di incorporamento deve implementare due endpoint lato server che chiameranno gli endpoint di Looker. Ciò garantisce che il token di riferimento della sessione rimanga protetto. Questi sono gli endpoint:

  1. Acquisisci sessione: se esiste già un token di riferimento della sessione ed è ancora attivo, le richieste di una sessione si uniranno a quella esistente. La sessione di acquisizione viene chiamata quando viene creato un iframe.
  2. Genera token: Looker attiva periodicamente le chiamate a questo endpoint.

Acquisisci sessione

Questo esempio in TypeScript utilizza la sessione per salvare o ripristinare il token di riferimento della sessione. L'endpoint non deve essere implementato in TypeScript.

  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
  }
}

A partire da Looker 23.8, il dominio di incorporamento può essere incluso quando viene acquisita la sessione senza cookie. Si tratta di un'alternativa all'aggiunta del dominio di incorporamento utilizzando il riquadro Amministrazione > Incorpora di Looker. Looker salva il dominio di incorporamento nel database interno di Looker, pertanto non verrà visualizzato nel riquadro Amministrazione > Incorpora. Il dominio di incorporamento è invece associato alla sessione senza cookie ed esiste solo per la durata della sessione. Se decidi di utilizzare questa funzionalità, consulta le best practice di sicurezza.

Generare token

Questo esempio in TypeScript utilizza la sessione per salvare o ripristinare il token di riferimento della sessione. L'endpoint non deve essere implementato in TypeScript.

È importante sapere come gestire le risposte 400, che si verificano quando i token non sono validi. Non dovrebbe essere restituita una risposta 400, ma se ciò accade, è buona prassi terminare la sessione di incorporamento di Looker. Puoi terminare la sessione di incorporamento di Looker distruggendo l'iframe di incorporamento o impostando il valore session_reference_token_ttl su zero nel messaggio session:tokens. Se imposti il valore session_reference_token_ttl su zero, l'iframe di Looker mostra una finestra di dialogo che indica che la sessione è scaduta.

Non viene restituita una risposta 400 quando la sessione di incorporamento scade. Se la sessione di incorporamento è scaduta, viene restituita una risposta 200 con il valore session_reference_token_ttl impostato su zero.

  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
  }

Considerazioni sull'implementazione

L'applicazione di incorporamento deve tenere traccia del token di riferimento della sessione e mantenerlo al sicuro. Questo token deve essere associato all'utente dell'applicazione incorporata. Il token dell'applicazione di incorporamento può essere archiviato in uno dei seguenti modi:

  • Nella sessione dell'utente dell'applicazione incorporata
  • In una cache lato server disponibile in un ambiente cluster
  • In una tabella di database associata all'utente

Se la sessione viene memorizzata come cookie, il cookie deve essere criptato. L'esempio nel repository dell'SDK di incorporamento utilizza un cookie di sessione per memorizzare il token di riferimento della sessione.

Quando la sessione di incorporamento di Looker scade, nell'iframe incorporato viene visualizzata una finestra di dialogo. A questo punto, l'utente non potrà fare nulla nell'istanza incorporata. In questo caso, verranno generati gli eventi session:status, che consentono all'applicazione di incorporamento di rilevare lo stato corrente dell'applicazione Looker incorporata ed eseguire un qualche tipo di azione.

Un'applicazione di incorporamento può rilevare se la sessione di incorporamento è scaduta controllando se il valore session_reference_token_ttl restituito dall'endpoint generate_tokens è pari a zero. Se il valore è zero, la sessione di incorporamento è scaduta. Valuta la possibilità di utilizzare una funzione di callback per generare token durante l'inizializzazione dell'embed senza cookie. La funzione di callback può quindi determinare se la sessione di incorporamento è scaduta e distruggere l'iframe incorporato come alternativa all'utilizzo della finestra di dialogo predefinita per la sessione di incorporamento scaduta.

Eseguire l'esempio di incorporamento senza cookie di Looker

Il repository dell'SDK Embed contiene un semplice server e client Node Express scritti in TypeScript che implementano una semplice applicazione di incorporamento. Gli esempi mostrati in precedenza sono tratti da questa implementazione. Di seguito si presume che l'istanza di Looker sia stata configurata per utilizzare l'embedding senza cookie come descritto in precedenza.

Puoi eseguire il server nel seguente modo:

  1. Clona il repository dell'SDK Embed: git clone git@github.com:looker-open-source/embed-sdk.git
  2. Cambia la directory: cd embed-sdk
  3. Installa le dipendenze: npm install
  4. Configura il server come indicato nella sezione Configurare il server di questo documento.
  5. Esegui il server: npm run server

Configura il server

Crea un file .env nella radice del repository clonato (incluso in .gitignore).

Il formato è il seguente:

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