MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Qual é a melhor maneira de autenticar e autorizar uma solução de web e API como o MERN Stack?


A melhor estratégia de autorização depende do escopo de seus aplicativos em curto ou longo prazo.

Web monolítica ou simples com login privado


Por exemplo, se você tiver apenas uma web simples (MERN) com um backend simples (api rest) ou um aplicativo monolítico como este exemplo de mern com um login interno ou privado em sua organização, sua estratégia de autorização pode ser tão simples quanto:
  • (1*) /login rota expressa que recebe usuário/senha, valida-os no banco de dados e retorna o clássico token jwt e um array de opções (rotas de reação) às quais o usuário deve ter acesso
  • aplicativo da web (reagir) deve renderizar páginas cujas rotas correspondam às rotas recebidas
  • o aplicativo da web deve enviar o token recebido para qualquer invocação de terminal de descanso da API
  • quando a api recebe a invocação do react web, deve validar a existência do token como cabeçalho. Se não existir, deve retornar um erro 403.
  • (2*) Se o token existir, deve-se tentar validá-lo (bem formado, não expirado, assinatura correta etc).
  • (3*)Se for um token válido, você deve realizar uma última validação:O usuário com a função "guest" tem permissão para executar um DELETE para um endpoint /user/100 .
  • (4*) A solução clássica é ter algumas tabelas em seu banco de dados como:user, roles, user_roles, role_permission, permission_option. A tabela de opções deve ter registrado todos os seus endpoints de API e seu método. Também isso pode ser usado para criar a relação entre as rotas da web do usuário <:>. Verifique este

Requisitos modernos


Organizações modernas e grandes exigem:
  • Logins de redes sociais
  • Usuários internos/externos
  • Logins não interativos (robôs, agendadores etc.)
  • Vários aplicativos da web
  • Vários aplicativos para dispositivos móveis
  • Muito descanso de API

Para este caso, o aplicativo MERN não é uma boa escolha porque é TUDO EM UM. A estratégia comum para implementar os requisitos anteriores é ter vários artefatos implantados em vários servidores:
  • aplicativo web (react, vue, angular, linkstart, etc)
  • apis rest (nodejs + expres, java, python, etc)
  • autenticação/autorização:plataforma/provedor oauth2, plataformas de identidade/acesso etc.

Se este for o seu caso, você deve dividir seu aplicativo MERN em vários artefatos implantáveis:web, api e segurança.

Oauth2


Não importa se você está preocupado apenas com o login ou como garantir a autenticação e autorização para suas webs, apis e talvez seus aplicativos móveis, você precisará de:OAUTH2

Você pode desenvolver sua própria plataforma de segurança levando em consideração (1*), (2*), (3*) y (4*) ou usar algo como:
  • auth0
  • keycloack, etc

Mais detalhes aqui:https://stackoverflow.com/a/62049409

Suas perguntas

  • qual método você acha melhor?
    • Acho que se você usar auth0, economizará tempo e esforço. Com auth0 você só precisa de um aplicativo expresso simples, com alguns endpoints como /login, /callback, etc.
    • Aconselho você a revisar como o fluxo OAUTH2 funciona antes de usar auth0 com/sem passaporte. Este link me ajudou muito.
  • Qual ​​é a diferença entre 2 e 3,
    • Pelo que li, auth0 e outras plataformas oferecem um serviço de gerenciamento de usuários ou podem se conectar ao seu serviço de usuários (AD/LDAP, banco de dados, api, etc). Então
  • Existe uma maneira de implementar regras no passaporte (por exemplo, redirecionar novos usuários no primeiro login)
    • Sim. Você pode adicionar alguma lógica quando o retorno de chamada for redirecionado em seus nodejs com ou sem passaporte.
  • Se eu implementar o Passport com MongoDB e meu banco de dados tiver centenas de usuários, como posso gerenciá-los?
    • Atualmente, o banco de dados suporta muitas linhas. Portanto, para seu banco de dados de produção, tente otimizá-lo ou monitorá-lo. Outra opção é contratar um administrador de banco de dados para realizar essas tarefas.

Referências