Português (Portugal)
  • express-js
  • javascript
  • tutorial
  • auth
  • authentication
  • jwt
  • identity
  • api

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.

Gao
Gao
Founder

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:

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.

Criar recurso da API

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.