Comprehensive guide to API security, covering authentication, authorization, input validation, and common vulnerabilities.
API security is more critical than ever in today's interconnected world. With APIs serving as the backbone of modern applications, they've become prime targets for attackers. This comprehensive guide covers essential security practices to protect your APIs and data.
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');
// Secure JWT generation
const generateToken = (user) => {
const payload = {
id: user.id,
role: user.role,
permissions: user.permissions
};
return jwt.sign(payload, process.env.JWT_SECRET, {
expiresIn: '15m',
issuer: 'api.example.com',
audience: 'api-users'
});
};
// Token validation middleware
const authenticateToken = (req, res, next) => {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (!token) {
return res.status(401).json({ error: 'Access token required' });
}
jwt.verify(token, process.env.JWT_SECRET, (err, decoded) => {
if (err) {
return res.status(403).json({ error: 'Invalid token' });
}
req.user = decoded;
next();
});
};
// Role-based authorization
const authorize = (requiredRole) => {
return (req, res, next) => {
if (!req.user || req.user.role !== requiredRole) {
return res.status(403).json({ error: 'Insufficient permissions' });
}
next();
};
};const Joi = require('joi');
const validator = require('validator');
// Schema validation middleware
const validateSchema = (schema) => {
return (req, res, next) => {
const { error } = schema.validate(req.body);
if (error) {
return res.status(400).json({
error: 'Validation failed',
details: error.details.map(d => d.message)
});
}
next();
};
};
// User creation schema
const userSchema = Joi.object({
email: Joi.string().email().required(),
password: Joi.string().min(8).pattern(/^(?=.*[a-z])(?=.*[A-Z])(?=.*d)/).required(),
name: Joi.string().alphanum().min(2).max(50).required(),
role: Joi.string().valid('user', 'admin', 'moderator').default('user')
});
// SQL injection prevention
const sanitizeInput = (req, res, next) => {
const sanitized = {};
for (const [key, value] of Object.entries(req.body)) {
if (typeof value === 'string') {
sanitized[key] = validator.escape(value);
} else {
sanitized[key] = value;
}
}
req.body = sanitized;
next();
};Protect data as it travels between client and server using strong encryption protocols.
Secure sensitive data stored in databases and file systems using robust encryption.