Introdução ao SDK de incorporação

O SDK de incorporação do Looker é uma biblioteca de funções que você pode adicionar ao código do seu aplicativo da Web baseado em navegador para gerenciar painéis, Looks e Análises detalhadas incorporados no seu app da Web. O SDK de incorporação facilita a incorporação das seguintes maneiras:

  • Fornece o encapsulamento do conteúdo incorporado sem a necessidade de criar elementos HTML manualmente.
  • Fornecer comunicação ponto a ponto para que não haja comunicação entre frames. O SDK de incorporação lida com a transmissão de mensagens de vários domínios entre a página da Web do host e o conteúdo incorporado do Looker, usando um canal de mensagens dedicado.

Sem o SDK de incorporação, é possível invocar ou responder a eventos no conteúdo incorporado do Looker usando eventos JavaScript, como dashboard:run:start ou page:changed, que são descritos na página de documentação Eventos JavaScript incorporados. Os desenvolvedores que incorporam conteúdo do Looker com eventos JavaScript precisam criar os elementos HTML para armazenar o conteúdo incorporado e depender de eventos de transmissão de janela para comunicações entre o app da Web e o conteúdo incorporado.

O SDK de incorporação do Looker é diferente da API Looker e do SDK da API Looker:

  • O SDK de incorporação do Looker fica no código do lado do cliente do seu aplicativo da Web e gerencia o contexto e o conteúdo de incorporação do Looker. O SDK de incorporação não dá acesso à API Looker.
  • A API Looker fica no servidor com sua instância do Looker e executa comandos nesse servidor.
  • Os SDKs do cliente da API Looker residem no código de aplicativos que não são de navegador para oferecer acesso fácil às funções da API Looker.

O Looker não controla a ordem em que os navegadores enviam eventos para aplicativos da Web. Isso significa que a ordem dos eventos não é garantida em todos os navegadores ou plataformas. Escreva seu JavaScript de maneira adequada para considerar o processamento de eventos de diferentes navegadores.

Exemplo rápido

Este exemplo cria um contexto de incorporação do Looker, insere esse elemento em um elemento DOM com um ID dashboard e mostra um dashboard com um ID de 11 no contexto de incorporação do Looker. Os eventos dashboard:run:start e dashboard:run:complete são usados para atualizar o estado da interface da janela de incorporação, e um botão com o ID run tem um script para enviar uma mensagem dashboard:run ao painel.

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

const setupDashboard = (dashboard) => {
  document.querySelector('#run').addEventListener('click', () => {
    dashboard.send('dashboard:run')
  })
}

LookerEmbedSDK.createDashboardWithId(11)
  .appendTo('#dashboard')
  .on('dashboard:run:start',
      () => updateState('#dashboard-state', 'Running')
  )
  .on('dashboard:run:complete',
      () => updateState('#dashboard-state', 'Done')
  )
  .build()
  .connect()
  .then(setupDashboard)
  .catch((error: Error) => {
    console.error('An unexpected error occurred', error)
  })

Um exemplo mais completo é descrito na página de documentação da demonstração do SDK de incorporação.

Configurar o SDK de incorporação do Looker

O SDK de incorporação do Looker usa um padrão de interface fluída. Depois de instalar o SDK de incorporação, construa o conteúdo incorporado e se conecte a ele.

Como instalar o SDK de incorporação

Você pode fazer o download da biblioteca Embed SDK do Looker pelo gerenciador de pacotes de nós (NPM, na sigla em inglês) em https://www.npmjs.com/package/@looker/embed-sdk. No entanto, se você quiser conferir o código de exemplo ou a demonstração, use o repositório do SDK do Looker Embed.

Para instalar o SDK de incorporação do Looker usando o repositório correspondente, faça o seguinte:

  1. Instale o Node.js, se ainda não tiver.
  2. Faça o download ou clone o repositório do /looker-open-source/embed-sdk.
  3. Em uma janela de terminal, navegue até o diretório /embed-sdk e execute estes comandos:
npm install
npm start

Como criar o conteúdo incorporado

Primeiro, inicialize o SDK com o endereço do seu servidor da Web e, opcionalmente, o endpoint no servidor que vai realizar a autenticação. Eles são usados por todo o conteúdo incorporado.

Inclua o número da porta se ele for necessário para acessar o servidor do Looker de clientes do navegador. Por exemplo: looker.example.com:443

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

Em seguida, o conteúdo incorporado é criado usando uma série de etapas para definir os parâmetros. Alguns desses parâmetros são opcionais e outros obrigatórios.

O processo começa com a criação do builder com um painel id ou com um url que se refere a um painel (criado pelo processo descrito na página de documentação Inserção assinada).

LookerEmbedSDK.createDashboardWithId(id)

ou

LookerEmbedSDK.createDashboardWithUrl(url)

É possível adicionar outros atributos ao builder para concluir a configuração. Por exemplo, você pode especificar em que parte da sua página da Web UI de incorporação do Looker deve ser inserida. A chamada a seguir coloca a interface de incorporação do Looker em um elemento HTML com um valor de ID de dashboard:

.appendTo('#dashboard')

É possível adicionar manipuladores de eventos:

.on('dashboard:run:start',
  () => updateState('#dashboard-state', 'Running')
)
.on('dashboard:run:complete',
  () => updateState('#dashboard-state', 'Done')
)

Você termina criando o elemento incorporado:

.build()

Como se conectar ao conteúdo incorporado

Se você quiser enviar e receber mensagens do elemento incorporado, chame connect(), que retorna uma promessa que é resolvida na interface de comunicação do elemento em questão:

.connect()
.then(setupDashboard)
.catch(console.error)

Como criar URLs para o SDK

A documentação principal para URLs de incorporação assinados do Looker está na página de documentação Incorporação assinada. A única diferença ao criar URLs para o SDK é que você precisa adicionar um parâmetro sdk=2 ao URL incorporado, além de outros parâmetros, como filtros e embed_domain. Esse parâmetro permite que o Looker determine se o SDK está presente e aproveite outros recursos fornecidos por ele. Exemplo:

/embed/looks/4?embed_domain=https://mywebsite.com&sdk=2
                                                 ^^^^^^

O SDK não pode adicionar esse parâmetro porque ele faz parte do URL de incorporação assinado.

Endpoint de autenticação

Como o segredo de incorporação precisa ser protegido com cuidado, não é possível criar URLs de incorporação assinados no navegador. Para tornar o processo mais fácil e seguro, siga estas etapas:

  1. Implemente uma função de assinatura de URL no servidor da Web. O servidor precisa retornar um URL assinado usando um dos processos documentados no repositório do GitHub Exemplos de SSO de incorporação do Looker (em inglês).
  2. Transmita o URL de incorporação assinado para esse endpoint de assinatura no SDK de incorporação. O local do endpoint é especificado pelo parâmetro authUrl em LookerEmbedSDK.init().

Se especificado, sempre que um elemento de incorporação for criado usando apenas um ID, o URL de incorporação será gerado usando o tipo do elemento, o host do Looker fornecido e todos os parâmetros fornecidos. Exemplo:

LookerEmbedSDK.init('looker.example.com', '/looker_auth')
LookerEmbedSDK.createcreateDashboardWithId(11)
  .build()

O exemplo anterior vai chamar o endpoint /looker_auth e retornar um URL de incorporação assinado que pode ser usado para criar o conteúdo incorporado:

src=https://looker.example.com/embed/dashboards/11?sdk=2&embed_host=https://yourhost.example.com

Configuração de autenticação avançada

O endpoint de autenticação pode ser ainda mais configurado para permitir cabeçalhos de solicitação personalizados e suporte ao CORS. Para fazer isso, transmita um objeto de opções para o método init:


LookerEmbedSDK.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
  })

Node helper

Um método auxiliar de assinatura createSignedUrl() é fornecido em server_utils/auth_utils.ts. O uso é o seguinte:

import { createSignedUrl } from './auth_utils'

app.get('/looker_auth', function(req, res) {
  // TO DO: Add your code here to authenticate that the request is from a valid user
  const src = req.query.src;
  const host = 'https://looker.example.com'
  const secret = YOUR_EMBED_SECRET
  const user = authenticatedUser
  const url = createSignedUrl(src, user, host, secret);
  res.json({ url });
});

Esta é a estrutura de dados do usuário:

interface LookerEmbedUser {
  external_user_id: string
  first_name?: string
  last_name?: string
  session_length: number
  force_logout_login?: boolean,
  permissions: LookerUserPermission[]
  models: string[]
  group_ids?: number[]
  external_group_id?: string
  user_attributes?: {[key: string]: any}
  access_filters: {}
}

O parâmetro access_filters foi removido do Looker 3.10, mas ainda é necessário com um marcador de posição vazio no URL de incorporação.

Solução de problemas

Geração de registros

O SDK incorporado é criado com base no chatty. O Chatty usa debug para gerar registros. Para ativar a geração de registros em um console do navegador, use este comando:

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 = ''