Proteja sua API Express.js com JWT e Logto
Aprenda como proteger seus endpoints de API Express.js com JSON Web Tokens (JWT) e Logto.
Introdução
Ao desenvolver uma aplicação web, é crucial proteger seus endpoints de API contra acesso não autorizado. Imagine que você está construindo um site de compras online; você definitivamente não quer que ladrões cibernéticos explorem sua API.
Supondo que você já tenha construído uma aplicação Express.js com autenticação de usuários, onde os usuários devem fazer login antes de realizar certas ações. Se não, você pode começar sua jornada com o Logto. Ele requer apenas algumas linhas de código para estabelecer um fluxo de autenticação de usuários.
No entanto, mesmo após a autenticação de usuários, você enfrenta várias escolhas para proteger seus endpoints de API. Infelizmente, a maioria dessas opções tem suas desvantagens:
- Autenticação baseada em sessão: Vincular sua API a um armazenamento de sessões, o que não é escalável e não se adapta bem aos microsserviços.
- Chamar um serviço de autenticação: Isso 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 de API, potencialmente levando a despesas elevadas.
Neste tutorial, demonstraremos como reforçar seus endpoints de API usando JSON Web Tokens (JWT) e Logto. Essa abordagem oferece escalabilidade e custos extras mínimos.
Pré-requisitos
Antes de começar, certifique-se de ter o seguinte:
- Uma conta Logto. Se você não tiver uma, pode se inscrever gratuitamente.
- Um projeto Express.js que precisa de proteção de API e uma aplicação cliente que consome a API.
- Familiaridade básica com JSON Web Token (JWT).
Defina seu recurso de API no Logto
O Logto aproveita ao máximo RFC 8707: Indicadores de Recursos para OAuth 2.0 para proteger seus endpoints de API. Isso significa que você pode definir seus recursos de API usando suas URLs reais.
Navegue para a aba "Recursos de API" no Console do Logto e clique em "Criar recurso de API" para criar um novo. Por exemplo, se você deseja proteger o endpoint /api/products
, você pode usar a URL https://seudominio.com/api/products
como o identificador.
Obtenha um token de acesso na sua aplicação cliente
Para prosseguir, você precisará integrar o SDK do Logto na sua aplicação cliente. Esta aplicação pode ser diferente do seu backend Express.js; por exemplo, você pode ter um aplicativo React usando Express.js como o servidor de API back-end.
Você também precisará ajustar a configuração do SDK do Logto para informar ao Logto que deseja solicitar um token de acesso para sua API nesta concessão. Aqui está um exemplo usando React:
Uma vez que um usuário faça login com Logto, isAuthenticated
dentro do SDK do Logto se tornará true
:
Agora, você pode usar o método getAccessToken
para recuperar um token de acesso para sua API:
Por fim, inclua esse token de acesso no cabeçalho Authorization
ao fazer requisições para sua API:
Verifique o token de acesso na sua API
Na sua aplicação Express.js, instale a biblioteca jose
para verificação de JWT:
Como estamos usando autenticação Bearer, extraia o token de acesso do cabeçalho Authorization
:
Subsequentemente, crie um middleware para verificar o token de acesso:
Agora você pode empregar esse middleware para proteger seus endpoints de API:
Com esta abordagem, você não precisa contatar o servidor Logto toda vez que uma solicitação chega. Em vez disso, você busca o Conjunto de Chaves Web JSON (JWKS) do servidor Logto uma vez e, subsequentemente, verifica tokens de acesso localmente.
Controle de acesso baseado em funções
Até este ponto, apenas verificamos se um usuário fez login com Logto. Ainda não sabemos se o usuário possui a permissão adequada para acessar o endpoint da API. Isso ocorre porque o Logto permite que qualquer pessoa obtenha um token de acesso para um recurso de API existente.
Para resolver isso, podemos empregar controle de acesso baseado em funções (RBAC). No Logto, você pode definir funções e atribuir permissões a elas. Consulte este tutorial para aprender como definir funções e permissões no Logto.
Após definir funções e permissões, você pode adicionar a opção scopes
ao componente LogtoProvider
:
O Logto então emitirá apenas um token de acesso com o(s) escopo(s) apropriado(s) para o usuário. Por exemplo, se um usuário tem apenas o escopo read:products
, o token de acesso conterá apenas esse escopo:
Se um usuário tem ambos os escopos read:products
e write:products
, o token de acesso conterá ambos os escopos com um espaço como delimitador:
Na sua aplicação Express.js, você pode 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 de API enquanto garante escalabilidade não é uma tarefa fácil. No Logto, nos esforçamos para simplificar a autenticaç ão de requisições para desenvolvedores, permitindo que você se concentre mais na sua lógica de negócios.
Para qualquer pergunta, sinta-se à vontade para entrar em nosso servidor Discord. Nossa comunidade está sempre feliz em ajudar você.