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

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

Top comments (0)