Protege a tua API Express.js com JWT e Logto
Aprende a proteger os endpoints da tua API Express.js com JSON Web Tokens (JWT) e Logto.
Introdução
Quando estás a desenvolver uma aplicação web, é crucial proteger os endpoints da tua API de acessos não autorizados. Imagina que estás a construir um website de compras online; definitivamente não queres que ladrões cibernéticos explorem a tua API.
Assumindo que já construíste uma aplicação Express.js com autenticação de utilizador, onde os utilizadores devem iniciar sessão antes de realizar certas ações. Caso contrário, podes começar a tua jornada com Logto. Requer apenas algumas linhas de código para estabelecer um fluxo de autenticação de utilizador.
No entanto, mesmo após a autenticação do utilizador, enfrentas várias opções para proteger os teus endpoints da API. Infelizmente, a maioria destas opções tem desvantagens:
- Autenticação baseada em sessão: Vinculando a tua API a uma loja de sessões, o que não é escalável e não se adapta bem a microsserviços.
- Chamar um serviço de autenticação: Isto introduz uma chamada de rede extra, aumentando a latência e os custos. Alguns serviços de autenticação até cobram com base no volume de chamadas à API, potencialmente levando a despesas elevadas.
Neste tutorial, demonstraremos como fortalecer os teus endpoints da API usando JSON Web Tokens (JWT) e Logto. Esta abordagem oferece escalabilidade e custos extras mínimos.
Pré-requisitos
Antes de entrares no assunto, garante que tens o seguinte:
- Uma conta Logto. Se não tens uma, podes inscrever-te gratuitamente.
- Um projeto Express.js que precisa de proteção da API e uma aplicação cliente que consome a API.
- Familiaridade básica com JSON Web Token (JWT).
Define o teu recurso de API no Logto
O Logto tira pleno proveito do RFC 8707: Resource Indicators for OAuth 2.0 para assegurar os teus endpoints da API. Isto significa que podes definir os teus recursos de API usando os seus URLs reais.
Navega para o separador "Recursos da API" no Console do Logto e clica em "Criar recurso da API" para criar um novo. Por exemplo, se desejas proteger o endpoint /api/products
, podes usar o URL https://oseudominio.com/api/products
como o identificador.
Obtém um token de acesso na tua aplicação cliente
Para prosseguir, precisas de integrar o SDK do Logto na tua aplicação cliente. Esta aplicação pode diferir do teu backend Express.js; por exemplo, podes ter uma app React usando Express.js como o servidor de API backend.
Também precisarás de ajustar a configuração do SDK do Logto para informar o Logto que queres solicitar um token de acesso para a tua API neste grant. Aqui está um exemplo usando React:
Uma vez que um utilizador inicie sessão com o Logto, isAuthenticated
dentro do SDK do Logto tornar-se-á true
:
Agora, podes usar o método getAccessToken
para recuperar um token de acesso para a tua API:
Por último, inclui este token de acesso no cabeçalho Authorization
ao fazer pedidos à tua API:
Verifica o token de acesso na tua API
Na tua aplicação Express.js, instala a biblioteca jose
para verificação de JWT:
Como estamos a usar autenticação Bearer, extrai o token de acesso do cabeçalho Authorization
:
Subsequentemente, cria um middleware para verificar o token de acesso:
Agora podes empregar este middleware para proteger os teus endpoints da API:
Com esta abordagem, não precisas de contactar o servidor Logto sempre que um pedido chega. Em vez disso, obténs o Conjunto de Chaves Web JSON (JWKS) do servidor Logto uma vez e subsequentemente verificas os tokens de acesso localmente.
Controlo de acesso baseado em papéis
Até agora, apenas verificámos que um utilizador iniciou sessão com o Logto. Ainda não sabemos se o utilizador possui a permissão apropriada para aceder ao endpoint da API. Isto porque o Logto permite que qualquer pessoa obtenha um token de acesso para um recurso da API existente.
Para resolver isto, podemos empregar o controlo de acesso baseado em papéis (RBAC). No Logto, podes definir papéis e atribuir permissões a eles. Consulta este tutorial para aprenderes a definir papéis e permissões no Logto.
Após definires papéis e permissões, podes adicionar a opção scopes
ao componente LogtoProvider
:
O Logto apenas emitirá então um token de acesso com o(s) escopo(s) apropriado(s) para o utilizador. Por exemplo, se um utilizador apenas tiver o escopo read:products
, o token de acesso conterá apenas esse escopo:
Se um utilizador tiver ambos os escopos read:products
e write:products
, o token de acesso conterá ambos os escopos com um espaço como delimitador:
Na tua aplicação Express.js, podes verificar se o token de acesso contém o(s) escopo(s) correto(s) antes de conceder acesso ao endpoint da API:
Conclusão
Proteger endpoints da API enquanto asseguras escalabilidade não é uma tarefa fácil. No Logto, esforçamo-nos para simplificar a autenticação de pedidos para desenvolvedores, permitindo que te concentres mais na tua lógica de negócio.
Para qualquer questão, sinta-te à vontade para participar do nosso servidor Discord. A nossa comunidade está sempre feliz por ajudar-te.