API密钥系统是一种身份验证机制,允许您控制谁可以访问您的网站API以及他们可以执行哪些操作。API密钥是一个唯一的代码,用于识别调用API的应用程序或用户。
// 示例:生成API密钥的Node.js代码
const crypto = require('crypto');
function generateApiKey() {
return crypto.randomBytes(32).toString('hex');
}
// 生成示例密钥
const apiKey = generateApiKey();
console.log('Generated API Key:', apiKey);
建议创建一个数据库表存储API密钥信息:
CREATE TABLE api_keys (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
api_key VARCHAR(64) NOT NULL UNIQUE,
secret_key VARCHAR(64) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
expires_at TIMESTAMP NULL,
is_active BOOLEAN DEFAULT TRUE,
permissions JSON,
rate_limit INT DEFAULT 1000,
FOREIGN KEY (user_id) REFERENCES users(id)
);
// Express中间件示例
const authenticateApiKey = (req, res, next) => {
const apiKey = req.headers['x-api-key'] || req.query.api_key;
if (!apiKey) {
return res.status(401).json({ error: 'API key required' });
}
// 查询数据库验证密钥
db.query('SELECT * FROM api_keys WHERE api_key = ? AND is_active = TRUE', [apiKey], (err, results) => {
if (err || results.length === 0) {
return res.status(403).json({ error: 'Invalid API key' });
}
const keyInfo = results[0];
// 检查是否过期
if (keyInfo.expires_at && new Date(keyInfo.expires_at) < new Date()) {
return res.status(403).json({ error: 'API key expired' });
}
// 附加密钥信息到请求对象
req.apiKey = keyInfo;
next();
});
};
const rateLimit = require('express-rate-limit');
const apiLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15分钟
max: (req) => req.apiKey ? req.apiKey.rate_limit : 100, // 从API密钥信息获取限制
message: 'Too many requests from this API key, please try again later'
});
// 在路由中使用
app.use('/api', authenticateApiKey, apiLimiter);
问题1:API密钥泄露
问题2:密钥管理复杂
问题3:权限控制不足
问题4:无法追踪滥用
通过以上步骤,您可以建立一个安全、可扩展的API密钥系统,有效管理对您网站API的访问。
没有搜到相关的文章