DEV Community

Cover image for Trabalhando com autenticação e autorização em Node.js: JWT e Passport.js
Jhonata Vinicius Da Silva Araujo
Jhonata Vinicius Da Silva Araujo

Posted on

17 1 1 1 1

Trabalhando com autenticação e autorização em Node.js: JWT e Passport.js

A autenticação e autorização são recursos fundamentais para a segurança em aplicações web, permitindo controlar o acesso de usuários a determinadas áreas e recursos do sistema.

No Node.js, existem diversas ferramentas disponíveis para implementar esses recursos, como o JWT (JSON Web Tokens) e o Passport.js.

Neste artigo, vamos falar sobre como trabalhar com essas ferramentas em conjunto, garantindo a segurança e a confiabilidade das aplicações.

Configurando o ambiente

Antes de começar a trabalhar com JWT e Passport.js, precisamos configurar nosso ambiente de desenvolvimento. Certifique-se de que o Node.js e o NPM estão instalados em sua máquina.

Em seguida, crie um novo diretório e inicialize um novo projeto Node.js executando o seguinte comando:

npm init -y
Enter fullscreen mode Exit fullscreen mode

Em seguida, instale as seguintes dependências usando o comando:

npm install express jsonwebtoken passport passport-jwt cors
Enter fullscreen mode Exit fullscreen mode

JSON Web Tokens (JWT)

O JWT é um padrão aberto para criação de tokens de acesso, que podem ser usados para autenticação e autorização em aplicações web.

Esses tokens são criptografados e contêm informações sobre o usuário, como nome, email, permissões, entre outras. Ao contrário de sessões tradicionais, que são armazenadas no servidor, os tokens JWT são armazenados no lado do cliente, o que traz diversas vantagens em termos de escalabilidade, performance e segurança.

Para gerar um token JWT, é necessário passar um objeto com as informações do usuário e uma chave secreta para o método jwt.sign().

Exemplo:

const jwt = require('jsonwebtoken');

const user = {
  id: 1,
  name: 'John Doe',
  email: 'johndoe@example.com',
  permissions: ['admin']
};

const token = jwt.sign(user, 'secret-key');

Enter fullscreen mode Exit fullscreen mode

O token gerado será uma string criptografada que pode ser enviada para o cliente, geralmente como um cookie ou um header HTTP.

Para validar um token JWT, basta usar o método jwt.verify() passando o token e a chave secreta:

const decoded = jwt.verify(token, 'secret-key');

Enter fullscreen mode Exit fullscreen mode

O método retorna um objeto com as informações do usuário contidas no token, caso o token seja válido. Caso contrário, será lançada uma exceção.

Passport.js

O Passport.js é um middleware de autenticação para Node.js que permite autenticar usuários usando diferentes estratégias, como JWT, OAuth, Basic Auth, entre outras. O Passport.js também é capaz de lidar com autorização, verificando as permissões de cada usuário.

Para usar o Passport.js em uma aplicação Node.js, é necessário instalar os pacotes passport e passport-jwt:

npm install passport passport-jwt

Enter fullscreen mode Exit fullscreen mode

Em seguida, é necessário configurar uma estratégia de autenticação, definindo como o Passport.js vai verificar os tokens JWT.

Exemplo:

const passport = require('passport');
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;

const options = {
  jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
  secretOrKey: 'secret-key'
};

passport.use(new JwtStrategy(options, (payload, done) => {
  User.findById(payload.sub)
    .then(user => {
      if (user) {
        return done(null, user);
      } else {
        return done(null, false);
      }
    })
    .catch(err => done(err, false));
}));

Enter fullscreen mode Exit fullscreen mode

Nesse exemplo, a estratégia de autenticação usa o método ExtractJwt.fromAuthHeaderAsBearerToken() para extrair o token JWT.

Criando rotas de autenticação

Para criar rotas de autenticação em Node.js com JWT e Passport.js, é necessário seguir alguns passos:

1- Configure o Passport.js para usar o JWT(como já foi mostrado acima):

const passport = require('passport');
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;

const options = {
  jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
  secretOrKey: 'your_jwt_secret'
};

passport.use(new JwtStrategy(options, (payload, done) => {
  // Find the user in the database and return it
  // Call done() with an error if the user doesn't exist
  done(null, user);
}));

Enter fullscreen mode Exit fullscreen mode

Nesse exemplo, estamos configurando o Passport.js para extrair o JWT do cabeçalho de autenticação Bearer e usar uma chave secreta para verificar a assinatura do token.

Também estamos definindo uma estratégia de autenticação baseada em JWT.

2- Crie uma rota para autenticação:

const jwt = require('jsonwebtoken');

router.post('/login', (req, res) => {
  // Authenticate the user
  const user = { id: 1, name: 'John Doe' };

  // Generate a JWT
  const token = jwt.sign(user, 'your_jwt_secret');

  // Return the token to the client
  res.json({ token });
});

Enter fullscreen mode Exit fullscreen mode

Nesse exemplo, estamos autenticando o usuário e gerando um token JWT com o método jwt.sign(). Em seguida, estamos retornando o token para o cliente em formato JSON.

3- Proteja as rotas que precisam de autenticação:

const passport = require('passport');

router.get('/protected', passport.authenticate('jwt', { session: false }), (req, res) => {
  res.json({ message: 'This is a protected route' });
});

Enter fullscreen mode Exit fullscreen mode

Nesse exemplo, estamos usando o middleware passport.authenticate() para proteger a rota /protected.

Esse middleware verifica se o token JWT é válido e, se for, adiciona o objeto user ao objeto req.

Com esses passos, você pode criar rotas de autenticação em Node.js com JWT e Passport.js.

É importante lembrar de proteger as rotas que precisam de autenticação e de armazenar a chave secreta de forma segura.

Referencias:

jwt
Passport
https://www.digitalocean.com/community/tutorials/api-authentication-with-json-web-tokensjwt-and-passport

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

SurveyJS custom survey software

JavaScript Form Builder UI Component

Generate dynamic JSON-driven forms directly in your JavaScript app (Angular, React, Vue.js, jQuery) with a fully customizable drag-and-drop form builder. Easily integrate with any backend system and retain full ownership over your data, with no user or form submission limits.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay