深入理解Node.js中的API密钥认证 - LogRocket博客

作者:API传播员 · 2025-12-27 · 阅读时间:5分钟

使用Node.jsJSON Web令牌、OAuthAPI密钥等。在本文中,我们将深入探讨如何在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/