n1kFord/jwt-auth

GitHub: n1kFord/jwt-auth

基于 Express.js 5 构建的生产级 JWT 身份认证 API,提供双令牌机制、CSRF 防护及速率限制等完整安全与工程化方案。

Stars: 0 | Forks: 0

# 🔐 JWT 认证 API [![Node.js Version](https://img.shields.io/badge/node-%3E%3D20-brightgreen)](https://nodejs.org/) [![Express.js Version](https://img.shields.io/badge/express-5.x-blue)](https://expressjs.com/) [![MongoDB](https://img.shields.io/badge/mongodb-6.x-green)](https://www.mongodb.com/) [![Redis](https://img.shields.io/badge/redis-7.x-red)](https://redis.io/) [![License](https://img.shields.io/badge/license-MIT-green)](./LICENSE) [![Tests](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/1af821f77b224056.svg)](https://github.com/n1kFord/jwt-auth/actions/workflows/test.yml) [![Code Style](https://img.shields.io/badge/code_style-prettier-ff69b4)](https://prettier.io/) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen)](https://github.com/n1kFord/jwt-auth/pulls) ## ✨ 功能 - 🔑 **JWT Access & Refresh Tokens**,支持自动轮换 - 🛡️ **CSRF 保护**(Double Submit Cookie 模式) - 📦 **Redis** 用于持久化存储 refresh token - 🚦 **速率限制**,防止暴力破解攻击 - 🪵 **Winston + Morgan** 日志记录,带有 chalk 样式 - 🧪 使用 Jest & Supertest 的**全面测试套件** - ✅ 使用 **ESLint + Prettier** 保证代码质量 - 🐳 使用 **Docker Compose** 方便开发 ## 🛠️ 技术栈 - **运行时**:Node.js 20+ - **框架**:Express.js 5.x - **数据库**:MongoDB + Mongoose - **缓存**:Redis(refresh tokens) - **安全**:bcrypt, JWT, CSRF, 速率限制 - **日志**:Winston, Morgan, Chalk - **测试**:Jest + Supertest - **代码质量**:ESLint + Prettier ## 🚀 快速开始 ### 前置条件 - Node.js 20+ - Docker & Docker Compose ### 安装 ``` # 克隆 repository git clone https://github.com/n1kFord/jwt-auth.git cd jwt-auth # 安装 dependencies npm install # 复制 environment variables cp .env.example .env # 启动 MongoDB 和 Redis docker-compose up -d # 运行 development server npm run dev ``` ### 环境变量 ``` PORT=8080 MONGO_URI=mongodb://localhost:27017/authDB REDIS_CLIENT_URI=redis://localhost:6379 JWT_SECRET=your-jwt-secret JWT_REFRESH_SECRET=your-refresh-secret ``` ## 📁 项目结构 ``` jwt-auth/ ├── src/ │ ├── config/ # Configuration (DB, Redis, constants) │ ├── middlewares/ # Auth, CSRF, validation, logging │ ├── models/ # User model │ ├── routers/ # /auth and /me endpoints │ ├── store/ # Redis token storage │ ├── utils/ # Helpers (tokens, logger, hash, cookies) │ ├── __tests__/ # Jest tests │ └── index.js # Entry point ├── logs/ # Winston log files ├── docker-compose.yml ├── Dockerfile └── package.json ``` ## 📝 日志 - **Winston** — 带有日志级别(error, warn, info, debug)的文件 + 控制台日志记录 - **Morgan** — 与 Winston 集成的 HTTP 请求日志记录 - **Chalk** — 彩色控制台输出 ## 🎨 代码风格 ``` npm run lint # Check code style npm run format # Auto-format with Prettier ``` ## 🔌 API 端点 ### 认证 (`/auth`) | 方法 | 端点 | 描述 | CSRF | | ------ | ----------- | -------------- | ---- | | POST | `/register` | 注册用户 | ❌ | | POST | `/login` | 登录用户 | ❌ | | POST | `/refresh` | 刷新 token | ✅ | | POST | `/logout` | 退出登录 | ❌ | ### 用户 (`/me`) | 方法 | 端点 | 描述 | CSRF | | ------ | ------------------ | -------------- | ---- | | GET | `/` | 获取个人资料 | ❌ | | POST | `/change-email` | 修改邮箱 | ✅ | | POST | `/change-password` | 修改密码 | ✅ | | POST | `/change-username` | 修改用户名 | ✅ | | POST | `/change-bio` | 修改个人简介 | ✅ | | DELETE | `/` | 删除账户 | ✅ | ## 📝 示例 ### 注册 ``` curl -X POST http://localhost:8080/auth/register \ -H "Content-Type: application/json" \ -d '{"email":"user@example.com","password":"secret123","confirmPassword":"secret123"}' ``` ### 登录 ``` curl -X POST http://localhost:8080/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"user@example.com","password":"secret123"}' ``` ### 获取个人资料(带 CSRF) ``` curl -X GET http://localhost:8080/me/ \ -H "x-csrf-token: your-csrf-token" \ -H "Cookie: token=access-token; XSRF-TOKEN=csrf-token" ``` ## 🧪 测试 ``` npm test ``` ## 🐳 Docker ``` # 启动所有 services docker-compose up -d # 停止所有 services docker-compose down ``` ## 🔧 环境变量 | 变量 | 描述 | | -------------------- | --------------------------- | | `PORT` | 服务器端口(默认:8080) | | `MONGO_URI` | MongoDB 连接字符串 | | `REDIS_CLIENT_URI` | Redis 连接字符串 | | `JWT_SECRET` | access token 密钥 | | `JWT_REFRESH_SECRET` | refresh token 密钥 | ## 🛡️ 安全 - **JWT** 使用短有效期的 access token(15分钟)和长有效期的 refresh token(7天) - **Token 轮换** — 每次刷新时生成新的 refresh token - **CSRF 保护** — Double Submit Cookie 模式 - **速率限制** — 全局 100 个请求/15分钟,10 次登录尝试 - **HTTP-only Cookie** — 防止 XSS 攻击 - 使用 **Bcrypt** 进行密码哈希处理 ## 📄 **许可证** 本项目基于 [MIT License](./LICENSE) 授权。 欢迎自由使用、修改和分发,请注明出处。 **⭐ 如果这个项目对您有帮助,请给本仓库点个 Star!**
标签:Express, GNU通用公共许可证, JWT, MITM代理, MongoDB, Node.js, Redis, Syscall, Web开发, 搜索引擎查询, 自定义脚本, 请求拦截