Quando Looker è incorporato in un iframe utilizzando l'incorporamento firmato, alcuni browser utilizzano per impostazione predefinita una policy sui cookie che blocca 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 personalizzato. Tuttavia, i domini vanity non possono essere utilizzati in alcuni scenari. È per questi scenari che è possibile utilizzare l'incorporamento 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 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, quindi il server di Looker non può identificare l'utente associato alla richiesta.
Per risolvere questo problema, l'incorporamento senza cookie di Looker associa i token a ogni richiesta che può essere utilizzata per ricreare la sessione utente nel server Looker. È responsabilità dell'applicazione di incorporamento ottenere questi token e renderli disponibili all'istanza di Looker in esecuzione nell'iframe incorporato. La procedura per ottenere e fornire questi token è descritta nel resto di questo 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 essere elencato nella lista consentita dei domini di incorporamento o, se utilizzi Looker 23.8 o versioni successive, 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 di incorporamento. È possibile generare più iframe contemporaneamente o in sequenza. Se implementato correttamente, l'iframe si unirà automaticamente alla sessione creata dal primo iframe. L'SDK Embed di Looker semplifica questo processo unendosi automaticamente alla sessione esistente. Per linee guida su come evitare conflitti di accesso simultanei durante il caricamento di più iframe, consulta Best practice per l'incorporamento di più iframe con l'incorporamento senza cookie.

- L'utente esegue un'azione nell'applicazione di incorporamento che comporta la creazione di un iframe di Looker.
- 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, questa chiamerà il server dell'applicazione di incorporamento per acquisire la sessione di incorporamento di Looker. In caso contrario, l'SDK Embed chiamerà l'URL dell'endpoint fornito.
- 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'incorporamento firmato di Looker, in quanto accetta come input la definizione dell'utente incorporato. Se esiste già una sessione di incorporamento di Looker per l'utente chiamante, il token di riferimento della sessione associato deve essere incluso nella chiamata. Questo aspetto verrà spiegato in maggiore dettaglio nella sezione Acquisizione della sessione di questo documento.
- L'elaborazione dell'endpoint della sessione di incorporamento di acquisizione è 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 dell'endpoint per l'acquisizione della sessione di incorporamento convalida e poi crea o aggiorna l'utente di incorporamento. Può anche accettare un token di riferimento della sessione esistente. Questo è importante perché consente a più iframe incorporati di Looker di condividere la stessa sessione. L'utente incorporato non verrà aggiornato se viene fornito un token di riferimento della sessione e la sessione non è scaduta. In questo modo, è possibile creare un iframe utilizzando un URL di incorporamento firmato e altri iframe senza un URL di incorporamento firmato. In questo caso, gli iframe senza URL di incorporamento firmati erediteranno il cookie dalla prima sessione. - La chiamata 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)
- Il server dell'applicazione di incorporamento deve tenere traccia dei dati restituiti dai dati di Looker e associarli sia all'utente chiamante sia allo user agent del browser dell'utente chiamante. I suggerimenti su come eseguire questa operazione sono forniti nella sezione Genera 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.
Una volta restituiti i token al browser, è necessario creare un URL di accesso per l'incorporamento di Looker. L'SDK Embed di Looker creerà automaticamente l'URL di accesso per l'incorporamento. Per utilizzare l'API
windows.postMessageper creare l'URL di accesso per l'incorporamento, consulta la sezione Utilizzo dell'API Lookerwindows.postMessagedi questo documento per alcuni esempi.L'URL di accesso non contiene i dettagli dell'utente con incorporamento firmato. Contiene l'URI di destinazione, 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 iframe aggiuntivi, è necessario acquisire nuovamente una sessione di incorporamento. Tuttavia, se viene fornito il token di riferimento della sessione, il token di autorizzazione verrà associato alla stessa sessione.
L'endpoint di accesso per l'incorporamento di Looker determina se l'accesso è per l'incorporamento senza cookie, indicato dalla presenza del token di autorizzazione. Se il token di autorizzazione è valido, verifica quanto segue:
- La sessione associata è ancora valida.
- L'utente incorporato associato è ancora valido.
- Lo user agent del browser associato alla richiesta corrisponde all'agente del browser associato alla sessione.
Se i controlli del passaggio precedente hanno esito positivo, la richiesta viene reindirizzata utilizzando l'URI di destinazione contenuto nell'URL. Si tratta della stessa procedura utilizzata per l'accesso all'incorporamento firmato di Looker.
Questa richiesta è il reindirizzamento per avviare la dashboard di Looker. Questa richiesta avrà il token di navigazione come parametro.
Prima che l'endpoint venga eseguito, il server Looker cerca il token di navigazione nella richiesta. Se il server trova il token, verifica quanto segue:
- La sessione associata è ancora valida.
- Lo user agent 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.
L'HTML per caricare la dashboard viene restituito all'iframe.
La UI di Looker in esecuzione nell'iframe determina che l'HTML della dashboard è una risposta di incorporamento senza cookie. A questo punto, la UI di Looker invia un messaggio all'applicazione di incorporamento per richiedere i token recuperati nel passaggio 6. La UI attende quindi di ricevere i token. Se i token non arrivano, viene visualizzato un messaggio.
L'applicazione di incorporamento invia i token all'iframe incorporato di Looker.
Quando i token vengono ricevuti, la UI di Looker in esecuzione nell'iframe avvia il processo per eseguire il rendering dell'oggetto della richiesta. Durante questo processo, la UI effettuerà chiamate API al server Looker. Il token API ricevuto nel passaggio 15 viene inserito automaticamente come intestazione in tutte le richieste API.
Prima di eseguire qualsiasi endpoint, il server Looker cerca il token API nella richiesta. Se il server trova il token, verifica quanto segue:
- La sessione associata è ancora valida.
- Lo user agent 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.
Vengono restituiti i dati della dashboard.
Viene eseguito il rendering della dashboard.
L'utente ha il controllo della dashboard.
Generazione di nuovi token
Il seguente diagramma di sequenza illustra la generazione di nuovi token.

- La UI di Looker in esecuzione nell'iframe incorporato monitora il TTL dei token di incorporamento.
- Quando i token si avvicinano alla scadenza, l'interfaccia utente di Looker invia un messaggio di token di aggiornamento al client dell'applicazione di incorporamento.
- 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, questa chiamerà il server dell'applicazione di incorporamento per generare nuovi token. In caso contrario, l'SDK Embed chiamerà l'URL dell'endpoint fornito.
- L'applicazione di incorporamento trova il
session_reference_tokenassociato 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. - Il server dell'applicazione di incorporamento chiama il server Looker con una richiesta di generazione di token. Questa richiesta richiede anche token API e di navigazione recenti, oltre allo user agent del browser che ha avviato la richiesta.
- Il server 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.
- I token vengono restituiti al server dell'applicazione di incorporamento chiamante.
- 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.
- Il client dell'applicazione di incorporamento invia i token appena generati alla UI di Looker. L'SDK Embed di Looker lo farà automaticamente. I client delle applicazioni di incorporamento che utilizzano l'API
windows.postMessagesaranno responsabili dell'invio dei token. Una volta che la UI di Looker riceve i token, questi verranno utilizzati nelle chiamate API e nelle navigazioni nelle pagine successive.
Implementazione dell'incorporamento senza cookie di Looker
L'incorporamento senza cookie di Looker può essere implementato utilizzando l'SDK Embed di Looker o l'API windows.postMessage. Puoi utilizzare il metodo SDK Embed di Looker, ma è disponibile anche un esempio che mostra come utilizzare l'API windows.postMessage. Spiegazioni dettagliate di entrambe le implementazioni sono disponibili nel file README dell'SDK Embed di Looker. Anche il repository Git dell'SDK Embed contiene implementazioni funzionanti.
Configurazione dell'istanza di Looker
L'incorporamento senza cookie condivide le caratteristiche con l'incorporamento firmato di Looker.
Prerequisiti
Per utilizzare l'incorporamento senza cookie ed esporre gli endpoint API di incorporamento senza cookie, un amministratore di Looker deve verificare e attivare i seguenti requisiti nel pannello Amministrazione di Looker:
- Autenticazione SSO incorporata: nel riquadro Amministrazione > Piattaforma > Incorpora, attiva Autenticazione SSO incorporata. L'incorporamento senza cookie si basa sulla funzione Autenticazione SSO per l'incorporamento sottostante come impostazione di base.
- Sessioni permanenti: nel riquadro Amministrazione > Autenticazione > Sessioni, attiva Sessioni permanenti.
- Autorizzazioni utente API: assicurati che le credenziali API utilizzate per acquisire il token appartengano a un utente Looker con il ruolo Amministratore o un ruolo personalizzato che contiene l'autorizzazione
manage_embed_settings.
Configurazione del secret del token web JSON
A differenza dell'incorporamento firmato di Looker, l'incorporamento senza cookie non utilizza l'impostazione Segreto di incorporamento. L'incorporamento senza cookie utilizza un token web JSON (JWT) sotto forma di impostazione Embed JWT Secret, che può essere impostata o reimpostata nella pagina Embed nella sezione Platform del menu Admin.
L'impostazione del secret JWT non è obbligatoria, poiché il JWT verrà creato al primo tentativo di creazione di una sessione di incorporamento senza cookie. Evita di reimpostare questo token, in quanto ciò invaliderà 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 del client dell'applicazione
Questa sezione include esempi di come implementare l'incorporamento senza cookie nel client dell'applicazione e contiene le seguenti sottosezioni:
- Installazione e aggiornamento dell'SDK Embed di Looker
- Utilizzo dell'SDK Embed di Looker
- Utilizzo dell'API Looker
windows.postMessage
Installazione o aggiornamento dell'SDK Looker Embed
Per utilizzare l'incorporamento senza cookie, sono necessarie le seguenti versioni dell'SDK di Looker:
@looker/embed-sdk >= 2.0.0
@looker/sdk >= 22.16.0
Utilizzo dell'SDK Embed di Looker
All'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 applicazioni sono trattati nella sezione Implementazione del server applicazioni di questo documento.
getEmbedSDK().initCookieless(
runtimeConfig.lookerHost,
'/acquire-embed-session',
'/generate-embed-tokens'
)
L'esempio seguente mostra come vengono utilizzati i callback. I callback devono essere utilizzati solo quando è necessario che l'applicazione client di incorporamento conosca lo stato della sessione di incorporamento di Looker. Puoi anche utilizzare l'evento session:status, rendendo inutile l'utilizzo di 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 ({ api_token, navigation_token }): Promise<LookerEmbedCookielessSessionData> => {
const resp = await fetch('/generate-embed-tokens', {
method: 'PUT',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({ api_token, navigation_token }),
})
if (!resp.ok) {
console.error('generate-embed-tokens failed', { resp })
throw new Error(
`generate-embed-tokens failed: ${resp.status} ${resp.statusText}`
)
}
return (await resp.json()) as LookerEmbedCookielessSessionData
}
getEmbedSDK().initCookieless(
runtimeConfig.lookerHost,
acquireEmbedSessionCallback,
generateEmbedTokensCallback
)
Utilizzo dell'API Looker windows.postMessage
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 di seguito.
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}`
}
L'esempio seguente mostra come ascoltare le richieste di token, generare nuovi token e inviarli a Looker. La funzione di callback è identica all'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 di applicazioni
Questa sezione include esempi di come implementare l'incorporamento senza cookie nel server applicazioni e contiene le seguenti sottosezioni:
Implementazione di base
L'applicazione di incorporamento deve implementare due endpoint lato server che richiameranno gli endpoint di Looker. In questo modo, il token di riferimento della sessione rimane sicuro. Questi sono gli endpoint:
- Acquisizione della sessione: se esiste già un token di riferimento della sessione ed è ancora attivo, le richieste di una sessione si uniranno alla sessione esistente. La sessione di acquisizione viene chiamata quando viene creato un iframe.
- 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 pannello Amministratore > Incorpora di Looker. Looker salva il dominio di incorporamento nel database interno di Looker, pertanto non verrà visualizzato nel riquadro Amministrazione > Incorporamento. Invece, il dominio di incorporamento è associato alla sessione senza cookie ed esiste solo per la durata della sessione. Se decidi di utilizzare questa funzionalità, consulta le best practice per la sicurezza.
Genera 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. Anche se la restituzione di una risposta 400 non dovrebbe verificarsi, se succede, è buona norma terminare la sessione di incorporamento di Looker. Puoi terminare la sessione di incorporamento di Looker eliminando 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 visualizza una finestra di dialogo di 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')) {
// The Looker UI does not know how to handle bad
// tokens. This shouldn't 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 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 in cluster
- In una tabella di database associata all'utente
Se la sessione viene memorizzata come cookie, quest'ultimo deve essere criptato. L'esempio nel repository dell'SDK di incorporamento utilizza un cookie di sessione per archiviare il token di riferimento della sessione.
Quando la sessione di incorporamento di Looker scade, viene visualizzata una finestra di dialogo nell'iframe incorporato. A questo punto, l'utente non potrà eseguire alcuna operazione nell'istanza incorporata. In questo caso, verranno generati gli eventi session:status, consentendo all'applicazione di incorporamento di rilevare lo stato attuale dell'applicazione Looker incorporata e di intraprendere un'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 è zero. Se il valore è zero, la sessione di incorporamento è scaduta. Valuta la possibilità di utilizzare una funzione di callback per generare i token durante l'inizializzazione dell'incorporamento senza cookie. La funzione di callback può quindi determinare se la sessione di incorporamento è scaduta e distruggerà l'iframe incorporato come alternativa all'utilizzo della finestra di dialogo predefinita per la sessione di incorporamento scaduta.
Best practice per l'incorporamento di più iframe con l'incorporamento senza cookie
Quando incorpori più iframe di Looker in una singola pagina nell'incorporamento senza cookie, ogni iframe richiede il proprio authentication_token monouso da acquire_embed_cookieless_session, ma tutti gli iframe della pagina devono condividere un singolo session_reference_token. Segui queste best practice per incorporare più iframe con l'incorporamento senza cookie:
Acquisisci la sessione una volta e riutilizza
session_reference_token: acquisisci prima la sessione senza cookie, memorizza nella cache ilsession_reference_tokenrestituito sul server di backend e passa ilsession_reference_tokenalle chiamateacquire_embed_cookieless_sessionsuccessive per iframe aggiuntivi. Looker associa quindi ogni nuovo iframe alla sessione esistente e salta l'aggiornamento dell'utente incorporato.Evita l'acquisizione parallela della sessione iniziale: se più iframe vengono montati contemporaneamente e il tuo backend chiama
acquire_embed_cookieless_sessionin parallelo senza passare unsession_reference_tokenesistente, Looker tratta ogni richiesta come un nuovo accesso, aggiorna l'utente incorporato contemporaneamente e crea sessioni separate. Le richieste di accesso simultanee per lo stesso utente incorporato possono causare conflitti di blocco sul server Looker. Inoltre, la sovrascrittura delsession_reference_tokenmemorizzato con l'ultima risposta interrompe l'aggiornamento del token (generate_tokens_for_cookieless_session) sugli iframe precedenti con un errore400 Invalid input tokens provided.Precarica un iframe e utilizza la navigazione in-frame: per stabilire la sessione utente di incorporamento prima di caricare i contenuti, precarica un iframe utilizzando
/embed/preload(o il metodo.preload()nell'SDK Embed v2). Quando utilizzi l'SDK Embed v2, puoi anche navigare all'interno di un iframe esistente utilizzando metodi comeconnection.loadDashboard(DASHBOARD_ID)oconnection.loadUrl(EMBED_URL)anziché creare iframe aggiuntivi. Per saperne di più, consulta Introduzione all'SDK Embed.
Esecuzione dell'esempio di incorporamento senza cookie di Looker
Il repository dell'SDK Embed contiene un server Node Express e un client scritto in TypeScript che implementa un'applicazione incorporata. Gli esempi mostrati in precedenza sono tratti da questa implementazione. Di seguito si presuppone che l'istanza di Looker sia stata configurata per utilizzare l'incorporamento senza cookie come descritto in precedenza.
Puoi eseguire il server nel seguente modo:
- Clona il repository dell'SDK Embed:
git clone git@github.com:looker-open-source/embed-sdk.git - Cambia la directory:
cd embed-sdk - Installa le dipendenze:
npm install - Configura il server, come mostrato nella sezione Configura il server di questo documento.
- Esegui il server:
npm run server
Configura il server
Crea un file .env nella directory principale del repository clonato (questo è incluso in .gitignore).
Il formato è il seguente:
LOOKER_WEB_URL=your-looker-instance-url.com
LOOKER_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
LOOKER_REPORT_ID=id-of-report
LOOKER_QUERY_VISUALIZATION_ID=id-of-query-visualization
Risoluzione degli errori 401 Unauthorized durante l'apertura dei link in una nuova scheda
Quando utilizzano l'incorporamento senza cookie di Looker, gli utenti che tentano di aprire link in una nuova scheda o finestra del browser (ad esempio drill-down della dashboard, esplorazioni o download di documenti) potrebbero visualizzare un errore HTTP 401 Unauthorized o essere reindirizzati alla pagina di accesso di Looker. Questo problema si verifica più di frequente quando i cookie di terze parti sono disattivati nel browser.
Causa
Per evitare vulnerabilità di session hijacking, è stata introdotta una patch di sicurezza in Looker (versioni 25.18.61+, 25.20.44+ e 26.0.22+) che ha interrotto intenzionalmente la restituzione dei cookie di sessione nella risposta iniziale di incorporamento senza cookie. Poiché il browser non riceve più questo cookie di sessione, l'apertura di un URL di Looker in una nuova scheda o finestra perde il contesto di autenticazione, causando l'errore della richiesta.
Risoluzione e soluzioni alternative
- Esegui l'upgrade di Looker: esegui l'upgrade dell'istanza di Looker alla versione 26.0.36 o successive. Questa release introduce una correzione che aggiunge in modo sicuro un token monouso agli URL aperti in una nuova finestra durante una sessione di incorporamento senza cookie, ripristinando la possibilità per l'utente di aprire link sicuri in nuove schede.
- Apri i link nello stesso iframe: se l'upgrade non è possibile immediatamente, configura tutti i link all'interno delle dashboard incorporate in modo che si aprano nello stesso iframe impostando i target dei link su
_self(ad esempio,target="_self"). - Instrada tramite l'applicazione in hosting: se l'apertura in una nuova scheda o finestra è strettamente necessaria, indirizza il link a una nuova pagina all'interno dell'applicazione in hosting che inizializza un nuovo iframe di incorporamento senza cookie anziché collegarsi direttamente all'istanza di Looker.
- Utilizza l'incorporamento firmato con un dominio personalizzato: in alternativa, valuta la possibilità di utilizzare l'incorporamento firmato standard con un dominio personalizzato.