A autenticação e a autorização são partes fundamentais da segurança em qualquer aplicação web, incluindo APIs desenvolvidas em NodeJS. A autenticação é o processo de verificar a identidade de um usuário, enquanto a autorização é o processo de verificar o que o usuário autenticado tem permissão para fazer. Este capítulo irá se concentrar em como implementar esses dois aspectos críticos na sua API NodeJS, com ênfase especial no armazenamento seguro de senhas.
Para começar, é importante entender que o armazenamento de senhas em texto puro em seu banco de dados é uma prática extremamente insegura. Se um invasor conseguir acessar seu banco de dados, ele terá acesso a todas as senhas de seus usuários. Para evitar isso, é necessário criptografar as senhas antes de armazená-las. A maneira mais comum de fazer isso é através do uso de um processo chamado 'hashing'.
O 'hashing' é um processo que transforma um conjunto de dados em uma string de comprimento fixo, que é supostamente única para cada conjunto de dados de entrada. Quando um usuário cria uma conta ou altera sua senha, você deve criar um hash da senha e armazenar esse hash no banco de dados. Quando o usuário tenta fazer login, você cria um hash da senha fornecida e a compara com o hash armazenado. Se eles corresponderem, a senha está correta.
Em NodeJS, existem várias bibliotecas que você pode usar para criar hashes de senhas, como bcrypt, scrypt e Argon2. Bcrypt é uma das mais populares, devido à sua facilidade de uso e segurança comprovada. Para usar bcrypt, você primeiro precisa instalá-lo em seu projeto com o comando 'npm install bcrypt'. Depois disso, você pode usar a função 'bcrypt.hash' para criar um hash de uma senha.
Além de 'hashing', outra prática comum é adicionar um 'salt' à senha antes de criar o hash. Um 'salt' é uma string aleatória que é adicionada à senha para prevenir ataques de 'rainbow table'. Uma 'rainbow table' é uma tabela pré-computada de hashes para um grande número de possíveis senhas, que um invasor pode usar para descobrir rapidamente a senha original a partir do hash. Ao adicionar um 'salt' único a cada senha, você torna ineficaz o uso de 'rainbow tables'.
- Ouça o áudio com a tela desligada
- Ganhe Certificado após a conclusão
- + de 5000 cursos para você explorar!
Baixar o aplicativo
Bcrypt torna fácil adicionar um 'salt' às suas senhas. Quando você chama a função 'bcrypt.hash', você pode passar um segundo argumento que é o número de rodadas que bcrypt deve usar para gerar o 'salt'. Este número é um trade-off entre segurança e desempenho: um número maior tornará o 'salt' mais seguro, mas também levará mais tempo para gerar.
Agora que você sabe como armazenar senhas de forma segura, vamos falar sobre autenticação e autorização. Autenticação em APIs NodeJS geralmente é feita através de tokens JWT (JSON Web Token). Quando um usuário faz login, a API gera um token JWT que inclui a identidade do usuário e, possivelmente, outras informações. Este token é então enviado de volta ao cliente, que deve incluí-lo em todas as solicitações subsequentes à API.
A autorização é o processo de verificar se o usuário autenticado tem permissão para realizar a ação solicitada. Isso geralmente é feito através de um sistema de 'roles' ou 'permissions'. Por exemplo, você pode ter 'roles' de usuário e administrador, onde o administrador tem permissão para fazer coisas que o usuário não tem.
Em resumo, a autenticação e a autorização são aspectos essenciais da segurança em APIs NodeJS. É importante armazenar as senhas de forma segura através do uso de 'hashing' e 'salting', e usar tokens JWT para autenticação. A autorização deve ser implementada através de um sistema de 'roles' ou 'permissions'.