npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@devflow-modules/jwt-auth

v1.1.0

Published

Autenticação JWT modular para Node.js com suporte a refresh token, cookies HTTP-only, bcrypt e middleware Express.

Readme

CI codecov npm version License: MIT

🔐 @devflow-modules/jwt-auth

Módulo de autenticação JWT seguro, modular e reutilizável para aplicações Node.js. Oferece suporte completo a:

  • Access Token
  • 🔁 Refresh Token
  • 🔑 Hash e verificação de senhas
  • 🛡️ Middleware de proteção de rotas
  • 🧪 Testes com cobertura
  • 🚫 Zero dependência de banco de dados

📦 Requisitos

  • Node.js >= 16
  • npm >= 8

🚀 Instalação

npm install @devflow-modules/jwt-auth

Para uso local com desenvolvimento:

npm link

📆 Variáveis de ambiente

Crie um arquivo .env com:

JWT_SECRET=chave_secreta_access_token
JWT_EXPIRES_IN=1h
JWT_REFRESH_SECRET=chave_secreta_refresh_token
JWT_REFRESH_EXPIRES_IN=7d

🔧 Suporte a múltiplos algoritmos JWT

Este módulo suporta algoritmos simétricos (HS256, HS512) e assimétricos (RS256) para assinar/verificar tokens JWT.

✅ Configuração via .env

# Algoritmo padrão (HS256, HS512 ou RS256)
JWT_ALGORITHM=HS256

# Para algoritmos HS256 / HS512
JWT_SECRET=your_hmac_secret

# Para RS256 (criptografia com chave pública/privada)
JWT_PRIVATE_KEY_PATH=src/keys/private.key
JWT_PUBLIC_KEY_PATH=src/keys/public.key

🔐 Gerar chaves para RS256

Se você optar por usar RS256, gere suas chaves com:

openssl genrsa -out src/keys/private.key 2048
openssl rsa -in src/keys/private.key -pubout -out src/keys/public.key

💡 As chaves devem ser referenciadas corretamente nas variáveis JWT_PRIVATE_KEY_PATH e JWT_PUBLIC_KEY_PATH.

✅ Exemplo de uso (sem alterações no código)

A mesma API funciona com qualquer algoritmo:

const { signToken, verifyToken } = require('@devflow-modules/jwt-auth');

const token = signToken({ id: '123' });
const decoded = verifyToken(token);

✅ Funcionalidades

🔐 Geração e Verificação de Access Token

// CommonJS
const { signToken, verifyToken } = require('@devflow-modules/jwt-auth');

// ESModules (futuro)
import { signToken, verifyToken } from '@devflow-modules/jwt-auth';

const token = signToken({ id: '123', role: 'admin' });
const payload = verifyToken(token);
// { id: '123', role: 'admin', iat, exp }

🔁 Geração e Verificação de Refresh Token

const { signRefreshToken, verifyRefreshToken } = require('@devflow-modules/jwt-auth');

const refresh = signRefreshToken({ id: '123' });
const payload = verifyRefreshToken(refresh);

🔑 Hash e Verificação de Senhas

const { hashPassword, comparePassword } = require('@devflow-modules/jwt-auth');

const hash = await hashPassword('minhasenha');
const isValid = await comparePassword('minhasenha', hash); // true ou false

🛡️ Middleware: protectRoute (Express)

Protege rotas de acesso não autenticado.

const express = require('express');
const { protectRoute } = require('@devflow-modules/jwt-auth');

const app = express();

app.get('/private', protectRoute, (req, res) => {
  res.json({ user: req.user });
});

🛡️ Middleware: protectWithRoles (Express)

Protege rotas com base em roles (funções/permissões) do usuário autenticado.

const express = require('express');
const { protectWithRoles } = require('@devflow-modules/jwt-auth');

const app = express();

// Permite acesso apenas para usuários com role 'admin' ou 'editor'
app.get('/admin', protectWithRoles(['admin', 'editor']), (req, res) => {
  res.json({ message: 'Acesso permitido para administradores e editores.' });
});

// Permite acesso apenas para usuários com role 'user'
app.get('/profile', protectWithRoles(['user']), (req, res) => {
  res.json({ message: 'Acesso permitido para usuários.' });
});

💻 Exemplo completo (Express)

require('dotenv').config();
const express = require('express');
const { signToken, signRefreshToken, protectRoute } = require('@devflow-modules/jwt-auth');

const app = express();
app.use(express.json());

// login (gera access e refresh token)
app.post('/login', (req, res) => {
  const token = signToken({ id: 'user123' });
  const refresh = signRefreshToken({ id: 'user123' });
  res.json({ token, refresh });
});

app.get('/private', protectRoute, (req, res) => {
  res.json({ user: req.user });
});

app.listen(3000, () => console.log('API rodando em http://localhost:3000'));

🧪 Testes

Execute os testes com cobertura:

npm run test:coverage

💡 Pré-push protegido com Husky

Este repositório usa Husky para impedir git push com testes quebrados ou cobertura insuficiente.


🧱 Estrutura

src/
├── jwt/
│   ├── signToken.cjs
│   ├── verifyToken.cjs
│   ├── signRefreshToken.cjs
│   └── verifyRefreshToken.cjs
├── password/
│   ├── hashPassword.cjs
│   └── comparePassword.cjs
├── middleware/
│   ├── protectRoute.cjs
│   └── protectWithRoles.cjs      # Novo middleware adicionado
│   └── protectRouteFromCookie.cjs
├── utils/
│   └── env.cjs
├── index.js
tests/
├── cookies/
│   └── cookies.test.cjs
├── jwt/
│   ├── jwt.test.cjs
│   ├── jwtAlgorithm.test.cjs
│   ├── refreshToken.test.cjs
│   ├── signToken.errors.test.cjs
│   └── verifyToken.errors.test.cjs
├── middleware/
│   ├── middleware.test.cjs
│   ├── protectWithRoles.test.cjs   # Testes do middleware de roles
│   └── protectRouteFromCookie.test.cjs
├── password/
│   └── password.test.cjs

🍪 Uso com Cookies

Você pode definir e extrair tokens via cookies para sessões seguras com HTTP-only:

const { setTokenCookie, getTokenFromCookie } = require('@devflow-modules/jwt-auth');

setTokenCookie(res, 'meu_token'); // Define cookie "jwt"
const token = getTokenFromCookie(req); // Extrai token do cookie

Com middleware:

const { protectRouteFromCookie } = require('@devflow-modules/jwt-auth');
app.get('/private', protectRouteFromCookie, (req, res) => {
  res.json({ user: req.user });
});

📌 Roadmap

  • [X] Suporte a múltiplos algoritmos JWT (HS512, RS256)
  • [X] Suporte a cookies HTTP-only
  • [X] Middleware para roles e permissões
  • [X] Changelog automatizado + GitHub Release
  • [ ] Exemplo completo com autenticação + refresh
  • [ ] Middleware opcional para rotas públicas
  • [ ] Compatibilidade com ESM (import/export)
  • [ ] Suporte a sessão baseada em token com blacklist
  • [ ] Integração com login social (Google, GitHub)

⚖️ Licença

MIT © devflow-modules