Aprenda a incorporar dashboards do Oracle Analytics Cloud em um site público sem expor senhas, tokens ou client secrets. Neste guia, vou apresentar uma integração segura com OCI Vault, Oracle Functions e API Gateway. Porém, com o intuito de exibir um dashboard do Oracle Analytics Cloud (OAC) dentro de um portal sem pedir login ao visitante e de forma segurança, a página não pode conter senha, client secret nem token fixo. Esses dados ficam na Oracle Cloud Infrastructure (OCI), e o navegador recebe somente um access token temporário.

Com esse objetivo, nossa página pública deve solicitar um token ao API Gateway. O Gateway chama uma Oracle Function, que recupera os segredos no OCI Vault e pede o token ao Identity Domain. O token representa um usuário técnico com acesso mínimo ao workbook no OAC.

Arquitetura recomendada

A solução separa a exibição do dashboard da emissão de credenciais temporárias.

  • O visitante acessa uma página web com o dashboard incorporado.
  • A página solicita um token temporário a um endpoint controlado.
  • O API Gateway encaminha a solicitação para uma Oracle Function.
  • A Function obtém segredos protegidos no OCI Vault.
  • A Function solicita um access token ao Identity Domain.
  • O navegador recebe somente o token temporário necessário para carregar o conteúdo.
  • O OAC aplica as permissões associadas ao usuário técnico configurado.

Antes de começar

  • Tenha acesso ao OAC, ao Identity Domain e ao compartment OCI em que os recursos serão criados.
  • Tenha um workbook publicado no OAC e defina quais dados poderão ser exibidos.
  • Use um ambiente de homologação para o primeiro teste, sempre que possível.
  • Crie um usuário técnico exclusivo, com permissão somente de leitura.

Os nomes a seguir são exemplos. Substitua todos os valores entre <...> pelos dados do seu ambiente.

<COMPARTMENT>       Exemplo: ambiente-analytics
<USUARIO_TECNICO>    Exemplo: usuario.dashboard@exemplo.com
<HOST_OAC>           Exemplo: analytics.exemplo.oraclecloud.com
<HOST_GATEWAY>       Host mostrado pelo API Gateway
<PROJECT_PATH>       Caminho copiado da opção Embed do workbook

1. Criar e preparar o usuário técnico

No Console OCI, acesse Identity & Security → Domains → Users. Crie ou selecione um usuário técnico, preencha e-mail, nome e sobrenome e confirme que a conta está ativa.

Depois, entre no OAC com esse usuário e conceda acesso de visualização somente à pasta e ao workbook que serão incorporados. Faça um teste: ele deve abrir o workbook diretamente no OAC. O token não cria permissões novas; ele usa exatamente os acessos desse usuário.

2. Criar a aplicação OAuth

No Console OCI, acesse Identity & Security → Domains → <SEU_DOMAIN> → Integrated applications. Crie uma Confidential Application, por exemplo app-dashboard-token.

  1. Ative a aplicação após criá-la.
  2. Na aba OAuth configuration, habilite OAuth.
  3. Habilite o fluxo de autenticação aprovado para o seu ambiente, como Resource Owner quando aplicável.
  4. Selecione o recurso do Analytics e copie o scope apresentado.
  5. Registre a URL do token, o Client ID e o Client Secret.

A Function precisará destes valores não secretos:

IDCS_TOKEN_URL=https://<SEU_DOMAIN>.identity.oraclecloud.com/oauth2/v1/token
OAC_CLIENT_ID=<CLIENT_ID_DA_APLICACAO>
OAC_SCOPE=<SCOPE_DO_RECURSO_ANALYTICS>
OAC_USERNAME=<USUARIO_TECNICO>

O client secret e a senha do usuário técnico também serão necessários, mas ficarão no Vault, nunca no HTML ou no repositório.

3. Autorizar o domínio do portal no OAC

No OAC, acesse Navigator → Console → Safe Domains. Adicione a origem do site que exibirá o dashboard e marque Embedding.

Informe a origem exata, com protocolo e porta. Para teste local: http://127.0.0.1:5500. Para produção: https://portal.exemplo.com. Não inclua index.html nem outro caminho na origem cadastrada.

4. Copiar as informações do workbook

Abra o workbook no OAC em modo de edição e localize a opção Embed. Copie o project-path, o active-page e o active-tab-id. Esses valores identificam o conteúdo que será carregado.

<oracle-dv
  project-path="<PROJECT_PATH>"
  active-page="<ACTIVE_PAGE>"
  active-tab-id="<ACTIVE_TAB_ID>">
</oracle-dv>

5. Guardar os segredos no OCI Vault

No Console OCI, acesse Identity & Security → Vault. Crie ou reutilize um Vault e uma chave mestra. Em Secrets, crie dois secrets separados:

  • secret-dashboard-client-secret: contém o client secret OAuth.
  • secret-dashboard-user-password: contém a senha do usuário técnico.

Após criá-los, copie apenas os OCIDs dos secrets. O OCID é uma referência que pode ser usada na configuração da Function; o conteúdo secreto não deve aparecer em arquivos, variáveis abertas ou logs.

6. Criar a Oracle Function de token

Em Developer Services → Functions, crie uma Application e uma Function, por exemplo fn-dashboard-token. A Function deve recuperar os dois secrets no Vault usando Resource Principal, chamar a URL OAuth e responder um JSON com access_token, token_type e expires_in.

Na aba Configuration da Function, informe apenas valores não secretos e OCIDs:

IDCS_TOKEN_URL=https://<SEU_DOMAIN>.identity.oraclecloud.com/oauth2/v1/token
OAC_CLIENT_ID=<CLIENT_ID_DA_APLICACAO>
OAC_SCOPE=<SCOPE_DO_RECURSO_ANALYTICS>
OAC_USERNAME=<USUARIO_TECNICO>
OAC_CLIENT_SECRET_SECRET_OCID=<OCID_DO_SECRET_CLIENT_SECRET>
OAC_USER_PASSWORD_SECRET_OCID=<OCID_DO_SECRET_SENHA>

Não use variáveis como OAC_CLIENT_SECRET ou OAC_USER_PASSWORD com valores reais. A leitura deve acontecer apenas em memória, durante a execução da Function.

7. Permitir que a Function leia somente os secrets necessários

Crie um Dynamic Group em Identity & Security → Domains → <SEU_DOMAIN> → Dynamic Groups, restrito à Function criada. Depois, em Identity & Security → Policies, crie uma policy que permita a leitura apenas dos dois secrets usados pela Function.

Exemplo conceitual; substitua os marcadores:

Allow dynamic-group <DYNAMIC_GROUP_DA_FUNCTION>
to read secret-bundles in compartment <COMPARTMENT>
where target.secret.id = '<OCID_DO_SECRET_CLIENT_SECRET>'

Allow dynamic-group <DYNAMIC_GROUP_DA_FUNCTION>
to read secret-bundles in compartment <COMPARTMENT>
where target.secret.id = '<OCID_DO_SECRET_SENHA>'

Dynamic Groups e policies podem levar alguns minutos para propagar. Se a Function falhar ao ler o Vault logo após a mudança, aguarde antes de alterar o código.

8. Publicar a Function no API Gateway

Em Identity & Security → Policies, crie antes uma policy que permita ao API Gateway invocar Functions:

ALLOW any-user to use functions-family in compartment <COMPARTMENT>
where ALL {
  request.principal.type = 'ApiGateway',
  request.resource.compartment.id = '<OCID_DO_COMPARTMENT>'
}

Depois, acesse Developer Services → API Gateway → Gateways e crie um Gateway público. Quando ele estiver ativo, abra Deployments e crie uma rota com estes valores:

  • Path prefix: /dashboard-publico
  • Route path: /token
  • Method: GET
  • Backend type: Oracle Functions
  • Backend: a Application e a Function criadas na etapa anterior

A URL final ficará semelhante a https://<HOST_GATEWAY>/dashboard-publico/token. No CORS, autorize somente a origem do portal, por exemplo https://portal.exemplo.com, permita GET e configure rate limiting.

9. Inserir o código na página que exibirá o dashboard

Este exemplo carrega o framework do OAC, obtém um token do Gateway e o entrega ao componente. Substitua todos os marcadores antes de publicar.

<script
  src="https://<HOST_OAC>/public/dv/v1/embedding/standalone/embedding.js?TOKEN=true"
  type="application/javascript">
</script>

<oracle-dv
  project-path="<PROJECT_PATH>"
  active-page="<ACTIVE_PAGE>"
  active-tab-id="<ACTIVE_TAB_ID>">
</oracle-dv>

<script>
  const gatewayTokenUrl =
    'https://<HOST_GATEWAY>/dashboard-publico/token';

  async function getOacToken() {
    const response = await fetch(gatewayTokenUrl, {
      method: 'GET',
      cache: 'no-store'
    });

    if (!response.ok) {
      throw new Error(`Falha ao obter token: ${response.status}`);
    }

    const data = await response.json();
    if (!data.access_token) {
      throw new Error('A resposta não contém access_token.');
    }
    return data.access_token;
  }

  async function initializeOac() {
    const token = await getOacToken();

    requirejs([
      'jquery', 'knockout', 'obitech-application/application',
      'ojs/ojcore', 'ojs/ojknockout', 'ojs/ojcomposite',
      'jet-composites/oracle-dv/loader'
    ], function ($, ko, application) {
      application.setSecurityConfig('token', {
        tokenAuthFunction: function () {
          return token;
        }
      });
      ko.applyBindings();
    });
  }

  initializeOac().catch(console.error);
</script>

tokenAuthFunction deve retornar uma string, não uma Promise. Por isso, o exemplo busca o token antes de configurar o componente.

10. Validar antes de publicar

  • Abra a página por HTTP ou HTTPS; não use file://.
  • Confirme que o workbook aparece sem tela de login.
  • Verifique se o domínio está cadastrado tanto em Safe Domains quanto no CORS.
  • Teste filtros e visualizações com as permissões do usuário técnico.
  • Confirme que HTML, repositório e logs não contêm senha, client secret ou token real.
  • Se houver erro 401, 403 ou 5xx, valide Function, policy do Gateway, usuário técnico e OAuth nessa ordem.

Referências