Embedding tanpa cookie

Saat Looker disematkan dalam iframe menggunakan penyematan yang ditandatangani, beberapa browser secara default menggunakan kebijakan cookie yang memblokir cookie pihak ketiga. Cookie pihak ketiga ditolak saat iframe tersemat dimuat dari domain yang berbeda dengan domain yang memuat aplikasi penyematan. Anda biasanya dapat mengatasi batasan ini dengan meminta dan menggunakan domain vanity. Namun, domain vanity tidak dapat digunakan dalam beberapa skenario. Untuk skenario ini, penyematan tanpa cookie Looker dapat digunakan.

Bagaimana cara kerja penyematan tanpa cookie?

Jika cookie pihak ketiga tidak diblokir, cookie sesi akan dibuat saat pengguna pertama kali login ke Looker. Cookie ini dikirim dengan setiap permintaan pengguna, dan server Looker menggunakannya untuk menetapkan identitas pengguna yang memulai permintaan. Jika cookie diblokir, cookie tidak akan dikirim dengan permintaan, sehingga server Looker tidak dapat mengidentifikasi pengguna yang terkait dengan permintaan tersebut.

Untuk mengatasi masalah ini, penyematan tanpa cookie Looker mengaitkan token dengan setiap permintaan yang dapat digunakan untuk membuat ulang sesi pengguna di server Looker. Aplikasi penyematan bertanggung jawab untuk mendapatkan token ini dan menyediakannya ke instance Looker yang berjalan di iframe tersemat. Proses untuk mendapatkan dan memberikan token ini dijelaskan di bagian lain dokumen ini.

Untuk menggunakan salah satu API, aplikasi penyematan harus dapat mengautentikasi ke Looker API dengan hak istimewa admin. Domain sematan juga harus tercantum dalam Daftar yang Diizinkan untuk Domain Sematan, atau, jika menggunakan Looker 23.8 atau yang lebih baru, domain sematan dapat disertakan saat sesi tanpa cookie diperoleh.

Membuat iframe sematan Looker

Diagram urutan berikut mengilustrasikan pembuatan iframe sematan. Beberapa iframe dapat dibuat secara bersamaan atau pada suatu waktu di masa mendatang. Jika diterapkan dengan benar, iframe akan otomatis bergabung ke sesi yang dibuat oleh iframe pertama. Looker Embed SDK menyederhanakan proses ini dengan bergabung secara otomatis ke sesi yang ada.

Diagram urutan yang menggambarkan pembuatan iframe sematan.

  1. Pengguna melakukan tindakan di aplikasi penyematan yang menghasilkan pembuatan iframe Looker.
  2. Klien aplikasi penyematan memperoleh sesi Looker. Looker Embed SDK dapat digunakan untuk memulai sesi ini, tetapi URL endpoint atau fungsi callback harus disediakan. Jika digunakan, fungsi callback akan memanggil server aplikasi penyematan untuk mendapatkan sesi penyematan Looker. Jika tidak, Embed SDK akan memanggil URL endpoint yang diberikan.
  3. Server aplikasi penyematan menggunakan Looker API untuk mendapatkan sesi penyematan. Panggilan API ini mirip dengan proses penandatanganan penyematan yang ditandatangani Looker, karena menerima definisi pengguna penyematan sebagai input. Jika sesi penyematan Looker sudah ada untuk pengguna yang melakukan panggilan, token referensi sesi terkait harus disertakan dalam panggilan. Hal ini akan dijelaskan secara lebih mendetail di bagian Mendapatkan sesi dalam dokumen ini.
  4. Pemrosesan endpoint sesi penyematan akuisisi mirip dengan endpoint /login/embed/{signed url) yang ditandatangani, karena mengharapkan definisi pengguna penyematan Looker sebagai isi permintaan, bukan di URL. Proses endpoint sesi penyematan akuisisi memvalidasi dan membuat atau memperbarui pengguna penyematan. Token ini juga dapat menerima token referensi sesi yang ada. Hal ini penting karena memungkinkan beberapa iframe tersemat Looker berbagi sesi yang sama. Pengguna sematan tidak akan diperbarui jika token referensi sesi diberikan dan sesi belum berakhir. Hal ini mendukung kasus penggunaan saat satu iframe dibuat menggunakan URL penyematan yang ditandatangani dan iframe lainnya dibuat tanpa URL penyematan yang ditandatangani. Dalam hal ini, iframe tanpa URL sematan yang ditandatangani akan mewarisi cookie dari sesi pertama.
  5. Panggilan Looker API menampilkan empat token, masing-masing dengan time to live (TTL):
    • Token otorisasi (TTL = 30 detik)
    • Token navigasi (TTL = 10 menit)
    • Token API (TTL = 10 menit)
    • Token referensi sesi (TTL = masa aktif sesi yang tersisa)
  6. Server aplikasi penyematan harus melacak data yang ditampilkan oleh data Looker dan mengaitkannya dengan pengguna yang melakukan panggilan dan agen pengguna browser pengguna yang melakukan panggilan. Saran tentang cara melakukannya diberikan di bagian Membuat token dalam dokumen ini. Panggilan ini akan menampilkan token otorisasi, token navigasi, dan token API, beserta semua TTL terkait. Token referensi sesi harus diamankan dan tidak ditampilkan di browser panggilan.
  7. Setelah token ditampilkan ke browser, URL login sematan Looker harus dibuat. Looker Embed SDK akan membuat URL login sematan secara otomatis. Untuk menggunakan windows.postMessage API guna membuat URL login sematan, lihat bagian Menggunakan Looker windows.postMessage API dalam dokumen ini untuk mengetahui contohnya.

    URL login tidak berisi detail pengguna sematan yang ditandatangani. Ini berisi URI target, termasuk token navigasi, dan token otorisasi sebagai parameter kueri. Token otorisasi harus digunakan dalam waktu 30 detik dan hanya dapat digunakan satu kali. Jika iframe tambahan diperlukan, sesi penyematan harus diperoleh lagi. Namun, jika token referensi sesi diberikan, token otorisasi akan dikaitkan dengan sesi yang sama.

  8. Endpoint login penyematan Looker menentukan apakah login tersebut untuk penyematan tanpa cookie, yang ditunjukkan dengan keberadaan token otorisasi. Jika valid, token otorisasi akan memeriksa hal berikut:

    • Sesi terkait masih valid.
    • Pengguna penyematan terkait masih valid.
    • Agen pengguna browser yang terkait dengan permintaan cocok dengan agen browser yang terkait dengan sesi.
  9. Jika pemeriksaan dari langkah sebelumnya lulus, permintaan akan dialihkan menggunakan URI target yang terdapat dalam URL. Prosesnya sama dengan login sematan yang ditandatangani Looker.

  10. Permintaan ini adalah pengalihan untuk meluncurkan dasbor Looker. Permintaan ini akan memiliki token navigasi sebagai parameter.

  11. Sebelum endpoint dieksekusi, server Looker akan mencari token navigasi dalam permintaan. Jika server menemukan token, server akan memeriksa hal berikut:

    • Sesi terkait masih valid.
    • Agen pengguna browser yang terkait dengan permintaan cocok dengan agen browser yang terkait dengan sesi.

    Jika valid, sesi akan dipulihkan untuk permintaan dan permintaan dasbor akan berjalan.

  12. HTML untuk memuat dasbor ditampilkan ke iframe.

  13. UI Looker yang berjalan di iframe menentukan bahwa HTML dasbor adalah respons penyematan tanpa cookie. Pada saat itu, UI Looker akan mengirim pesan ke aplikasi penyematan yang meminta token yang diambil pada langkah 6. UI kemudian menunggu hingga menerima token. Jika token tidak diterima, pesan akan ditampilkan.

  14. Aplikasi penyematan mengirimkan token ke iframe tersemat Looker.

  15. Saat token diterima, UI Looker yang berjalan di iframe akan memulai proses untuk merender objek permintaan. Selama proses ini, UI akan melakukan panggilan API ke server Looker. Token API yang diterima di langkah 15 akan otomatis dimasukkan sebagai header ke semua permintaan API.

  16. Sebelum endpoint dieksekusi, server Looker akan mencari token API dalam permintaan. Jika server menemukan token, server akan memeriksa hal berikut:

    • Sesi terkait masih valid.
    • Agen pengguna browser yang terkait dengan permintaan cocok dengan agen browser yang terkait dengan sesi.

    Jika valid, sesi akan dipulihkan untuk permintaan, dan permintaan API akan berjalan.

  17. Data dasbor ditampilkan.

  18. Dasbor dirender.

  19. Pengguna memiliki kontrol atas dasbor.

Membuat token baru

Diagram urutan berikut mengilustrasikan pembuatan token baru.

Diagram urutan yang menggambarkan pembuatan token baru.

  1. UI Looker yang berjalan di iframe tersemat memantau TTL token sematan.
  2. Saat token mendekati masa berlakunya, UI Looker akan mengirim pesan token refresh ke klien aplikasi penyematan.
  3. Klien aplikasi penyematan kemudian meminta token baru dari endpoint yang diterapkan di server aplikasi penyematan. Looker Embed SDK akan meminta token baru secara otomatis, tetapi URL endpoint atau fungsi callback harus disediakan. Jika digunakan, fungsi callback akan memanggil server aplikasi penyematan untuk membuat token baru. Jika tidak, Embed SDK akan memanggil URL endpoint yang diberikan.
  4. Aplikasi penyematan menemukan session_reference_token yang terkait dengan sesi penyematan. Contoh yang disediakan di repositori Git Looker Embed SDK menggunakan cookie sesi, tetapi cache sisi server terdistribusi, misalnya Redis, juga dapat digunakan.
  5. Server aplikasi penyematan memanggil server Looker dengan permintaan untuk membuat token. Permintaan ini juga memerlukan token API dan navigasi terbaru selain agen pengguna browser yang memulai permintaan.
  6. Server Looker memvalidasi agen pengguna, token referensi sesi, token navigasi, dan token API. Jika permintaan valid, token baru akan dibuat.
  7. Token ditampilkan ke server aplikasi penyematan yang memanggil.
  8. Server aplikasi penyematan menghapus token referensi sesi dari respons dan menampilkan respons yang tersisa ke klien aplikasi penyematan.
  9. Klien aplikasi penyematan mengirimkan token yang baru dibuat ke UI Looker. Looker Embed SDK akan melakukannya secara otomatis. Menyematkan klien aplikasi yang menggunakan windows.postMessage API akan bertanggung jawab untuk mengirim token. Setelah UI Looker menerima token, token tersebut akan digunakan dalam panggilan API dan navigasi halaman berikutnya.

Menerapkan sematan tanpa cookie Looker

Penyematan Looker tanpa cookie dapat diterapkan menggunakan Looker Embed SDK atau windows.postMessage API. Metode yang menggunakan Looker Embed SDK lebih mudah, tetapi contoh yang menunjukkan cara menggunakan windows.postMessage API juga tersedia. Penjelasan mendetail tentang kedua penerapan tersebut dapat ditemukan di file README SDK Embed Looker. Repositori git Embed SDK juga berisi implementasi yang berfungsi.

Mengonfigurasi instance Looker

Embedding tanpa cookie memiliki kesamaan dengan penyematan yang ditandatangani Looker. Penyematan tanpa cookie bergantung pada pengaktifan Autentikasi SSO Penyematan. Namun, tidak seperti penyematan yang ditandatangani Looker, penyematan tanpa cookie tidak menggunakan setelan Embed Secret. Penyematan tanpa cookie menggunakan Token Web JSON (JWT) dalam bentuk setelan Embed JWT Secret, yang dapat ditetapkan atau direset di halaman Embed di bagian Platform pada menu Admin.

Menetapkan secret JWT tidak diperlukan, karena upaya pertama untuk membuat sesi penyematan tanpa cookie akan membuat JWT. Hindari mereset token ini, karena tindakan tersebut akan membatalkan semua sesi sematan tanpa cookie yang aktif.

Tidak seperti secret sematan, secret JWT sematan tidak pernah diekspos, karena hanya digunakan secara internal di server Looker.

Implementasi klien aplikasi

Bagian ini menyertakan contoh cara menerapkan penyematan tanpa cookie di klien aplikasi dan berisi subbagian berikut:

Menginstal atau mengupdate Looker Embed SDK

Versi Looker SDK berikut diperlukan untuk menggunakan penyematan tanpa cookie:

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

Menggunakan Looker Embed SDK

Metode inisialisasi baru telah ditambahkan ke Embed SDK untuk memulai sesi tanpa cookie. Metode ini menerima dua string URL atau dua fungsi callback. String URL harus mereferensikan endpoint di server aplikasi penyematan. Detail implementasi endpoint ini di server aplikasi dibahas di bagian Implementasi server aplikasi dalam dokumen ini.

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

Contoh berikut menunjukkan cara callback digunakan. Callback hanya boleh digunakan jika aplikasi klien penyematan perlu mengetahui status sesi penyematan Looker. Anda juga dapat menggunakan peristiwa session:status, sehingga tidak perlu menggunakan callback dengan Embed SDK.

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
    )

Menggunakan Looker windows.postMessage API

Anda dapat melihat contoh mendetail tentang penggunaan windows.postMessage API dalam file message_example.ts dan message_utils.ts di repositori Git Embed SDK. Sorotan contoh dijelaskan di sini.

Contoh berikut menunjukkan cara membuat URL untuk iframe. Fungsi callback identik dengan contoh acquireEmbedSessionCallback yang dilihat sebelumnya.

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

Contoh berikut menunjukkan cara memproses permintaan token, membuat token baru, dan mengirimkannya ke Looker. Fungsi callback identik dengan contoh generateEmbedTokensCallback sebelumnya.

      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
  }

Implementasi server aplikasi

Bagian ini menyertakan contoh cara menerapkan penyematan tanpa cookie di server aplikasi dan berisi subbagian berikut:

Penerapan dasar

Aplikasi penyematan harus menerapkan dua endpoint sisi server yang akan memanggil endpoint Looker. Hal ini untuk memastikan token referensi sesi tetap aman. Berikut adalah endpoint-nya:

  1. Mendapatkan sesi — Jika token referensi sesi sudah ada dan masih aktif, permintaan untuk sesi akan bergabung dengan sesi yang ada. Sesi akuisisi dipanggil saat iframe dibuat.
  2. Buat token — Looker memicu panggilan ke endpoint ini secara berkala.

Mendapatkan sesi

Contoh ini di TypeScript menggunakan sesi untuk menyimpan atau memulihkan token referensi sesi. Endpoint tidak harus diterapkan di 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
  }
}

Mulai Looker 23.8, domain sematan dapat disertakan saat sesi tanpa cookie diperoleh. Ini adalah alternatif untuk menambahkan domain sematan menggunakan panel Admin > Embed Looker. Looker menyimpan domain sematan di database internal Looker, sehingga tidak akan ditampilkan di panel Admin > Embed. Sebagai gantinya, domain sematan dikaitkan dengan sesi tanpa cookie dan hanya ada selama durasi sesi. Tinjau praktik terbaik keamanan jika Anda memutuskan untuk memanfaatkan fitur ini.

Membuat token

Contoh ini di TypeScript menggunakan sesi untuk menyimpan atau memulihkan token referensi sesi. Endpoint tidak harus diterapkan di TypeScript.

Anda harus mengetahui cara menangani respons 400, yang terjadi saat token tidak valid. Respons 400 yang ditampilkan seharusnya tidak terjadi, tetapi jika terjadi, praktik terbaiknya adalah menghentikan sesi penyematan Looker. Anda dapat menghentikan sesi penyematan Looker dengan menghancurkan iframe penyematan atau dengan menetapkan nilai session_reference_token_ttl ke nol dalam pesan session:tokens. Jika Anda menetapkan nilai session_reference_token_ttl ke nol, iframe Looker akan menampilkan dialog masa berlaku sesi habis.

Respons 400 tidak ditampilkan saat masa berlaku sesi penyematan berakhir. Jika sesi penyematan telah berakhir, respons 200 akan ditampilkan dengan nilai session_reference_token_ttl ditetapkan ke nol.

  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
  }

Pertimbangan penerapan

Aplikasi penyematan harus melacak token referensi sesi dan harus menjaga keamanannya. Token ini harus dikaitkan dengan pengguna aplikasi tersemat. Token aplikasi penyematan dapat disimpan dengan salah satu cara berikut:

  • Dalam sesi pengguna aplikasi tersemat
  • Di cache sisi server yang tersedia di seluruh lingkungan cluster
  • Di tabel database yang dikaitkan dengan pengguna

Jika sesi disimpan sebagai cookie, cookie harus dienkripsi. Contoh di repositori SDK penyematan menggunakan cookie sesi untuk menyimpan token referensi sesi.

Saat sesi penyematan Looker berakhir, dialog akan ditampilkan di iframe tersemat. Pada tahap ini, pengguna tidak akan dapat melakukan apa pun di instance tersemat. Jika hal ini terjadi, peristiwa session:status akan dibuat, sehingga aplikasi penyematan dapat mendeteksi status aplikasi Looker tersemat saat ini dan mengambil tindakan tertentu.

Aplikasi penyematan dapat mendeteksi apakah sesi penyematan telah berakhir masa berlakunya dengan memeriksa apakah nilai session_reference_token_ttl yang ditampilkan oleh endpoint generate_tokens adalah nol. Jika nilainya nol, berarti sesi penyematan telah berakhir. Pertimbangkan untuk menggunakan fungsi callback untuk membuat token saat penyematan tanpa cookie diinisialisasi. Fungsi callback kemudian dapat menentukan apakah sesi penyematan telah berakhir dan akan menghancurkan iframe tersemat sebagai alternatif untuk menggunakan dialog berakhirnya sesi penyematan default.

Menjalankan contoh penyematan tanpa cookie Looker

Repositori SDK penyematan berisi server dan klien node express sederhana yang ditulis dalam TypeScript yang mengimplementasikan aplikasi penyematan sederhana. Contoh yang ditampilkan sebelumnya diambil dari penerapan ini. Berikut ini asumsi bahwa instance Looker Anda telah dikonfigurasi untuk menggunakan penyematan tanpa cookie seperti yang dijelaskan sebelumnya.

Anda dapat menjalankan server sebagai berikut:

  1. Meng-clone repo Embed SDK — git clone git@github.com:looker-open-source/embed-sdk.git
  2. Mengubah direktori — cd embed-sdk
  3. Instal dependensi — npm install
  4. Konfigurasikan server, seperti yang ditunjukkan di bagian Mengonfigurasi server dalam dokumen ini.
  5. Menjalankan server — npm run server

Mengonfigurasi server

Buat file .env di root repositori yang di-clone (file ini disertakan dalam .gitignore).

Formatnya adalah sebagai berikut:

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