深入理解Node.js中的API密钥认证 - LogRocket博客
使用Node.jsJSON Web令牌、OAuth和API密钥等。在本文中,我们将深入探讨如何在Node.js中使用API密钥进行身份验证。
API密钥认证的一个显著优势是能够限制或跟踪特定用户对API的使用频率。通过API密钥,用户无需担心使用用户名和密码进行多因素身份验证,同时可以自动从应用程序中获取数据。
在本教程中,我们将使用Node.js创建一个API,并构建一个API的所有路由。
初始项目设置
在开始之前,请确保您具备以下条件:
- 熟悉Node.js的基础知识。
- 在您的计算机上安装了Node.js。
首先,为您的项目创建一个文件夹,并运行以下命令生成package.json文件:
$ npm init -y
接着,更新package.json文件中的scripts模块,以便使用Nodemon运行服务器:
...
"scripts": {
"test": "echo "Error: no test specified" && exit 1",
"dev": "nodemon Server.js"
}
...
安装必要的依赖项:
npm install express nodemon
建立身份验证系统
身份验证系统的核心功能是接收用户名并生成用户数据,其中包括用户名、API密钥以及每天的使用次数。以下是实现步骤:
1. 生成API密钥
创建一个名为apiAuth.js的文件,并添加以下代码,用于生成一个包含30个字符的“base-36”字符串:
const genAPIKey = () => {
return [...Array(30)]
.map(() => ((Math.random() * 36) | 0).toString(36))
.join('');
};
2. 创建用户数据
创建一个名为initialData.js的文件,用于存储初始用户数据和国家列表:
const users = [
{
_id: 1587912,
api_key: "rwuy6434tgdgjhtiojiosi838tjue3",
username: "username",
usage: [{ date: "2022-10-10", count: 17 }],
},
];
const Countries = [
{ _id: 1, name: "Nigeria" },
{ _id: 2, name: "China" },
];
module.exports = { users, Countries };
在apiAuth.js中添加以下代码,用于创建用户并存储到数组中:
const users = require('./initialData').users;
const createUser = (_username, req) => {
let today = new Date().toISOString().split('T')[0];
let user = {
_id: Date.now(),
api_key: genAPIKey(),
username: _username,
usage: [{ date: today, count: 0 }],
}; users.push(user);
return user;
};
3. 验证API密钥
在apiAuth.js中添加以下代码,用于验证API密钥并限制每日使用次数:
const authenticateKey = (req, res, next) => {
let api_key = req.header("x-api-key");
let account = users.find((user) => user.api_key === api_key);
if (account) {
let today = new Date().toISOString().split("T")[0];
let usageIndex = account.usage.findIndex((day) => day.date === today); if (usageIndex >= 0) {
if (account.usage[usageIndex].count >= MAX) {
res.status(429).send({
error: { code: 429, message: "Max API calls exceeded." },
});
} else {
account.usage[usageIndex].count++;
next();
}
} else {
account.usage.push({ date: today, count: 1 });
next();
}
} else {
res.status(403).send({ error: { code: 403, message: "Access denied." } });
}
};module.exports = { createUser, authenticateKey };
为服务器开发路由
接下来,我们将在服务器中添加路由,用于用户注册和数据访问。
1. 创建服务器
创建一个名为Server.js的文件,并添加以下代码:
const express = require('express');
const app = express();
const port = 4000;
const API = require('./apiAuth');
const { users, Countries } = require('./initialData');
app.use(express.json());app.get('/', (req, res) => {
res.status(200).send({ data: { message: 'Access countries at /api/country.' } });
});
2. 用户注册路由
使用createUser函数创建一个路由,用于注册新用户:
app.post('/api/register', (req, res) => {
let username = req.body.username;
let user = API.createUser(username, req);
res.status(201).send({ data: user });
});
3. 国家数据路由
添加以下路由,用于获取和添加国家数据,同时验证API密钥:
app.get('/api/country', API.authenticateKey, (req, res) => {
res.status(200).send({ data: Countries });
});
app.post('/api/country', API.authenticateKey, (req, res) => {
let country = {
_id: Date.now(),
name: req.body.country,
};
Countries.push(country);
res.status(201).send({ data: country });
});
4. 启动服务器
最后,设置服务器监听端口:
app.listen(port, () => {
console.log(Server running on port ${port});
});
运行以下命令启动服务器:
npm run dev
测试API
注册用户
运行以下命令以注册新用户,并获取生成的API密钥:
curl -d "username=User1" -X POST http://127.0.0.1:4000/api/register -w "n"
获取国家数据
使用生成的API密钥访问国家数据:
curl http://127.0.0.1:4000/api/country -H "x-api-key: YOUR_API_KEY" -w "n"
结论
在本教程中,我们使用Node.js构建了一个API,并实现了基于API密钥的身份验证系统。通过该系统,用户可以安全地访问API,同时开发者可以限制和跟踪API的使用频率。
您可以将本教程中的知识扩展到更复杂的场景,例如将用户数据存储到数据库中,或结合其他身份验证方式进一步增强API的安全性。
原文链接: https://blog.logrocket.com/understanding-api-key-authentication-node-js/