🔐 使用 Express、AWS Lambda 和 Dynamo DB 的登录后端

发布: (2025年12月20日 GMT+8 01:27)
7 min read
原文: Dev.to

Source: Dev.to

Puffer

一个强大且可扩展的后端 API,用于身份验证和用户管理,使用 Node.js 和 Express 构建。具备安全的登录/注册功能、基于角色的访问控制,并可无缝集成 AWS DynamoDB、Stripe 和 Brevo。

✨ 功能

  • 🔐 认证系统 – 使用 JWT 令牌的安全用户注册和登录
  • 👥 基于角色的访问控制 – 四层角色系统(用户、代理、管理员、超级管理员)
  • 🔒 密码安全 – 使用 Bcrypt 进行密码哈希以安全存储密码
  • 📊 DynamoDB 集成 – 使用 AWS DynamoDB 的 NoSQL 数据库操作
  • 💳 支付处理 – Stripe 集成用于支付处理
  • 📧 邮件服务 – Brevo 集成用于邮件通信
  • 🚀 无服务器准备 – 可部署为 AWS Lambda 函数
  • 🛡️ 安全中间件 – JWT 认证和授权中间件
  • 📝 输入验证 – 注册和登录端点的请求验证
  • 🏗️ MVC 架构 – 使用模型、视图和控制器实现关注点分离

🛠️ 技术栈

组件技术
运行时Node.js
框架Express.js
数据库AWS DynamoDB
身份验证JWT (JSON Web Tokens)
密码哈希bcryptjs
支付Stripe
电子邮件Brevo (formerly Sendinblue)
部署Serverless (AWS Lambda compatible)

📋 前置条件

  • Node.js (v14 或更高)
  • npm 或 yarn
  • AWS 账户(用于 DynamoDB)
  • Stripe 账户(用于支付处理)
  • Brevo 账户(用于电子邮件服务)

🚀 安装

1. 克隆仓库

git clone https://github.com/puffer-git/login-dynamo-db.git
cd login-dynamo-db

2. 安装依赖

npm install

3. 设置环境变量

在根目录创建一个 .env 文件,内容如下:

# Server Configuration
ENVIRONMENT=development
PORT=4000

# JWT Configuration
JWT_SECRET=your-super-secret-jwt-key-change-this-in-production
JWT_EXPIRES_IN=7d

# AWS DynamoDB Configuration
AWSREGION=us-east-1
AWSENDPOINT=https://dynamodb.us-east-1.amazonaws.com
AWSACCESSKEYID=your-aws-access-key-id
AWSSECRETKEY=your-aws-secret-access-key

# Stripe Configuration (optional)
STRIPE_SECRET_KEY=your-stripe-secret-key

# Brevo Configuration (optional)
BREVO_API_KEY=your-brevo-api-key

4. 创建 DynamoDB 表

创建一个名为 users 的 DynamoDB 表,要求如下:

  • 分区键(Partition Key): id(字符串)
  • 时间点恢复(Point‑in‑time recovery): 已启用(生产环境推荐)

🏃 运行应用程序

开发模式

npm run dev

服务器在 http://localhost:4000 启动,并启用自动重新加载。

生产模式

npm start

无服务器部署

ENVIRONMENT=production 时,应用程序导出一个适用于 AWS Lambda 部署的无服务器处理程序。

📚 API 文档

基础 URL

  • 开发环境:http://localhost:4000
  • 生产环境:您部署的端点

认证端点

注册新用户

POST /auth/signup
Content-Type: application/json

{
  "player_name": "johndoe",
  "email": "john@example.com",
  "password": "securePassword123",
  "name": "John Doe"   // optional
}

响应 (201 Created)

{
  "success": true,
  "message": "User created successfully",
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
  }
}

错误响应

  • 409 Conflict – 玩家名称或邮箱已存在
  • 400 Bad Request – 验证错误
  • 500 Internal Server Error – 服务器错误

登录

POST /auth/login
Content-Type: application/json

{
  "identifier": "johndoe",   // 可以是 email 或 player_name
  "password": "securePassword123"
}

响应 (200 OK)

{
  "success": true,
  "message": "Login successful",
  "data": {
    "user": {
      "role": "user",
      "player_name": "johndoe",
      "email": "john@example.com",
      "name": "John Doe"
    },
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
  }
}

错误响应

  • 401 Unauthorized – 凭证无效
  • 400 Bad Request – 验证错误
  • 500 Internal Server Error – 服务器错误

认证请求头

对于受保护的路由,需要在 Authorization 头中携带 JWT token:

Authorization: Bearer <token>

🏗️ 项目结构

login-dynamo-db/
├── app/
│   ├── constants/
│   │   ├── roles.js          # Role definitions and hierarchy
│   │   └── tables.js         # DynamoDB table configurations
│   ├── controllers/
│   │   └── auth/
│   │       ├── login/
│   │       │   ├── login.js
│   │       │   └── loginValidation.js
│   │       └── signup/
│   │           ├── signup.js
│   │           └── signupValidation.js
│   ├── db/
│   │   ├── dynamoClient.js   # DynamoDB client configuration
│   │   └── index.js          # Database exports
│   ├── middleware/
│   │   └── auth.js
│   └── ... (other folders/files)
├── config/
│   └── ... (configuration files)
├── routes/
│   └── ... (route definitions)
├── services/
│   └── ... (business logic, e.g., Stripe, Brevo)
├── tests/
│   └── ... (unit/integration tests)
├── .env.example
├── package.json
└── README.md

额外结构:

├── app/
│   ├── middleware/
│   │   └── auth.js               # Authentication & authorization middleware
│   ├── models/
│   │   ├── BaseModel.js           # Base model for DynamoDB operations
│   │   └── UserModel.js           # User model with business logic
│   ├── routes/
│   │   ├── auth.js                # Authentication routes
│   │   └── index.js               # Route aggregator
│   ├── utils/
│   │   └── userUtils.js           # User utility functions
│   └── index.js                   # Express app configuration
├── index.js                       # Application entry point
├── package.json
└── README.md

🔐 角色系统

The application supports a four‑tier role hierarchy:

  • USER – 基本用户角色(默认)
  • AGENT – 代理级权限
  • MASTER – 主人级权限
  • SUPER_ADMIN – 最高访问级别

Roles are checked using middleware:

  • authenticate – 验证 JWT 令牌
  • authorize(roles) – 检查用户是否拥有特定角色
  • requireMinimumRole(role) – 检查用户是否满足最低角色等级

🧪 开发

代码风格

  • 遵循现有的代码模式。
  • 使用有意义的变量和函数名。
  • 为函数添加 JSDoc 注释。
  • 保持函数专注且单一职责。

添加新功能

  1. 创建功能分支:

    git checkout -b feature/your-feature-name
  2. 遵循 MVC 架构:

    • Modelsapp/models/
    • Controllersapp/controllers/
    • Routesapp/routes/
    • Middlewareapp/middleware/
  3. 为用户输入添加验证。

  4. 编写清晰的错误信息。

  5. 彻底测试你的更改。

  6. 提交拉取请求。

🤝 贡献

欢迎贡献!请遵循以下步骤:

  1. Fork 仓库。

  2. 创建你的功能分支:

    git checkout -b feature/AmazingFeature
  3. 提交你的更改:

    git commit -m 'Add some AmazingFeature'
  4. 推送到该分支:

    git push origin feature/AmazingFeature
  5. 打开一个 Pull Request。

贡献指南

  • 编写清晰、易读的代码。
  • 为复杂的逻辑添加注释。
  • 遵循现有的代码结构。
  • 在提交前测试你的更改。
  • 如有需要,更新文档。

📝 许可证

本项目采用 MIT 许可证进行授权 – 有关详情,请参阅 LICENSE 文件。

📧 联系方式

开发者: Puffer

🙏 致谢

⭐️ 支持

如果您觉得此项目有帮助,请考虑给它点个星!

Back to Blog

相关文章

阅读更多 »

仓库利用的权威指南

引言 仓库本质上只是一个 3‑D 盒子。利用率只是衡量你实际使用了该盒子多少的指标。虽然物流 c...