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 🙏

© 2024 – Pkg Stats / Ryan Hefner

secure-token-kit

v1.0.2

Published

A robust, framework-agnostic TypeScript library for secure token and session management.

Downloads

219

Readme

🔐 Secure Token Kit STK - Librería del Servidor

Versión: 1.0.2

Una librería robusta y agnóstica al framework escrita en TypeScript para el manejo seguro de tokens y sesiones en aplicaciones backend. Proporciona funcionalidades para generar y verificar tokens de acceso y refresh tokens, así como middleware para proteger rutas y gestionar la autenticación de usuarios.

Características

  • Generación y verificación de tokens JWT (JSON Web Tokens).
  • Soporte para tokens de acceso y refresh tokens.
  • Middleware para proteger rutas y verificar la autenticación.
  • Fácil integración con frameworks como Express.
  • Agnóstico al framework: puede utilizarse con cualquier framework o librería.
  • Escrito en TypeScript, con definiciones de tipos incluidas.

Puedes instalar la librería mediante NPM o Yarn:

Usando NPM

npm install secure-token-kit

Usando Yarn

yarn add secure-token-kit

🛠 Uso y aplicación del STK (Secure Token Kit)

️ Configuración Básica

A continuación se muestra cómo utilizar la librería en una aplicación backend.

  • 1. Importar las clases necesarias.

    import { AuthServer, authMiddleware, TokenPayload } from 'secure-token-kit/dist/backend';
  • 2. Crear una instancia de AuthServer

    const authServer = new AuthServer({
      jwtSecret: 'tu_jwt_secret', // Clave secreta para los tokens de acceso
      refreshTokenSecret: 'tu_refresh_token_secret', // Clave secreta para los refresh tokens
      jwtOptions: { expiresIn: '15m' }, // Opciones para los tokens de acceso
      refreshTokenOptions: { expiresIn: '7d' }, // Opciones para los refresh tokens
    });
  • 3. Configurar las rutas de autenticación

    import express from 'express';
    const app = express();
    app.use(express.json());
    
    // Almacenamiento de refresh tokens (ejemplo simple; en producción usar una base de datos)
    const refreshTokensStore: Set<string> = new Set();
    
    // Endpoint de inicio de sesión
    app.post('/auth/login', (req, res) => {
      const { username, password } = req.body;
      // Validar credenciales del usuario
      const userId = 'user-id-from-database'; // Obtener el ID del usuario desde la base de datos
    
      const accessToken = authServer.generateAccessToken({ sub: userId });
      const refreshToken = authServer.generateRefreshToken({ sub: userId });
    
      // Guardar el refresh token
      refreshTokensStore.add(refreshToken);
    
      res.json({ accessToken, refreshToken });
    });
    
    // Endpoint para renovar tokens
    app.post('/auth/refresh', (req, res) => {
      const { refreshToken } = req.body;
      if (!refreshToken) return res.status(400).send('Refresh token is required');
    
      if (!refreshTokensStore.has(refreshToken)) {
        return res.status(403).send('Invalid refresh token');
      }
    
      try {
        const payload = authServer.verifyRefreshToken(refreshToken);
    
        // Generar nuevos tokens
        const newAccessToken = authServer.generateAccessToken({ sub: payload.sub });
        const newRefreshToken = authServer.generateRefreshToken({ sub: payload.sub });
    
        // Actualizar el refresh token almacenado
        refreshTokensStore.delete(refreshToken);
        refreshTokensStore.add(newRefreshToken);
    
        res.json({
          accessToken: newAccessToken,
          refreshToken: newRefreshToken,
        });
      } catch (error) {
        res.status(403).send('Invalid refresh token');
      }
    });
    
    // Endpoint para cerrar sesión
    app.post('/auth/logout', (req, res) => {
      const { refreshToken } = req.body;
      if (refreshToken) {
        refreshTokensStore.delete(refreshToken);
      }
      res.status(200).send('Logged out');
    });
  • 4. Proteger rutas con el middleware de autenticación

    // Aplicar el middleware a rutas protegidas
    app.use('/protected', authMiddleware(authServer));
    
    app.get('/protected/data', (req, res) => {
      const user = (req as any).user; // El payload del token está disponible en req.user
      res.send(`Hola, usuario con ID: ${user.sub}`);
    });
  • 5. Iniciar el servidor

    app.listen(3000, () => {
      console.log('Servidor ejecutándose en el puerto 3000');
    });

👨🏽‍💻 EJEMPLO COMPLETO DE SU APLICACIÓN.

    import express from 'express';
    import { AuthServer, authMiddleware } from 'secure-token-kit/dist/backend';
    
    const app = express();
    app.use(express.json());
    
    const authServer = new AuthServer({
      jwtSecret: 'tu_jwt_secret',
      refreshTokenSecret: 'tu_refresh_token_secret',
    });
    
    const refreshTokensStore: Set<string> = new Set();
    
    app.post('/auth/login', (req, res) => {
      const { username, password } = req.body;
      // Validar las credenciales del usuario...
      const userId = 'user-id-from-database';
    
      const accessToken = authServer.generateAccessToken({ sub: userId });
      const refreshToken = authServer.generateRefreshToken({ sub: userId });
    
      refreshTokensStore.add(refreshToken);
    
      res.json({ accessToken, refreshToken });
    });
    
    app.post('/auth/refresh', (req, res) => {
      const { refreshToken } = req.body;
      if (!refreshToken) return res.status(400).send('Refresh token is required');
    
      if (!refreshTokensStore.has(refreshToken)) {
        return res.status(403).send('Invalid refresh token');
      }
    
      try {
        const payload = authServer.verifyRefreshToken(refreshToken);
    
        const newAccessToken = authServer.generateAccessToken({ sub: payload.sub });
        const newRefreshToken = authServer.generateRefreshToken({ sub: payload.sub });
    
        refreshTokensStore.delete(refreshToken);
        refreshTokensStore.add(newRefreshToken);
    
        res.json({
          accessToken: newAccessToken,
          refreshToken: newRefreshToken,
        });
      } catch (error) {
        res.status(403).send('Invalid refresh token');
      }
    });
    
    app.post('/auth/logout', (req, res) => {
      const { refreshToken } = req.body;
      if (refreshToken) {
        refreshTokensStore.delete(refreshToken);
      }
      res.status(200).send('Logged out');
    });
    
    app.use('/protected', authMiddleware(authServer));
    
    app.get('/protected/data', (req, res) => {
      const user = (req as any).user;
      res.send(`Hola, usuario con ID: ${user.sub}`);
    });
    
    app.listen(3000, () => {
      console.log('Servidor ejecutándose en el puerto 3000');
    });

📝 Notas Importantes

  • Almacenamiento de Refresh Tokens: En este ejemplo, los refresh tokens se almacenan en un Set en memoria. En una aplicación de producción, debes almacenarlos en una base de datos segura para permitir la invalidación de tokens y el control de sesiones.
  • Seguridad de las Claves Secretas: Las claves secretas jwtSecret y refreshTokenSecret deben almacenarse de forma segura, preferiblemente usando variables de entorno.
  • Manejo de Errores: Es recomendable implementar un manejo de errores más robusto y mensajes más descriptivos según las necesidades de tu aplicación.
  • TLS/SSL: Asegúrate de utilizar HTTPS en tu servidor para proteger la transmisión de tokens y credenciales.

🤝 Licencia

Este proyecto está bajo la licencia MIT. Consulta el archivo LICENSE para más detalles.

📩 Contacto

Para preguntas o soporte, puedes contactarme en [email protected].

¡Gracias por usar Secure Token Kit! Esperamos que esta librería te sea útil para manejar la autenticación y las sesiones en tus aplicaciones backend.