Introdução ao SDK incorporado

O SDK incorporado do Looker é uma biblioteca de funções que podem ser adicionadas ao código do seu aplicativo da Web baseado em navegador para gerenciar painéis, aparências e explorações incorporados no seu aplicativo da Web. O SDK incorporado facilita a incorporação das seguintes maneiras:

  • Fornecer o encapsulamento do conteúdo incorporado sem a necessidade de criar elementos HTML manualmente.
  • Ele fornece comunicação ponto a ponto para que não haja comunicação entre frames. O SDK incorporado incorpora 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 mensagem dedicado.

Sem o SDK incorporado, você pode 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 de JavaScript incorporados. Os desenvolvedores que incorporam conteúdo do Looker com eventos JavaScript precisam criar os elementos HTML para hospedar o conteúdo incorporado e confiar em eventos de transmissão de janela para comunicações entre o app da Web e o conteúdo incorporado.

O SDK do Looker Embed é diferente da API Looker e do SDK da API Looker:

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

Lembre-se de que o Looker não controla a ordem em que os navegadores enviam eventos para aplicativos da Web. Isso significa que não garantimos a ordem dos eventos em navegadores ou plataformas. Escreva seu JavaScript corretamente para contabilizar o processamento de eventos de diferentes navegadores.

Exemplo rápido

Este exemplo constrói um contexto de incorporação do Looker, o insere em um elemento DOM com um ID de dashboard e, em seguida, exibe um painel 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 IU da janela de incorporação, e um botão com um ID de run é programado 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 Incorporar demonstração do SDK.

Como configurar o SDK incorporado do Looker

O SDK incorporado do Looker usa um padrão de interface fluente. Depois de instalar o SDK incorporado, você cria o conteúdo incorporado e se conecta ao conteúdo incorporado.

Como instalar o SDK incorporado

Acesse a biblioteca de SDK incorporado do Looker e do gerenciador de pacotes de nós (NPM) em https://www.npmjs.com/package/@looker/embed-sdk. No entanto, se você quiser ver o exemplo de código ou a demonstração, use o repositório do SDK incorporado do Looker.

Para instalar o SDK do Looker Embed usando o repositório do SDK do Looker Embed:

  1. Instale o Node.js se você ainda não o tiver.
  2. Faça o download ou clone o repositório /looker-open-source/embed-sdk.
  3. Em uma janela do 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, se preferir, o endpoint no servidor que executará a autenticação. Eles são usados por todo o conteúdo incorporado.

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

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

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

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

LookerEmbedSDK.createDashboardWithId(id)

ou

LookerEmbedSDK.createDashboardWithUrl(url)

Você pode adicionar outros atributos ao builder para concluir a configuração. Por exemplo, é possível especificar onde a página da Web do Looker deve ser inserida. A chamada a seguir coloca a IU do Looker incorporada em um elemento HTML com um valor de ID de dashboard:

.appendTo('#dashboard')

Você pode adicionar manipuladores de eventos:

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

Para concluir, crie o elemento incorporado:

.build()

Como se conectar ao conteúdo incorporado

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

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

Criar URLs para o SDK

A documentação principal dos URLs de incorporação de SSO do Looker está na página de documentação Incorporação de Logon único (SSO). A única diferença ao criar URLs para o SDK é que você precisará adicionar um parâmetro sdk=2 ao URL incorporado junto de outros parâmetros, como filtros e o parâmetro embed_domain. Esse parâmetro permite que o Looker determine se o SDK está presente e aproveite os recursos adicionais fornecidos pelo SDK. Exemplo:

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

O SDK não pode adicionar este parâmetro por fazer parte do URL de SSO assinado.

O endpoint de autenticação

Como o secret de incorporação precisa ser cuidadosamente protegido, não é possível criar URLs de SSO incorporados no navegador. Para tornar o processo mais fácil e seguro, faça o seguinte:

  1. Implemente uma função de assinatura de URL no seu servidor da Web. O servidor retorna um URL assinado usando um dos processos documentados no repositório Exemplos de SSO de incorporação do Looker (em inglês).
  2. Transmita o URL do SSO incorporado a esse endpoint de assinatura no SDK incorporado. 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 dele será gerado com base no tipo do elemento, no host do Looker fornecido e nos parâmetros fornecidos. Exemplo:

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

Isso chamará o endpoint /looker_auth e retornará um URL de SSO 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 avançada do Authentication

É possível configurar ainda mais o endpoint Auth para permitir cabeçalhos de solicitação personalizados e suporte a 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
  })

Assistente de nó

Um método auxiliar de assinatura createSignedUrl() é fornecido em server_utils/auth_utils.ts. O uso dele é 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 no Looker 3.10, mas ainda é necessário com um marcador vazio no URL incorporado.

Solução de problemas

Geração de registros

O SDK incorporado foi criado com base no chatty. O Chatty usa debug para a geração de registros. Ative a geração de registros em um console do navegador com 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 = ''