🔐 使用 Express、AWS Lambda 和 Dynamo DB 的登录后端
Source: Dev.to
一个强大且可扩展的后端 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 注释。
- 保持函数专注且单一职责。
添加新功能
-
创建功能分支:
git checkout -b feature/your-feature-name -
遵循 MVC 架构:
- Models →
app/models/ - Controllers →
app/controllers/ - Routes →
app/routes/ - Middleware →
app/middleware/
- Models →
-
为用户输入添加验证。
-
编写清晰的错误信息。
-
彻底测试你的更改。
-
提交拉取请求。
🤝 贡献
欢迎贡献!请遵循以下步骤:
-
Fork 仓库。
-
创建你的功能分支:
git checkout -b feature/AmazingFeature -
提交你的更改:
git commit -m 'Add some AmazingFeature' -
推送到该分支:
git push origin feature/AmazingFeature -
打开一个 Pull Request。
贡献指南
- 编写清晰、易读的代码。
- 为复杂的逻辑添加注释。
- 遵循现有的代码结构。
- 在提交前测试你的更改。
- 如有需要,更新文档。
📝 许可证
本项目采用 MIT 许可证进行授权 – 有关详情,请参阅 LICENSE 文件。
📧 联系方式
开发者: Puffer
🙏 致谢
- 使用 Express.js 构建
- 数据库由 AWS DynamoDB 提供支持
- 支付处理由 Stripe 完成
- 邮件服务由 Brevo 提供
⭐️ 支持
如果您觉得此项目有帮助,请考虑给它点个星!
