Skip to content

Login BackEnd

Orivaldo Santana Jr edited this page Feb 14, 2023 · 3 revisions

Login BackEnd (detalhamento da funcionalidade)

Introdução

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.

Tecnologias

  • 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.

Algoritmo

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 Request atravé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.

Exemplos de usabilidade

  • Como proteger rotas?

    Para proteger uma rota da aplicação, só precisamos anota-lá com um decorator chamado UseGuards, passando como parâmetro o JwtAuthGuard que é a classe que extende a implementação AuthGuard - JWT do Passport.

    Exemplo:

  • Como manipular rotas autenticadas?

    Todas as rotas protegidas pelo JwtAuthGuard vão ter alguns dados disponíveis no objeto de Request conforme foi tipado na interface RequestWithUser. 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.update precisa do id do 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 Request e 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);
    }

Referências

Clone this wiki locally