O Looker usa o OAuth para permitir que os aplicativos cliente OAuth se autentiquem na API do Looker sem expor IDs e chaves secretas do cliente ao navegador que está executando o aplicativo cliente OAuth.
Os aplicativos da Web que usam o OAuth precisam atender aos seguintes requisitos:
- A autenticação por OAuth está disponível apenas com a API Looker 4.0.
- Os aplicativos cliente OAuth precisam primeiro ser registrados no Looker usando a API antes que os usuários do aplicativo possam fazer a autenticação no Looker.
- Os aplicativos clientes precisam usar HTTPS em todas as solicitações feitas à API Looker. Os aplicativos clientes que querem usar as APIs
SubtleCrypto
fornecidas pelo navegador precisam ser hospedados no HTTPS.
Suporte ao CORS da API Looker
A API Looker pode ser chamada no navegador e entre origens usando o protocolo de Compartilhamento de recursos entre origens (CORS, na sigla em inglês). O suporte ao CORS do Looker tem os seguintes requisitos:
- Somente as origens listadas na lista de permissões de domínios incorporados podem chamar a API usando CORS.
Somente tokens de acesso recebidos do OAuth ou da chamada do endpoint de API
/login
podem ser usados para fazer chamadas à API Looker usando o CORS.O endpoint da API
/login
não pode ser chamado usando solicitações CORS. Os aplicativos clientes que quiserem chamar a API Looker usando solicitações de CORS precisam usar o processo de login OAuth descrito em Fazer login de usuários com o OAuth ou recuperar um token do servidor do aplicativo ou de chamadas de API que não sejam do CORS.
Visão geral da autenticação OAuth
Uma visão geral do processo de autenticação OAuth é a seguinte:
- Registre o aplicativo cliente OAuth com a API Looker.
- Adicione a origem do seu aplicativo cliente OAuth à lista de permissões de domínio incorporado para a chamada da API Code Exchange e todas as chamadas subsequentes da API CORS.
- Redirecione o URL do navegador para o endpoint
/auth
no nome do host da interface do Looker (não para o nome do host da API Looker) quando o aplicativo cliente OAuth tentar autenticar um usuário. Por exemplo,https://instance_name.looker.com
. - Se o usuário for autenticado e fizer login no Looker, o Looker vai retornar um redirecionamento OAuth para o aplicativo cliente OAuth imediatamente. Se o usuário ainda não tiver feito login no Looker no dispositivo e no navegador, a tela de login do Looker vai aparecer e o usuário vai precisar fazer login na conta de usuário do Looker usando o protocolo de autenticação normal.
- Usando o código de autorização retornado no redirecionamento OAuth, o aplicativo cliente OAuth precisa fazer uma chamada para o endpoint
/token
no nome de host da API Looker, por exemplo,https://instance_name.looker.com:19999
. O nome de host da API pode ser igual ou diferente do nome de host da interface do Looker. O endpoint/token
existe apenas no host da API do Looker, e o endpoint/auth
existe apenas no host da interface do Looker. - Se o código de autorização transmitido para o endpoint
/token
for válido, o Looker vai retornar umaaccess_token
da API que está ativada para solicitações de API CORS do domínio do aplicativo cliente OAuth.
Como registrar um aplicativo cliente OAuth
Todos os aplicativos clientes OAuth que tentam fazer a autenticação na API do Looker usando o OAuth precisam ser registrados na instância do Looker antes que o Looker autorize o acesso. Para registrar um aplicativo cliente OAuth:
- Abra o API Explorer na sua instância do Looker.
- Usando o menu suspenso da versão, escolha a versão 4.0 - stable da API.
No método Auth, encontre o endpoint de API
register_oauth_client_app()
. Você também pode pesquisar "oauth app" no campo Pesquisa. Useregister_oauth_client_app()
para registrar seu aplicativo cliente OAuth no Looker. Clique no botão Executar, insira os parâmetros no APIs Explorer e clique em Executar novamente para registrar o aplicativo cliente OAuth ou use o endpoint de APIregister_oauth_client_app()
de maneira programática. Os parâmetrosregister_oauth_client_app()
obrigatórios são:client_guid
: um ID globalmente exclusivo para o aplicativo.redirect_uri
: o URI em que o aplicativo receberá um redirecionamento de OAuth que inclui um código de autorização.display_name
: o nome do aplicativo que aparece para os usuáriosdescription
: uma descrição do aplicativo que é exibida para os usuários em uma página de divulgação e confirmação quando eles fazem login pela primeira vez.
Os valores nos parâmetros
client_guid
eredirect_uri
precisam corresponder exatamente aos valores que o aplicativo cliente OAuth vai fornecer. Caso contrário, a autenticação será negada.
Fazer login do usuário com o OAuth
Navegue o usuário para o endpoint
/auth
no host da interface. Exemplo:async function oauth_login() { const code_verifier = secure_random(32) const code_challenge = await sha256_hash(code_verifier) const params = { response_type: 'code', client_id: '123456', redirect_uri: 'https://mywebapp.com:3000/authenticated', scope: 'cors_api', state: '1235813', code_challenge_method: 'S256', code_challenge: code_challenge, } const url = `${base_url}?${new URLSearchParams(params).toString()}` // Replace base_url with your full Looker instance's UI host URL, plus the `/auth` endpoint. log(url) // Stash the code verifier we created in sessionStorage, which // will survive page loads caused by login redirects // The code verifier value is needed after the login redirect // to redeem the auth_code received for an access_token // sessionStorage.setItem('code_verifier', code_verifier) document.location = url } function array_to_hex(array) { return Array.from(array).map(b => b.toString(16).padStart(2,'0')).join('') } function secure_random(byte_count) { const array = new Uint8Array(byte_count); crypto.getRandomValues(array); return array_to_hex(array) } async function sha256_hash(message) { const msgUint8 = new TextEncoder().encode(message) const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8) return base64.urlEncode(hashBuffer)) // Refers to the implementation of base64.encode stored at https://gist.github.com/jhurliman/1250118 }
O Looker vai tentar autenticar o usuário usando o sistema de autenticação com que a instância do Looker está configurada.
- Se o usuário já tiver feito login no Looker no navegador atual (ou seja, se houver um estado de cookie de login ativo), ele não vai precisar inserir as credenciais de login.
- Se esta for a primeira vez que o usuário fizer login usando esse aplicativo cliente OAuth, o Looker mostrará uma página de divulgação e confirmação para o usuário confirmar e aceitar. O texto do parâmetro
description
usado quando o aplicativo foi registrado será exibido. A descrição precisa indicar o que o app pretende fazer com a conta do usuário no Looker. Quando o usuário clicar em aceitar, a página será redirecionada para o aplicativoredirect_uri
. - Se o usuário já tiver feito login no Looker no navegador atual e confirmado a página de divulgação, o login do OAuth será instantâneo, sem interrupção visual.
A API Looker vai retornar um redirecionamento OAuth para o aplicativo cliente OAuth. Salve o código de autorização listado no parâmetro URI. Veja a seguir um exemplo de URI de redirecionamento de OAuth:
https://mywebapp.com:3000/authenticated?&code=asdfasdfassdf&state=...
O código de autorização é mostrado após
&code=
no URI. Neste exemplo, o código de autorização éasdfasdfassdf
.Faça uma solicitação da Web para o endpoint
/token
na API Looker, transmitindo o código de autorização e as informações do seu aplicativo. Exemplo:async function redeem_auth_code(response_str) { const params = new URLSearchParams(response_str) const auth_code = params.get('code') if (!auth_code) { log('ERROR: No authorization code in response') return } log(`auth code received: ${auth_code}`) log(`state: ${params.get('state')}`) const code_verifier = sessionStorage.getItem('code_verifier') if (!code_verifier) { log('ERROR: Missing code_verifier in session storage') return } sessionStorage.removeItem('code_verifier') const response = await fetch('https://mycompany.looker.com:19999/api/token', { // This is the URL of your Looker instance's API web service method: 'POST', mode: 'cors', // This line is required so that the browser will attempt a CORS request. body: stringify({ grant_type: 'authorization_code', client_id: '123456', redirect_uri: 'https://mywebapp.com:3000/authenticated', code: auth_code, code_verifier: code_verifier, }), headers: { 'x-looker-appid': 'Web App Auth & CORS API Demo', // This header is optional. 'Content-Type': 'application/json;charset=UTF-8' // This header is required. }, }).catch((error) => { log(`Error: ${error.message}`) }) const info = await response.json() log(`/api/token response: ${stringify(info)}`) // Store the access_token and other info, // which in this example is done in sessionStorage const expires_at = new Date(Date.now() + (info.expires_in * 1000)) info.expires_at = expires_at log(`Access token expires at ${expires_at.toLocaleTimeString()} local time.`) sessionStorage.setItem('access_info', stringify(info)) access_info = info }
Uma resposta bem-sucedida vai fornecer ao aplicativo cliente OAuth uma
access_token
da API. A resposta também vai conter umrefresh_token
, que você pode usar mais tarde para receber um novoaccess_token
sem a interação do usuário. Umrefresh_token
tem um ciclo de vida de um mês. Armazene orefresh_token
com segurança.Todos os tokens nesse sistema podem ser revogados pelo administrador do Looker a qualquer momento.