Português (Portugal)
  • oidc
  • supabase
  • auth
  • rls
  • jwt

Integrar com o Supabase

Aprende a integrar o Logto com o Supabase para melhorar a experiência de autenticação das tuas aplicações.

Yijun
Yijun
Developer

Logto é um fornecedor moderno de serviços de autenticação de identidade que oferece um suporte seguro, abrangente e fácil de usar para login em aplicações. Também disponibiliza várias SDKs e guias de integração para diversos frameworks e linguagens de programação, permitindo que integres serviços de autenticação de identidade de nível empresarial na tua aplicação em poucos minutos.

Este artigo centra-se principalmente em detalhar como integrar o Supabase com o Logto.

Noções básicas sobre Supabase

O Supabase utiliza a Segurança ao Nível da Linha do Postgres para controlar as permissões de acesso aos dados. Em termos simples, ao criar políticas de Segurança ao Nível da Linha para tabelas na base de dados, podemos restringir e gerir quem pode ler, escrever e atualizar dados numa tabela.

Vamos assumir que tens uma tabela chamada "posts" na tua base de dados, com o seguinte conteúdo:

Tabela de posts

O campo user_id na tabela representa o utilizador ao qual os dados de cada post pertencem. Podes restringir que cada utilizador apenas aceda aos seus próprios dados de posts com base no campo user_id.

No entanto, antes que isso possa ser implementado, o Supabase precisa de ser capaz de identificar o utilizador atual que está a aceder à base de dados.

Adicionar dados do utilizador às requisições do Supabase

Graças ao suporte do Supabase para JWT, quando a nossa aplicação interage com o Supabase, podemos gerar um JWT contendo dados do utilizador usando o segredo JWT fornecido pelo Supabase. Em seguida, utilizamos este JWT como o cabeçalho de Autenticação ao fazer requisições. Ao receber a requisição, o Supabase verifica automaticamente a validade do JWT e permite o acesso aos dados contidos nele nos processos subsequentes.

Primeiramente, podemos obter o segredo JWT fornecido pelo Supabase nas “Definições do Projeto” no dashboard do Supabase:

Página de definições da API do Supabase

Depois, ao usar o SDK do Supabase para fazer requisições ao Supabase, utilizamos este segredo para gerar o nosso JWT e anexá-lo como o cabeçalho de Autenticação à requisição. (Lembra-te de que este processo ocorre dentro do serviço backend da tua aplicação e o segredo JWT nunca deve ser exposto a terceiros).

Em seguida, navega até ao Editor de SQL no dashboard do Supabase e cria uma função para recuperar o userId transportado na requisição:

Criar função para obter user ID

O código utilizado na imagem é o seguinte:

Como mostra o código, no Supabase, podes recuperar a payload do JWT que geramos chamando request.jwt.claims. O campo userId dentro da payload é o valor que definimos.

Com esta função, o Supabase pode determinar o utilizador que está a aceder à base de dados no momento.

Criar uma política de Segurança ao Nível da Linha

Em seguida, podemos criar uma política de Segurança ao Nível da Linha para restringir que cada utilizador apenas aceda aos seus próprios dados de posts com base no campo user_id na tabela de posts.

  1. Navega até à página do Editor de Tabelas no dashboard do Supabase e seleciona a tabela de posts.
  2. Clica em "Adicionar Política RLS" na parte superior da tabela.
  3. Na janela que aparece, clica em "Criar política".
  4. Introduz um Nome de Política e escolhe o comando de Política SELECT.
  5. No bloco using do código abaixo, insere:
Criar política RLS

Através da utilização de tais políticas, o controlo de acesso aos dados dentro do Supabase é alcançado.

Em aplicações do mundo real, criarias várias políticas para restringir ações do utilizador, como inserção e modificação de dados. No entanto, isso está fora do escopo deste artigo. Para mais informações sobre Segurança ao Nível da Linha (RLS), consulta Protege os teus dados utilizando a Segurança de Nível de Linha do Postgres.

Processo básico de integração com o Logto

Como mencionado anteriormente, porque o Supabase utiliza RLS para o seu controlo de acesso, o essencial para integrar com o Logto (ou qualquer outro serviço de autenticação) está em obter o id do utilizador autorizado e enviá-lo para o Supabase. Todo o processo é ilustrado no diagrama abaixo:

Em seguida, vamos explicar como integrar o Logto com o Supabase com base neste diagrama de processo.

Integração com o Logto

O Logto oferece guias de integração para vários frameworks e linguagens de programação.

Geralmente, as aplicações construídas com esses frameworks e linguagens dividem-se em categorias como aplicações Nativas, SPA (aplicações de página única), aplicações web tradicionais e aplicações M2M (máquina-a-máquina). Podes visitar a página Inícios rápidos do Logto para integrar o Logto na tua aplicação com base na stack tecnológica que estás a usar. Depois, segue as instruções abaixo para integrar o Logto no teu projeto com base no tipo da tua aplicação.

Aplicação Nativa ou SPA

Tanto aplicações nativas como SPAs são executadas no teu dispositivo, e as credenciais (token de acesso) obtidas após o login são armazenadas localmente no teu dispositivo.

Portanto, ao integrar a tua aplicação com o Supabase, precisas de interagir com o Supabase através do teu serviço backend porque não podes expor informações sensíveis (como o segredo JWT do Supabase) no dispositivo de cada utilizador.

Vamos assumir que estás a construir a tua SPA usando React e Express. Integra-te com sucesso o Logto na tua aplicação seguindo o Guia do SDK do Logto para React (podes consultar o código no nosso exemplo de react). Adicionalmente, adicionaste a validação do token de acesso do Logto no teu servidor backend de acordo com a documentação Protege a tua API no Node (Express).

Em seguida, vais usar o token de acesso obtido do Logto para pedir dados do utilizador ao teu servidor backend:

No teu servidor backend, já extraíste o id do utilizador logado do token de acesso usando middleware:

Agora, podes usar o getSupabaseClient descrito acima para anexar o userId ao JWT usado nas requisições subsequentes ao Supabase. Alternativamente, podes criar um middleware para criar um cliente Supabase para as requisições que precisam de interagir com o Supabase:

No fluxo de processamento subsequente, podes chamar diretamente ctx.supabase para interagir com o Supabase:

Neste código, o Supabase retornará apenas os dados dos posts pertencentes ao utilizador atual com base nas políticas definidas anteriormente.

Aplicação web tradicional

A principal diferença entre uma aplicação web tradicional e uma aplicação Nativa ou SPA é que uma aplicação web tradicional renderiza e atualiza as páginas exclusivamente no servidor web. Portanto, as credenciais do utilizador são geridas diretamente pelo servidor web, enquanto nas aplicações Nativas e SPAs, elas residem no dispositivo do utilizador.

Ao integrar o Logto com uma aplicação web tradicional no Supabase, podes recuperar diretamente o id do utilizador logado a partir do backend.

Tomando como exemplo um projeto Next.js, após integrares o Logto no teu projeto seguindo o Guia do SDK para Next.js, podes usar o SDK do Logto para recuperar informações do utilizador e construir o JWT correspondente para interagir com o Supabase.

Aplicação máquina-a-máquina

Máquina-a-máquina (M2M) é frequentemente usada quando a tua aplicação precisa de comunicar diretamente com servidores de recursos, como um serviço estático que busca diariamente posts, etc.

Podes usar o guia Máquina-a-máquina: Autenticação com Logto para autenticação de aplicação máquina-a-máquina. A integração entre o Supabase e as aplicações Máquina-a-máquina é semelhante à das aplicações Nativas e SPAs (como descrito na seção "Aplicação Nativa ou single-page app"). Envolve obter um token de acesso do Logto e, em seguida, validá-lo através de uma API protected no backend.

No entanto, é importante notar que aplicações Nativas e SPAs são tipicamente projetadas para utilizadores finais, pelo que o id do utilizador obtido representa o próprio utilizador. No entanto, o token de acesso das aplicações máquina-a-máquina representa a aplicação em si, e o campo sub na payload do token de acesso é o id do cliente da aplicação M2M, não um utilizador específico. Portanto, durante o desenvolvimento, é crucial distinguir quais dados são destinados a aplicações M2M.

Ademais, se quiseres que uma aplicação M2M específica aceda ao Supabase em nome de todo o serviço para contornar as restrições do RLS, podes utilizar o segredo service_role do Supabase para criar um cliente Supabase. É útil quando queres realizar algumas tarefas administrativas ou automatizadas que requerem acesso a todos os dados sem serem restringidas pelas políticas de Segurança ao Nível da Linha configuradas para utilizadores individuais.

O segredo service_role pode ser encontrado na mesma página que o segredo JWT:

Segredo service role

Ao criar um cliente Supabase, usa o segredo service_role e então este cliente pode aceder a todos os dados na base de dados:

Resumo

Neste artigo, aprofundamo-nos na integração do Logto com o Supabase, esclarecendo insights chave e aspetos críticos de integração. Exploramos conceitos como a autenticação JWT e políticas de Segurança ao Nível da Linha, orientando-te através do processo de incorporar perfeitamente o Logto nas tuas aplicações potenciadas pelo Supabase. Com este conhecimento, esperamos que possas melhorar confiantemente a segurança e a funcionalidade da tua aplicação, e até mesmo ampliar os teus projetos com funcionalidades adicionais.