ืžื‘ื•ื ืœ-Embed SDK

โ€ซLooker Embed SDK ื”ื™ื ืกืคืจื™ื™ื” ืฉืœ ืคื•ื ืงืฆื™ื•ืช ืฉืืคืฉืจ ืœื”ื•ืกื™ืฃ ืœืงื•ื“ ืฉืœ ืืคืœื™ืงืฆื™ื™ืช ืื™ื ื˜ืจื ื˜ ืžื‘ื•ืกืกืช-ื“ืคื“ืคืŸ ื›ื“ื™ ืœื ื”ืœ ืœื•ื—ื•ืช ื‘ืงืจื”, ืชืฆื•ื’ื•ืช, ื“ื•ื—ื•ืช ื•ื ื™ืชื•ื—ื™ื ืžื•ื˜ืžืขื™ื ื‘ืืคืœื™ืงืฆื™ื™ืช ื”ืื™ื ื˜ืจื ื˜.

ืขืจื›ืช Embed SDK ืžืืคืฉืจืช ื”ื˜ืžืขื” ื‘ื“ืจื›ื™ื ื”ื‘ืื•ืช:

  • ื”ื•ืกืคืช ื”ืื ืงืคืกื•ืœืฆื™ื” ืฉืœ ื”ืชื•ื›ืŸ ื”ืžื•ื˜ืžืข ื‘ืœื™ ืœื™ืฆื•ืจ ืจื›ื™ื‘ื™ HTML ื‘ืื•ืคืŸ ื™ื“ื ื™.
  • ื”ืขื‘ืจืช ื ืชื•ื ื™ื ื™ืฉื™ืจื•ืช ื‘ื™ืŸ ื”ืžืงื•ืจ ืœื™ืขื“, ื›ืš ืฉืœื ืžืชื‘ืฆืขืช ืชืงืฉื•ืจืช ื‘ื™ืŸ ืžืกื’ืจื•ืช ืฉื•ื ื•ืช. ืขืจื›ืช ื”-SDK ืœื”ื˜ืžืขื” ืžื˜ืคืœืช ื‘ื”ืขื‘ืจืช ื”ื•ื“ืขื•ืช ื‘ื™ืŸ ื“ื•ืžื™ื™ื ื™ื ื‘ื™ืŸ ื“ืฃ ื”ืื™ื ื˜ืจื ื˜ ื”ืžืืจื— ืœื‘ื™ืŸ ืชื•ื›ืŸ Looker ื”ืžื•ื˜ืžืข, ื‘ืืžืฆืขื•ืช ืขืจื•ืฅ ื”ื•ื“ืขื•ืช ื™ื™ืขื•ื“ื™.

ื‘ืœื™ Embed SDK, ืืคืฉืจ ืœื”ืคืขื™ืœ ืื™ืจื•ืขื™ื ื‘ืชื•ื›ืŸ Looker ืžื•ื˜ืžืข ืื• ืœื”ื’ื™ื‘ ืœื”ื ื‘ืืžืฆืขื•ืช ืื™ืจื•ืขื™ JavaScript ื›ืžื• dashboard:run:start ืื• page:changed, ืฉืžืชื•ืืจื™ื ื‘ื“ืฃ ื”ืชื™ืขื•ื“ ื‘ื ื•ืฉื ืื™ืจื•ืขื™ JavaScript ืžื•ื˜ืžืขื™ื. ืžืคืชื—ื™ื ืฉืžื˜ืžื™ืขื™ื ืชื•ื›ืŸ Looker ื‘ืืžืฆืขื•ืช ืื™ืจื•ืขื™ JavaScript ืฆืจื™ื›ื™ื ืœื™ืฆื•ืจ ืืช ืจื›ื™ื‘ื™ ื”-HTML ืฉื‘ื”ื ื™ื•ืคื™ืข ื”ืชื•ื›ืŸ ื”ืžื•ื˜ืžืข, ื•ืœื”ืกืชืžืš ืขืœ ืื™ืจื•ืขื™ ืฉื™ื“ื•ืจ (broadcast) ืฉืœ ื—ืœื•ืŸ ืœืชืงืฉื•ืจืช ื‘ื™ืŸ ืืคืœื™ืงืฆื™ื™ืช ื”ืื™ื ื˜ืจื ื˜ ืœื‘ื™ืŸ ื”ืชื•ื›ืŸ ื”ืžื•ื˜ืžืข.

ื—ืฉื•ื‘ ืœืฉื™ื ืœื‘ ืฉ-Looker Embed SDK ืฉื•ื ื” ืž-Looker API ื•ืž-Looker API SDK:

  • โ€ซLooker Embed SDK ื ืžืฆื ื‘ืงื•ื“ ื‘ืฆื“ ื”ืœืงื•ื— ืฉืœ ืืคืœื™ืงืฆื™ื™ืช ื”ืื™ื ื˜ืจื ื˜ ืฉืœื›ื ื•ืžื ื”ืœ ืืช ื”ื”ืงืฉืจ ื•ื”ืชื•ื›ืŸ ืฉืœ ื”ื”ื˜ืžืขื” ืฉืœ Looker. โ€ซ(Embed SDK ืœื ืžืกืคืง ื’ื™ืฉื” ืœ-Looker API).
  • โ€ซLooker API ื ืžืฆื ื‘ืฉืจืช ืขื ืžื•ืคืข Looker ืฉืœื›ื ื•ืžื‘ืฆืข ืคืงื•ื“ื•ืช ื‘ืฉืจืช Looker.
  • ืขืจื›ื•ืช SDK ืฉืœ ืœืงื•ื— Looker API ื ืžืฆืื•ืช ื‘ืงื•ื“ ืฉืœ ืืคืœื™ืงืฆื™ื•ืช ืฉืื™ื ืŸ ื“ืคื“ืคื ื™ื, ื›ื“ื™ ืœืกืคืง ื’ื™ืฉื” ืœืคื•ื ืงืฆื™ื•ืช ืฉืœ Looker API.

ื—ืฉื•ื‘ ืœื“ืขืช ืฉ-Looker ืœื ืฉื•ืœื˜ ื‘ืกื“ืจ ืฉื‘ื• ื”ื“ืคื“ืคื ื™ื ืฉื•ืœื—ื™ื ืื™ืจื•ืขื™ื ืœืืคืœื™ืงืฆื™ื•ืช ืื™ื ื˜ืจื ื˜. ื”ืžืฉืžืขื•ืช ื”ื™ื ืฉืกื“ืจ ื”ืื™ืจื•ืขื™ื ืœื ืžื•ื‘ื˜ื— ื‘ื“ืคื“ืคื ื™ื ืื• ื‘ืคืœื˜ืคื•ืจืžื•ืช ืฉื•ื ื•ืช. ื—ืฉื•ื‘ ืœื›ืชื•ื‘ ืืช ืงื•ื“ ื”-JavaScript ื‘ืฆื•ืจื” ืžืชืื™ืžื” ื›ื“ื™ ืœื”ืชื—ืฉื‘ ื‘ื˜ื™ืคื•ืœ ื‘ืื™ืจื•ืขื™ื ื‘ื“ืคื“ืคื ื™ื ืฉื•ื ื™ื.

ื“ื•ื’ืžื” ืžื”ื™ืจื”

ื‘ื“ื•ื’ืžื” ื”ื–ื•, ืœื•ื— ื‘ืงืจื” ืขื ืžื–ื”ื” 11 ื ื•ืฆืจ ื‘ืชื•ืš ืจื›ื™ื‘ DOM ืขื ื”ืžื–ื”ื” embed_container. ื”ืื™ืจื•ืขื™ื dashboard:run:start ื•-dashboard:run:complete ืžืฉืžืฉื™ื ืœืขื“ื›ื•ืŸ ื”ืžืฆื‘ ืฉืœ ืžืžืฉืง ื”ืžืฉืชืžืฉ ื‘ื—ืœื•ืŸ ื”ื”ื˜ืžืขื”, ื•ืžื•ื’ื“ืจ ืกืงืจื™ืคื˜ ืœืœื—ืฆืŸ ืขื ืžื–ื”ื” run ืœืฉืœื™ื—ืช ื”ื•ื“ืขื” dashboard:run ืœืœื•ื— ื”ื‘ืงืจื”.

getEmbedSDK().init('looker.example.com', '/auth')

const setupConnection = (connection) => {
  document.querySelector('#run').addEventListener('click', () => {
    connection.asDashboardConnection().run()
  })
}

try {
  connection = await getEmbedSDK()
    .createDashboardWithId('11')
    .appendTo('#embed_container')
    .on('dashboard:run:start', () => updateStatus('Running'))
    .on('dashboard:run:complete', () => updateStatus('Done'))
    .build()
    .connect()
  setupConnection(connection)
} catch (error) {
  console.error('An unexpected error occurred', error)
}

ื“ื•ื’ืžื” ืžืœืื” ื™ื•ืชืจ ืžืชื•ืืจืช ื‘ื“ืฃ ื”ืชื™ืขื•ื“ Embed SDK demo.

ื”ื’ื“ืจืช Looker Embed SDK

โ€ซLooker Embed SDK ืžืฉืชืžืฉ ื‘ืชื‘ื ื™ืช ืฉืœ ืžืžืฉืง ืจืฆื™ืฃ. ืื—ืจื™ ื”ื”ืชืงื ื” ืฉืœ ืขืจื›ืช ื”-SDK ืœื”ื˜ืžืขื”, ื™ื•ืฆืจื™ื ืืช ื”ืชื•ื›ืŸ ื”ืžื•ื˜ืžืข ื•ืžืชื—ื‘ืจื™ื ืืœื™ื•. ืื—ืจื™ ืฉื”ื—ื™ื‘ื•ืจ ื ื•ืฆืจ, ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉื”ืืคืœื™ืงืฆื™ื” ื”ืžืืจื—ืช ืชื‘ืฆืข ืคืขื•ืœื•ืช ื‘ืชื•ื›ืŸ ื”ืžื•ื˜ืžืข.

ื”ืชืงื ื” ืฉืœ Embed SDK

ืืคืฉืจ ืœื”ื•ืจื™ื“ ืืช ืกืคืจื™ื™ืช ื”-SDK ืœื”ื˜ืžืขื” ืฉืœ Looker ื“ืจืš ืžื ื”ืœ ื—ื‘ื™ืœื•ืช ื”ืฆืžืชื™ื (NPM) ื‘ื›ืชื•ื‘ืช https://www.npmjs.com/package/@looker/embed-sdk. ืขื ื–ืืช, ืื ืจื•ืฆื™ื ืœืจืื•ืช ืืช ืงื•ื“ ื”ื“ื•ื’ืžื” ืื• ืืช ื”ื”ื“ื’ืžื”, ืฆืจื™ืš ืœื”ืฉืชืžืฉ ื‘ืžืื’ืจ Looker Embed SDK.

ื›ื“ื™ ืœื”ืชืงื™ืŸ ืืช Looker Embed SDK ื‘ืืžืฆืขื•ืช ืžืื’ืจ Looker Embed SDK, ืžื‘ืฆืขื™ื ืืช ื”ืฉืœื‘ื™ื ื”ื‘ืื™ื:

  1. ืžืชืงื™ื ื™ื ืืช Node.js, ืื ืขื“ื™ื™ืŸ ืœื ื”ืชืงื ืชื ืื•ืชื•.
  2. ืžื•ืจื™ื“ื™ื ืื• ืžืฉื›ืคืœื™ื ืืช ืžืื’ืจ /looker-open-source/embed-sdk.
  3. ื‘ื—ืœื•ืŸ ื”ืžืกื•ืฃ, ื ื›ื ืกื™ื ืœืกืคืจื™ื™ื” /embed-sdk ื•ืžืจื™ืฆื™ื ืืช ื”ืคืงื•ื“ื•ืช ื”ื‘ืื•ืช:
npm install
npm start

ื™ืฆื™ืจืช ื”ืชื•ื›ืŸ ื”ืžื•ื˜ืžืข

ืงื•ื“ื ืžืืชื—ืœื™ื ืืช ื”-SDK ืขื ื”ื›ืชื•ื‘ืช ืฉืœ ืฉืจืช Looker ื•ื ืงื•ื“ืช ื”ืงืฆื” ืฉืœ ืฉืจืช ื”ืืคืœื™ืงืฆื™ื” ืœื”ื˜ืžืขื”, ืฉื™ื™ืฆื•ืจ ื›ืชื•ื‘ืช URL ื—ืชื•ืžื” ืœื”ืชื—ื‘ืจื•ืช ืœ-Looker ื”ืžื•ื˜ืžืข. ื›ืœ ื”ืชื•ื›ืŸ ื”ืžื•ื˜ืžืข ืžืฉืชืžืฉ ื‘ืฉืจืชื™ื ื”ืืœื”. ืœื”ื˜ืžืขื” ืคืจื˜ื™ืช, ืžืฉืžื™ื˜ื™ื ืืช ื ืงื•ื“ืช ื”ืงืฆื” ืฉืœ ื”ื—ืชื™ืžื”.

getEmbedSDK().init('looker.example.com', '/auth')

ืœืื—ืจ ืžื›ืŸ, ื”ืชื•ื›ืŸ ื”ืžื•ื˜ืžืข ื ื•ืฆืจ ื‘ืืžืฆืขื•ืช ืกื“ืจื” ืฉืœ ืฉืœื‘ื™ื ืœื”ื’ื“ืจืช ื”ืคืจืžื˜ืจื™ื ืฉืœื•. ื—ืœืง ืžื”ืคืจืžื˜ืจื™ื ื”ืืœื” ื”ื ืื•ืคืฆื™ื•ื ืœื™ื™ื ื•ื—ืœืงื ื”ื ื—ื•ื‘ื”.

ื”ืชื”ืœื™ืš ืžืชื—ื™ืœ ื‘ื™ืฆื™ืจืช ื”ื›ืœื™ ืœื‘ื ื™ื™ืช ืœื•ื—ื•ืช ื‘ืงืจื” ื‘ืืžืฆืขื•ืช ืœื•ื— ื‘ืงืจื” id ืื• ื‘ืืžืฆืขื•ืช url ืฉืžืคื ื” ืœืœื•ื— ื‘ืงืจื” (ืฉื ื•ืฆืจ ื‘ืชื”ืœื™ืš ืฉืžืชื•ืืจ ื‘ื“ืฃ ื”ืชื™ืขื•ื“ ื‘ื ื•ืฉื ื”ื˜ืžืขื” ืขื ื—ืชื™ืžื”).

getEmbedSDK().createDashboardWithId('id')

ืื•

getEmbedSDK().createDashboardWithUrl('url')

ืœืื—ืจ ืžื›ืŸ ืชื•ื›ืœื• ืœื”ื•ืกื™ืฃ ืขื•ื“ ืžืืคื™ื™ื ื™ื ืœื›ืœื™ ื”ื‘ื ื™ื™ื” ื›ื“ื™ ืœื”ืฉืœื™ื ืืช ื”ื”ื’ื“ืจื”.

ืœื“ื•ื’ืžื”, ืืชื ื™ื›ื•ืœื™ื ืœืฆื™ื™ืŸ ืื™ืคื” ื‘ื“ืฃ ื”ืื™ื ื˜ืจื ื˜ ืœื”ื•ืกื™ืฃ ืืช ืžืžืฉืง ื”ืžืฉืชืžืฉ ืฉืœ Looker ืœื”ื˜ืžืขื”. ื”ืงืจื™ืื” ื”ื‘ืื” ืžืžืงืžืช ืืช ืžืžืฉืง ื”ืžืฉืชืžืฉ ืฉืœ Looker ืœื”ื˜ืžืขื” ื‘ืชื•ืš ืจื›ื™ื‘ HTML ืขื ืขืจืš ืžื–ื”ื” ืฉืœ dashboard:

.appendTo('#dashboard')

ื”ื•ืกืคืช ื’ื•ืจืžื™ื ืฉืžื˜ืคืœื™ื ื‘ืื™ืจื•ืขื™ื:

.on('dashboard:run:start',
  () => updateStatus('Running')
)
.on('dashboard:run:complete',
  () => updateStatus('Done')
)

ื™ื•ืฆืจื™ื ืœืงื•ื— ืžื•ื˜ืžืข ืขืœ ื™ื“ื™ ืงืจื™ืื” ืœืฉื™ื˜ืช build:

.build()

ื”ืชื—ื‘ืจื•ืช ืœืชื•ื›ืŸ ื”ืžื•ื˜ืžืข

ืื—ืจื™ ืฉื”ืœืงื•ื— ื ื•ืฆืจ, ืงื•ืจืื™ื ืœ-connect ื›ื“ื™ ืœื™ืฆื•ืจ ืืช ื”-iframe. ืชื”ืœื™ืš ื”ื—ื™ื‘ื•ืจ ื™ื•ืฆืจ ืืช ืžืืคื™ื™ืŸ src ืฉืžืฉืžืฉ ืœืื™ื™ืคืจื™ื ื‘ืคื•ืขืœ. ื”ืื•ืคืŸ ืฉื‘ื• ื ื•ืฆืจ ื”ืขืจืš src ืชืœื•ื™ ื‘ืื•ืคืŸ ื”ืืชื—ื•ืœ ืฉืœ Embed SDK:

  1. ื—ืชื•ื: ื ืงื•ื“ืช ื”ืงืฆื” ืฉืฆื•ื™ื ื” ื‘ืืจื’ื•ืžื ื˜ ื”ืฉื ื™ ืฉืœ ื”ืงืจื™ืื” ืœ-init ื ืงืจืืช. ื ืงื•ื“ืช ื”ืงืฆื” ืืžื•ืจื” ืœื”ื—ื–ื™ืจ ื›ืชื•ื‘ืช URL ื—ืชื•ืžื” ืฉืœ ื”ืชื—ื‘ืจื•ืช ืœื”ื˜ืžืขื”.
  2. ืœืœื ืงื•ื‘ืฆื™ Cookie: ื ืงื•ื“ืช ื”ืงืฆื” ืื• ื”ืคื•ื ืงืฆื™ื” ืฉืžืฆื•ื™ื ื•ืช ื‘ืืจื’ื•ืžื ื˜ ื”ืฉื ื™ ืฉืœ ื”ืงืจื™ืื” initCookieless ื ืงืจืื•ืช. ื ืงื•ื“ืช ื”ืงืฆื” ืื• ื”ืคื•ื ืงืฆื™ื” ืืžื•ืจื•ืช ืœื”ื—ื–ื™ืจ ื˜ื•ืงื ื™ื ืœืœื ืงื•ื‘ืฆื™ Cookie, ื‘ืžื™ื•ื—ื“ ื˜ื•ืงื ื™ื ืฉืœ ืื™ืžื•ืช ื•ื ื™ื•ื•ื˜. ื”ืืกื™ืžื•ื ื™ื ืžืฆื•ืจืคื™ื ืœื›ืชื•ื‘ืช ื”-URL ืฉืœ ื”ื”ืชื—ื‘ืจื•ืช ืœื”ื˜ืžืขื”.
  3. ืคืจื˜ื™: ื”ื—ื™ื‘ื•ืจ ืœื”ื˜ืžืขื” ื”ื•ื ืคืจื˜ื™ ืื ืœื ืžืฆื™ื™ื ื™ื ืืช ื”ืืจื’ื•ืžื ื˜ ื”ืฉื ื™ ืฉืœ ื”ืงืจื™ืื” init. ื‘ืžืงืจื” ื”ื–ื”, ื›ืชื•ื‘ืช ื”-URL ื ื’ื–ืจืช ืžื”ื›ืœื™ ืœื™ืฆื™ืจืช ืžื•ื“ืขื•ืช ื•ืžืงื•ืฉื˜ืช ื‘ืคืจืžื˜ืจื™ื ืฉื ื“ืจืฉื™ื ืœื”ื˜ืžืขื” ืฉืœ Looker. ื‘ื”ื˜ืžืขื” ืคืจื˜ื™ืช, ื”ืžืฉืชืžืฉ ืืžื•ืจ ืœื”ื™ื•ืช ืžื—ื•ื‘ืจ ื›ื‘ืจ ืœ-Looker ืื• ืฉื›ืชื•ื‘ืช ื”-URL ืœื”ื˜ืžืขื” ื›ื•ืœืœืช ืืช ื”ืคืจืžื˜ืจ allow_login_screen=true.

โ€ซconnect ืžื—ื–ื™ืจ Promise ืฉืžื•ื‘ื™ืœ ืœืžืžืฉืง ื”ื—ื™ื‘ื•ืจ ืฉืœ ื”-iframe ื”ืžื•ื˜ืžืข.

  .connect()
  .then((connection) => {
    // Save the connection
  })
  .catch(console.error)

ืื™ื ื˜ืจืืงืฆื™ื”

โ€ซEmbed SDK 2.0.0 ืžื—ื–ื™ืจื” ื—ื™ื‘ื•ืจ ืžืื•ื—ื“ ืฉืชื•ืžืš ื‘ืื™ื ื˜ืจืืงืฆื™ื” ืขื ื›ืœ ืกื•ื’ื™ ื”ืชื•ื›ืŸ ื‘-Looker. ืืคืœื™ืงืฆื™ื™ืช ื”ื”ื˜ืžืขื” ื™ื›ื•ืœื” ืœืงื‘ื•ืข ืื™ื–ื” ืกื•ื’ ืชื•ื›ืŸ ืžื•ืฆื’ ื•ืœื‘ืฆืข ืื™ื ื˜ืจืืงืฆื™ื” ื‘ื”ืชืื.

if (connection.getPageType() === 'dashboards') {
  connection.asDashboardConnection().run()
} else (connection.getPageType() === 'looks') {
  connection.asLookConnection().run()
} else (connection.getPageType() === 'explore') {
  connection.asExploreConnection().run()
}

ืื™ืŸ ืฆื•ืจืš ืœื™ืฆื•ืจ ืžื—ื“ืฉ ืืช ื”-iframe ื›ืฉืฆืจื™ืš ืœื˜ืขื•ืŸ ืชื•ื›ืŸ ืฉื•ื ื”. ื‘ืžืงื•ื ื–ืืช, ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ืฉื™ื˜ื•ืช ื”ื—ื™ื‘ื•ืจ loadDashboard, โ€loadLook, โ€loadExplore ืื• loadUrl. ื”ืฉื™ื˜ื•ืช loadDashboard, โ€loadLook ื•-loadExplore ืžืงื‘ืœื•ืช id. ื”ืฉื™ื˜ื” loadUrl ืžืงื‘ืœืช ื”ื˜ืžืขื” URL, ื•ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ืฉื™ื˜ื” ื”ื–ื• ื›ื“ื™ ืœืฆื™ื™ืŸ ืคืจืžื˜ืจื™ื ื ื•ืกืคื™ื (ื›ืžื• ืžืกื ื ื™ื).

connection.loadDashboard('42')
// OR
connection.loadUrl('/embed/dashboards/42?state=california')

ืื ื™ืฉ ืฆื•ืจืš ืœื™ืฆื•ืจ iframe ื—ื“ืฉ, Embed SDK ืœื ื™ืงืจื ืฉื•ื‘ ืœื ืงื•ื“ื•ืช ื”ืงืฆื” ืฉืœ ื”ื—ืชื™ืžื” ืื• ืฉืœ ืงื‘ืœืช ื”ืกืฉืŸ. ื‘ืžืงื•ื ื–ืืช, ื”ื•ื ื™ื™ืฆื•ืจ iframe src ื™ืฉื™ืจื•ืช ืžื”ื›ืœื™ ืœื‘ื ื™ื™ืช ืืชืจื™ื. ืื ื™ื”ื™ื” ืฆื•ืจืš ืœื™ืฆื•ืจ ืกืฉืŸ ื—ื“ืฉ ืฉืœ ื”ื˜ืžืขื”, ื™ื”ื™ื” ืฆืจื™ืš ืœืืชื—ืœ ืžื—ื“ืฉ ืืช Embed SDK ื‘ืื•ืคืŸ ื”ื‘ื:

getEmbedSDK(new LookerEmbedExSDK()).init('looker.example.com', '/auth')

ื ืงื•ื“ืช ืงืฆื” ืœืื™ืžื•ืช ืฉืœ ื›ืชื•ื‘ืช URL ื—ืชื•ืžื”

ื”ืงื˜ืข ื”ื–ื” ืœื ืจืœื•ื•ื ื˜ื™ ืœื”ื˜ืžืขื” ืœืœื ืงื•ื‘ืฆื™ Cookie. ืคืจื˜ื™ื ื ื•ืกืคื™ื ื–ืžื™ื ื™ื ื‘ืžืืžืจ ื‘ื ื•ืฉื ื”ื˜ืžืขื” ืœืœื ืงื•ื‘ืฆื™ Cookie.

ื›ื“ื™ ืœื”ืฉืชืžืฉ ื‘-Embed SDK, ืฆืจื™ืš ืœืกืคืง ืฉื™ืจื•ืช ืœืงืฆื” ื”ืขื•ืจืคื™ ืฉืžื˜ืคืœ ื‘ื—ืชื™ืžื” ืฉืœ ื›ืชื•ื‘ืช ื”-URL ืœื”ื˜ืžืขื”. ืฉื™ืจื•ืช ื”-SDK ืœื”ื˜ืžืขื” ืงื•ืจื ืœืฉื™ืจื•ืช ื”ื–ื” ื›ื“ื™ ืœื™ืฆื•ืจ ื›ืชื•ื‘ืช URL ื—ืชื•ืžื” ืฉื™ื™ื—ื•ื“ื™ืช ืœืžืฉืชืžืฉ ืฉืฉื•ืœื— ืืช ื”ื‘ืงืฉื”. ืชื”ืœื™ืš ื”-Backend ื™ื›ื•ืœ ืœื™ืฆื•ืจ ืืช ื›ืชื•ื‘ืช ื”-URL ื”ื—ืชื•ืžื” ืœื”ื˜ืžืขื” ื‘ืขืฆืžื• ื‘ืืžืฆืขื•ืช ืกื•ื“ ืœื”ื˜ืžืขื”, ืื• ืœื™ืฆื•ืจ ืืช ื›ืชื•ื‘ืช ื”-URL ื‘ืืžืฆืขื•ืช ืงืจื™ืื” ืœ-Looker Create Signed Embed URL API. ื™ืฆื™ืจื” ื•ื—ืชื™ืžื” ื™ื“ื ื™ื•ืช ืฉืœ ื›ืชื•ื‘ื•ืช URL ืžืืคืฉืจื•ืช ืœื”ื™ืžื ืข ืžื”ืคืขืœืช Looker API, ื•ื›ืš ืœื”ืงื˜ื™ืŸ ืืช ื–ืžืŸ ื”ืื—ื–ื•ืจ. ื”ืงืจื™ืื” ืœ-Looker API ื“ื•ืจืฉืช ืคื—ื•ืช ืงื•ื“ ื•ืงืœ ื™ื•ืชืจ ืœืชื—ื–ืง ืื•ืชื”.

ื“ื•ื’ืžื” ืœืฉื™ื˜ืช ืขื–ืจ ื‘-JavaScript ืœื™ืฆื™ืจืช ื›ืชื•ื‘ืช URL ื—ืชื•ืžื”, createSignedUrl(), ื ืžืฆืืช ื‘-server/utils/auth_utils.ts. ื”ืฉื™ืžื•ืฉ ื‘ื• ื”ื•ื ื›ื“ืœืงืžืŸ:

import { createSignedUrl } from './utils/auth_utils'

app.get('/looker_auth', function (req, res) {
  // It is assumed that the request is authorized
  const src = req.query.src
  const host = 'looker.example.com'
  const secret = ... // Embed secret from Looker Server Embed Admin page
  const user = ... // Embedded user definition
  const url = createSignedUrl(src, user, host, secret)
  res.json({ url })
})

ืืคืฉืจ ืœืขื™ื™ืŸ ื‘ื“ื•ื’ืžื” ืฉืœ Python ื‘ืžืื’ืจ.

ื”ื’ื“ืจืช ืื™ืžื•ืช ืžืชืงื“ื ืฉืœ ื›ืชื•ื‘ื•ืช URL ื—ืชื•ืžื•ืช

ื”ืงื˜ืข ื”ื–ื” ืœื ืจืœื•ื•ื ื˜ื™ ืœื”ื˜ืžืขื” ืœืœื ืงื•ื‘ืฆื™ Cookie. ืคืจื˜ื™ื ื ื•ืกืคื™ื ื–ืžื™ื ื™ื ื‘ืžืืžืจ ื‘ื ื•ืฉื ื”ื˜ืžืขื” ืœืœื ืงื•ื‘ืฆื™ Cookie.

ืืคืฉืจ ืœื”ื’ื“ื™ืจ ืืช ื ืงื•ื“ืช ื”ืงืฆื” (endpoint) ืฉืœ ื”ืื™ืžื•ืช ื›ืš ืฉืชืืคืฉืจ ื›ื•ืชืจื•ืช ื‘ืงืฉื” ื‘ื”ืชืืžื” ืื™ืฉื™ืช ื•ืชืžื™ื›ื” ื‘-CORS. ืœืฉื ื›ืš, ืžืขื‘ื™ืจื™ื ืื•ื‘ื™ื™ืงื˜ ืืคืฉืจื•ื™ื•ืช ืœืฉื™ื˜ื” init.

getEmbedSDK().init('looker.example.com', {
  url: 'https://api.acme.com/looker/auth',
  headers: [{ name: 'Foo Header', value: 'Foo' }],
  params: [{ name: 'foo', value: 'bar' }],
  withCredentials: true, // Needed for CORS requests to Auth endpoint include Http Only cookie headers
})

ืคืชืจื•ืŸ ื‘ืขื™ื•ืช

โ€ซEmbed SDK ืžื‘ื•ืกืก ืขืœ chatty. โ€ซChatty ืžืฉืชืžืฉ ื‘ื ื™ืคื•ื™ ื‘ืื’ื™ื ืœืจื™ืฉื•ื ื‘ื™ื•ืžืŸ. ืืคืฉืจ ืœื”ืคืขื™ืœ ืืช ื”ืจื™ืฉื•ื ื‘ื™ื•ืžืŸ ื‘ืžืกื•ืฃ ืฉืœ ื”ื“ืคื“ืคืŸ ื‘ืืžืฆืขื•ืช ื”ืคืงื•ื“ื” ื”ื‘ืื”:

localStorage.debug = 'looker:chatty:*'
```none

Note that both the parent window and the embedded content have separate local storage, so you can enable logging on one, the other, or both. You can disable logging with this command:

```javascript
localStorage.debug = ''