secure-token-kit
v1.0.2
Published
A robust, framework-agnostic TypeScript library for secure token and session management.
Downloads
219
Maintainers
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.