-
Notifications
You must be signed in to change notification settings - Fork 4
Login BackEnd
Esse documento visa detalhar as estratégias, tecnologias e algoritmos que serão implementados no contexto de autenticação e autorização do sistema no lado do BackEnd.
- Nest.js
- Nest.js é um framework Nodejs feito para desenvolver aplicações backend de forma mais rápida, eficiente, confiável e escalável.
- Passport
- Passport é uma biblioteca completa que lida com autenticação e autorização através de middlewares.
- Possui uma forte integração com o Nest.js (framework backend que utilizamos no projeto).
- Mongodb
- Mongodb é um banco de dados não relacional (NoSql) de alta performance.
Autenticação é uma das partes mais importantes do sistema. Existem muitas abordagens e estratégias para lidar com a autenticação de usuários.
A estratégia que vamos utilizar é a do JSON Web Token (JWT), onde existe um token que será fornecido pela nossa aplicação a partir das credenciais do usuário. Esse token será a chave de acesso para que o cliente autenticado consiga acessar as rotas protegidas da nossa aplicação.
O Passport vai executar uma série de etapas para:
- Autenticar um usuário verificando suas "credenciais"
- Gerenciar o estado autenticado (emitindo um token, como um JWT)
- Anexar informações sobre o usuário autenticado ao objeto de
Requestatravés do middleware para uso posterior em manipuladores de rota.
Toda essa estratégia foi facilmente implementada utilizando o Nestjs e o Passport em conjunto, bem como está descrito na seção de autenticação na documentação do Nestjs.
-
Como proteger rotas?
Para proteger uma rota da aplicação, só precisamos anota-lá com um decorator chamado
UseGuards, passando como parâmetro oJwtAuthGuardque é a classe que extende a implementação AuthGuard - JWT do Passport.Exemplo:
-
Como manipular rotas autenticadas?
Todas as rotas protegidas pelo
JwtAuthGuardvão ter alguns dados disponíveis no objeto deRequestconforme foi tipado na interfaceRequestWithUser. Esses dados serão suficientes para buscar o usuário no banco de dados e realizar quaisquer tipos de manipulação.Exemplo:
Para atualizar os dados de um usuário, o método
UsersService.updateprecisa doiddo usuário como primeiro parâmetro, conforme a função abaixo:async update(id: string, updateUserDto: UpdateUserDto): Promise<UserDto> { const updatedUser = await this.userModel .findByIdAndUpdate(id, { $set: updateUserDto, }) .exec(); return { id: updatedUser.id, email: updatedUser.email, name: updatedUser.name, }; }
Com isso, a rota protegida vai se encarregar de pegar o id do usuário através do objeto de
Requeste passar pra essa função junto com os dados que serão atualizados:@UseGuards(JwtAuthGuard) @Patch('update-account') update( @Request() req: RequestWithUser, @Body() updateUserDto: UpdateUserDto, ) { return this.usersService.update(req.user.userId, updateUserDto); }