Obtendrá:
Instrucciones claras: Pasos fáciles de seguir con explicaciones para guiarte como un profesional.
Código fuente listo para usar: Copie, pegue y personalice para crear su servidor de autenticación en un abrir y cerrar de ojos.
API de registro de usuarios
- Gestiona el alta de nuevos usuarios.
- Acepta los datos del usuario (nombre de usuario, correo electrónico, contraseña).
- Almacena de forma segura la información del usuario (contraseñas con hash y sal).
API de inicio de sesión de usuario
- Verifica las credenciales del usuario.
- Compara la contraseña introducida con el hash almacenado.
- Si la autenticación tiene éxito, genera y devuelve un token (por ejemplo, JWT).
API de verificación de usuarios
- Obten y devuelve información sobre el perfil del usuario.
- Requiere un token de autenticación válido.
API de actualización de tokens
- Emite nuevos tokens de acceso cuando caducan.
- Amplía las sesiones de usuario sin necesidad de volver a iniciar sesión.
Registro de usuarios
Esta API está diseñada para registrar usuarios en nuestra base de datos. El acceso a nuestras API privadas está limitado únicamente a los usuarios registrados.
Instalar Dependencias Requeridas:
npm install express mongoose bcryptjs
Crear modelo de usuario
// models/user.js
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const userSchema = new mongoose.Schema({
username: { type: String, required: true, unique: true },
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
});
userSchema.pre('save', async function (next) {
if (this.isModified('password')) {
this.password = await bcrypt.hash(this.password, 10); // Hash password with salt
}
next();
});
module.exports = mongoose.model('User', userSchema);
Crear ruta de registro
// routes/register.js
const express = require('express');
const router = express.Router();
const User = require('../models/user');
router.post('/', async (req, res) => {
try {
const { username, email, password } = req.body;
// Validate user input here (e.g., using a validation library)
const existingUser = await User.findOne({ email });
if (existingUser) {
return res.status(400).json({ message: 'Email already exists' });
}
const user = new User({ username, email, password });
await user.save();
res.status(201).json({ message: 'User registered successfully' });
} catch (err) {
console.error(err);
res.status(500).json({ message: 'Registration failed' });
}
});
module.exports = router;
Integración en el servidor principal
// app.js
const express = require('express');
const mongoose = require('mongoose');
const registerRouter = require('./routes/register');
const app = express();
// Connect to your MongoDB database
mongoose.connect('mongodb://localhost:27017/yourDatabaseName', {
useNewUrlParser: true,
useUnifiedTopology: true,
});
app.use(express.json());
app.use('/register', registerRouter);
const port = process.env.PORT || 5000;
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
Curl para la API
curl --location --request POST 'http://localhost:5000/register' \
--header 'Content-Type: application/json' \
--data-raw '{
"username": "laxmi",
"email": "laxmi@example.com",
"password": "mypassword"
}'
Inicio de sesión de usuario
Esta API da acceso a los usuarios registrados que han verificado correctamente su identidad. Proporciona un token como respuesta, que se utilizará para la verificación en todas las demás API.
Instalación Dependencias necesarias:
npm install jsonwebtoken
Crear ruta de inicio de sesión
// routes/login.js
const express = require('express');
const router = express.Router();
const User = require('../models/user');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';
const REFRESH_TOKEN_SECRET = process.env.REFRESH_TOKEN_SECRET || 'your-refresh-token-secret'; // Add a separate secret for refresh tokens
router.post('/', async (req, res) => {
try {
const { email, password } = req.body;
// Validate user input here (e.g., using a validation library)
const user = await User.findOne({ email });
if (!user) {
return res.status(401).json({ message: 'Invalid email or password' });
}
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) {
return res.status(401).json({ message: 'Invalid email or password' });
}
// Generate access token
const accessToken = jwt.sign({ userId: user._id }, JWT_SECRET, { expiresIn: '1h' });
// Generate refresh token with longer expiration
const refreshToken = jwt.sign({ userId: user._id }, REFRESH_TOKEN_SECRET, { expiresIn: '7d' });
res.json({
message: 'Login successful',
accessToken,
refreshToken
});
} catch (err) {
console.error(err);
res.status(500).json({ message: 'Internal server error' });
}
});
module.exports = router;
Integración en el servidor principal
// app.js
// ... (existing code for database connection and express setup)
const loginRouter = require('./routes/login');
app.use('/login', loginRouter);
// ... (rest of the code)
Curl para la API
curl --location --request POST 'http://localhost:5000/login' \
--header 'Content-Type: application/json' \
--data-raw '{
"email": "laxmi@example.com",
"password": "mypassword"
}'
Verificación de usuarios
Esta API lee el token para comprobar si estás en la base de datos de usuarios aprobados. Si tu token es válido, proporciona tu información de usuario como respuesta.
Crear ruta de verificación:
const express = require('express');
const jwt = require('jsonwebtoken');
const User = require('../models/user'); // Replace with your User model
const router = express.Router();
const JWT_SECRET = 'your-secret-key'; // Replace with your actual secret key
router.get('/', verifyToken, async (req, res) => {
try {
const user = await User.findById(req.userId);
if (!user) {
return res.status(404).json({ message: 'User not found' });
}
// Filter sensitive information if needed
const profileData = {
_id: user._id,
name: user.name,
email: user.email,
// ...other profile fields you want to expose
};
res.json(profileData);
} catch (err) {
console.error(err);
res.status(500).json({ message: 'Internal server error' });
}
});
function verifyToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader;
if (!token) {
return res.status(401).json({ message: 'Unauthorized' });
}
jwt.verify(token, JWT_SECRET, (err, decoded) => {
if (err) {
res.status(401).json({ message: 'Invalid token' });
} else {
req.userId = decoded.userId;
next();
}
});
}
module.exports = router;
Integración en el servidor principal
// app.js
// ... (existing code for database connection and express setup)
const verifyRouter = require('./routes/verification');
app.use('/verify', verifyRouter);
// ... (rest of the code)
Curl para la API
curl --location --request GET 'http://localhost:5000/verify' \
--header 'authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NTkxYTljOTU4ZWI1NDNkZTM3MzA4M2EiLCJpYXQiOjE3MDQyOTc0MzMsImV4cCI6MTcwNDMwMTAzM30.1iGarWoSbTKlL9Z-zSm2PlQOBDRMCee6T_1_oQro8GA'
Actualización de token
Esta API crea un nuevo token de actualización cuando caduca su token de acceso, para que pueda seguir conectado sin tener que volver a introducir su contraseña.
Crear ruta de token de actualización:
const express = require('express');
const jwt = require('jsonwebtoken');
const router = express.Router();
const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';
const REFRESH_TOKEN_SECRET = process.env.REFRESH_TOKEN_SECRET || 'your-refresh-token-secret';
router.post('/', async (req, res) => {
try {
const refreshToken = req.body.refreshToken;
if (!refreshToken) {
return res.status(400).json({ message: 'Refresh token is required' });
}
jwt.verify(refreshToken, REFRESH_TOKEN_SECRET, (err, decoded) => {
if (err) {
return res.status(401).json({ message: 'Invalid refresh token' });
}
const userId = decoded.userId;
// Generate a new access token
const accessToken = jwt.sign({ userId }, JWT_SECRET, { expiresIn: '1h' });
res.json({ accessToken });
});
} catch (err) {
console.error(err);
res.status(500).json({ message: 'Internal server error' });
}
});
module.exports = router;
Integración en el servidor principal
// app.js
// ... (existing code for database connection and express setup)
const refreshTokenRouter = require('./routes/refreshToken');
app.use('/refresh', refreshTokenRouter);
// ... (rest of the code)
Curl para la API
curl --location --request POST 'http://localhost:5000/refresh' \
--header 'Content-Type: application/json' \
--data-raw '{
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NThiMTc1ZmI0OGQ1YzIyYTY2MWQzNWEiLCJpYXQiOjE3MDM4NTcxNjcsImV4cCI6MTcwNDQ2MTk2N30.8qnduxMhaHx35n9bU7lA1SSqkDF6KzPb4HqKJvPnN78"
}'