Adicionar autenticação ao seu aplicativo Supabase
Noções básicas do Supabase
Supabase utiliza Segurança em Nível de Linha do Postgres para controlar permissões de acesso a dados. Em termos simples, ao criar políticas de Segurança em Nível de Linha para tabelas no banco de dados, podemos restringir e gerenciar quem pode ler, escrever e atualizar dados em uma tabela.
Vamos supor que você tenha uma tabela chamada "posts" no seu banco de dados, com o seguinte conteúdo:
O campo user_id
na tabela representa o usuário a quem cada dado de post pertence. Você pode restringir cada usuário a acessar apenas seus próprios dados de post com base no campo user_id
.
No entanto, antes que isso possa ser implementado, o Supabase precisa ser capaz de identificar o usuário atual acessando o banco de dados.
Adicionar dados do usuário às solicitações do Supabase
Graças ao suporte do Supabase para JWT, quando nosso aplicativo interage com o Supabase, podemos gerar um JWT contendo dados do usuário usando o segredo JWT fornecido pelo Supabase. Em seguida, usamos esse JWT como o cabeçalho de Autenticação ao fazer solicitações. Ao receber a solicitação, o Supabase verifica automaticamente a validade do JWT e permite o acesso aos dados contidos nele durante os processos subsequentes.
Primeiramente, podemos obter o segredo JWT fornecido pelo Supabase nas "Configurações do Projeto" no painel do Supabase:
Então, quando usamos o SDK do Supabase para fazer solicitações ao Supabase, utilizamos esse segredo para gerar nosso JWT e anexá-lo como o cabeçalho de Autenticação à solicitação. (Observe que esse processo ocorre dentro do serviço de backend do seu aplicativo, e o segredo JWT nunca deve ser exposto a terceiros).
import { createClient } from '@supabase/supabase-js';
import { sign } from 'jsonwebtoken';
/*
* Nota:
* Você pode encontrar o SUPABASE_URL, SUPABASE_ANON_KEY no mesmo lugar onde encontra o JWT Secret.
*/
const SUPABASE_URL = process.env.SUPABASE_URL;
const SUPABASE_ANON_KEY = process.env.SUPABASE_ANON_KEY;
const SUPABASE_JWT_SECRET = process.env.SUPABASE_JWT_SECRET;
export const getSupabaseClient = (userId) => {
const jwtPayload = {
userId,
};
const jwt = sign(jwtPayload, SUPABASE_JWT_SECRET, {
expiresIn: '1h', // Apenas para demonstração
});
const client = createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {
global: {
headers: {
Authorization: `Bearer ${jwt}`,
},
},
});
return client;
};
Em seguida, navegue até o Editor SQL no painel do Supabase e crie uma função para recuperar o userId carregado na solicitação:
O código usado na imagem é o seguinte:
create or replace function auth.user_id() returns text as $$
select nullif(current_setting('request.jwt.claims', true)::json->>'userId', '')::text;
$$ language sql stable;
Como mostra o código, no Supabase, você pode recuperar o payload do JWT que geramos chamando request.jwt.claims
. O campo userId
dentro do payload é o valor que definimos.
Com essa função, o Supabase pode determinar o usuário que está atualmente acessando o banco de dados.
Criar política de Segurança em Nível de Linha
Em seguida, podemos criar uma política de Segurança em Nível de Linha para restringir cada usuário a acessar apenas seus próprios dados de post com base no campo user_id
na tabela de posts.
- Navegue até a página do Editor de Tabelas no painel do Supabase e selecione a tabela de posts.
- Clique em "Add RLS Policy" no topo da tabela.
- Na janela solicitada, clique em "Create policy".
- Insira um Nome de Política e escolha o comando de Política SELECT.
- No bloco
using
do código abaixo, insira:
auth.user_id() = user_id
Ao aproveitar essas políticas, o controle de acesso a dados dentro do Supabase é alcançado.
Em aplicativos do mundo real, você criaria várias políticas para restringir ações do usuário, como inserção e modificação de dados. No entanto, isso está além do escopo deste artigo. Para mais informações sobre Segurança em Nível de Linha (RLS), consulte Proteja seus dados usando Segurança em Nível de Linha do Postgres.
Processo básico de integração com Logto
Como mencionado anteriormente, porque o Supabase utiliza RLS para seu controle de acesso, a chave para integrar com Logto (ou qualquer outro serviço de autenticação) está em obter o id do usuário autorizado e enviá-lo para o Supabase. Todo o processo é ilustrado no diagrama abaixo:
Em seguida, explicaremos como integrar Logto com Supabase com base neste diagrama de processo.
Integração com Logto
Logto oferece guias de integração para várias frameworks e linguagens de programação.
Geralmente, aplicativos construídos com essas frameworks e linguagens se enquadram em categorias como aplicativos Nativos, SPA (aplicativos de página única), aplicativos web tradicionais e aplicativos M2M (máquina para máquina). Você pode visitar a página de inícios rápidos do Logto para integrar Logto ao seu aplicativo com base na pilha de tecnologia que você está usando. Depois, siga as instruções abaixo para integrar Logto ao seu projeto com base no tipo do seu aplicativo.