从零开始构建属于你的API网关 | 作者:Robby Nasution

作者:API传播员 · 2025-11-25 · 阅读时间:4分钟
本文详细介绍了如何使用Node.js和Express从零开始构建一个API网关,作为微服务的入口点,实现基本身份验证、请求转发、响应头修改和监控功能。通过bcrypt哈希处理basic_auth令牌、YAML配置文件定义端点,以及OWASP安全头部标准,帮助开发者构建安全的微服务网关。

使用 Node.js 和 Express 构建属于你的 API 网关

API 网关是整个内部 API 或服务的入口点。当客户端向系统发送请求时,他们并不会直接与单个服务交互,而是通过 API 网关转发请求到目标服务。在此过程中,网关会执行一系列任务,例如身份验证、有效载荷验证、分析,以及对请求头或有效载荷的转换。

本文将带你构建一个简单的 API 网关,作为微服务的入口点。该网关将实现以下功能:

  • 基本身份验证
  • 监控
  • 响应头修改
  • 请求转发

API 网关的设计架构

客户端的每个请求都需要携带用于访问微服务资源的基本身份验证密钥(Basic Auth Key)。网关会解析请求并验证令牌的有效性。一旦验证通过,网关会使用自己的签名将请求转发至目标服务。目标服务通过网关的签名识别请求,并仅允许私密访问。

以下是实现该网关所需的依赖项:

"dependencies": {
  "axios": "^0.19.1", // 用于转发请求的适配器
  "bcrypt": "^3.0.7", // 用于对消费者的基本身份验证进行哈希处理
  "bluebird": "^3.7.2", // 可选,用于异步处理 Redis
  "body-parser": "^1.19.0",
  "cors": "^2.8.5", // 用于启用跨域资源共享
  "express": "^4.17.1",
  "jsonwebtoken": "^8.5.1", // 用于网关签名的 JWT
  "mongoose": "^5.8.7",
  "morgan": "^1.9.1", // 可选,用于开发日志
  "redis": "^2.8.0", // 用作缓存数据库
  "yaml": "^1.7.2" // 用于读取配置文件
}

你可以通过以下命令安装这些依赖项:

npm install express axios body-parser bluebird cors jsonwebtoken morgan redis yaml bcrypt --save

基本身份验证

在本示例中,用户需要提供一个用于访问网关的 basic_auth 令牌。该令牌由用户密码生成,并通过 bcrypt 进行哈希处理。在请求进一步处理之前,网关会验证该令牌的有效性。验证过程会将令牌与消费者数据库中的记录进行匹配。

当然,你也可以根据需求实现更复杂的验证逻辑,例如在网关中集成 OAuth2。


配置文件

网关的配置文件采用 YAML 格式,用于定义端点和请求规则。我们使用 yaml 包来读取该文件。配置文件中包含了消费者请求的关键信息,例如完整路径和重要参数。你还可以在端点部分添加更多方法,例如 PATCH 方法。


请求解析器

通过基本身份验证后,网关会解析请求并读取配置文件,以匹配服务配置。网关会验证请求的端点和方法是否有效,确保目标服务中存在对应的路由。

如果请求无误,网关会将其转发至目标服务。同时,网关会记录日志,包括 IP 地址、请求的服务和路径等信息。以下是解析请求的代码示例:

// 示例代码

你可以根据需求扩展日志记录的内容,例如通过修改 Mongoose 模式添加更多详细信息。


请求转发

一旦请求通过验证并解析完成,网关会将其转发至目标服务。以下是转发请求的代码示例:

// 示例代码

安全的 HTTP 响应头

在网关向消费者返回响应之前,会根据 OWASP 的安全头部标准添加一些安全头部。此外,为了增强安全性,网关会避免缓存令牌。


总结

本文介绍了如何使用 Node.js 和 Express 构建一个简单的 API 网关。该网关实现了基本身份验证、请求转发、响应头修改等功能。尽管目前的实现还较为基础,但未来可以进一步扩展,使其更强大、更安全。

感谢你花时间阅读本文,希望对你有所帮助!

原文链接: https://medium.com/@robbybellamy6/build-your-own-api-gateway-from-scratch-e799549612ee