基于微信公众号(未认证)验证码的OAuth认证服务系统,支持第三方应用统一身份认证,专为云函数环境优化。 采用腾讯元器进行中转授权,不改变原有公众号功能。
克隆项目
git clone <repository-url>
cd wechat-oauth-login
安装依赖
pnpm install
环境变量配置
cp .env.example .env.local
编辑 .env.local 文件:
# 管理员账号 (必填)
ADMIN_USERNAME=admin
ADMIN_PASSWORD=your_secure_password
# JWT密钥 (必填,至少32字符)
JWT_SECRET=your_jwt_secret_key_32_characters_minimum
# 应用基础URL (必填)
NEXT_PUBLIC_BASE_URL=https://your-domain.com
# 微信API安全密钥 (如需接收微信消息)
WECHAT_API_SECRET=your_api_secret
# KV数据库 (生产环境推荐)
KV_URL=your_kv_database_url
KV_REST_API_TOKEN=your_kv_token
启动开发服务器
pnpm dev
访问应用
# 检查 Node.js 版本
node --version # 应显示 v18.18.0 或更高
# 检查 npm 版本
npm --version # 应显示 8.0 或更高
# 安装 pnpm (如果未安装)
npm install -g pnpm
# 验证 pnpm 安装
pnpm --version # 应显示 8.0 或更高
# 清理缓存 (可选,解决依赖冲突)
pnpm cache clean
# 安装项目依赖
pnpm install
# 验证安装完成
pnpm list --depth=0
# === 必填配置 ===
ADMIN_USERNAME=admin
ADMIN_PASSWORD=123456
JWT_SECRET=your_32_character_secret_key_here_123456
NEXT_PUBLIC_BASE_URL=http://localhost:3000
# === 可选配置(开发环境) ===
# 验证码有效期 (秒)
CODE_EXPIRE_TIME=60
# 开发模式 (启用详细日志)
NODE_ENV=development
# === 必填配置 ===
ADMIN_USERNAME=admin
ADMIN_PASSWORD=your_secure_password_here
JWT_SECRET=your_jwt_secret_key_32_characters_minimum_length
NEXT_PUBLIC_BASE_URL=http://localhost:3000
# === 微信API配置 (仅需要API密钥) ===
WECHAT_API_SECRET=your_api_secret_key
# === 可选配置 ===
CODE_EXPIRE_TIME=60
NODE_ENV=development
# === 数据存储 (开发环境可不配置) ===
# KV_URL=your_kv_database_url
# KV_REST_API_TOKEN=your_kv_token
⚠️ 注意: 系统只使用 WECHAT_API_SECRET 来验证微信对接的腾讯元器回调请求,无需配置 WECHAT_APP_ID、WECHAT_APP_SECRET、WECHAT_TOKEN 等传统微信公众号参数。
# 1. 进入项目目录
cd wechat-oauth-login
# 2. 安装依赖 (首次运行)
pnpm install
# 3. 配置环境变量
cp .env.example .env.local
# 编辑 .env.local 文件
# 4. 启动开发服务器
pnpm dev
# 服务器启动成功后会显示:
# ▲ Next.js 14.x.x
# - Local: http://localhost:3000
# - ready started server on 0.0.0.0:3000
# 使用不同端口启动
pnpm dev -- -p 3001
# 启动并自动打开浏览器
pnpm dev -- --open
# 启动时显示更详细的日志
pnpm dev -- --debug
本项目专为云函数环境优化,支持一键部署到EdgeOne Pages:
构建应用
pnpm build:standalone
部署到EdgeOne
# 通过CNB自动部署
git push origin main
# 或手动部署
pnpm deploy:prepare
npx edgeone pages deploy deploy-package -n your-app-name -t $EDGEONE_API_TOKEN --function
# 安装Vercel CLI
npm i -g vercel
# 部署
vercel --prod
FROM node:20-alpine
WORKDIR /app
COPY . .
RUN npm install -g pnpm && pnpm install && pnpm build
EXPOSE 3000
CMD ["pnpm", "start"]
POST /api/auth/code - 生成验证码GET /api/auth/code?code={code} - 验证码状态查询POST /api/user/login - 用户登录获取JWTGET /api/oauth/authorize - OAuth授权页面POST /api/oauth/token - 获取访问令牌GET /api/oauth/callback - OAuth回调处理GET /api/admin/stats - 系统统计数据GET /api/admin/clients - OAuth客户端列表POST /api/admin/clients - 创建OAuth客户端GET /api/admin/history/* - 历史记录查询GET /api/health - 健康检查POST /api/wechat/message - 微信消息接收| 状态码 | 说明 | 常见原因 |
|---|---|---|
| 400 | 请求参数错误 | 缺少必填字段或参数格式错误 |
| 401 | 认证失败 | JWT token无效或已过期 |
| 403 | 权限不足 | 非管理员访问管理接口 |
| 500 | 服务器错误 | 系统异常或数据库连接失败 |
| 变量名 | 说明 | 示例值 |
|---|---|---|
ADMIN_USERNAME | 管理员用户名 | admin |
ADMIN_PASSWORD | 管理员密码 | secure_password_123 |
JWT_SECRET | JWT签名密钥(≥32字符) | your_jwt_secret_key_32_characters_minimum |
NEXT_PUBLIC_BASE_URL | 应用基础URL | https://your-domain.com |
| 变量名 | 说明 | 默认值 |
|---|---|---|
CODE_EXPIRE_TIME | 验证码有效期(秒) | 60 |
KV_URL | KV数据库连接URL | 未设置时使用本地存储 |
KV_REST_API_TOKEN | KV数据库访问token | - |
WECHAT_API_SECRET | 微信API安全密钥 | 开发环境可使用测试密钥 |
curl https://your-domain.com/api/health
返回系统状态、环境变量检查和依赖服务状态。
系统自动记录以下事件:
# 1. 健康检查 - 验证服务正常运行
curl http://localhost:3000/api/health
# 期望返回:
# {"status":"ok","timestamp":"2025-08-27T10:12:53.000Z","environment":"development"}
# 2. 登录页面访问
open http://localhost:3000/login
# 或在浏览器中访问 http://localhost:3000/login
# 3. 管理后台访问
open http://localhost:3000/admin
# 使用 .env.local 中配置的 ADMIN_USERNAME 和 ADMIN_PASSWORD 登录
# 1. 生成验证码 API 测试
curl -X POST http://localhost:3000/api/auth/code \
-H "Content-Type: application/json"
# 2. 管理员登录测试
curl -X POST http://localhost:3000/api/admin/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"your_password"}'
# 3. 环境变量检查 (调试用)
curl http://localhost:3000/api/debug/env
// 在浏览器控制台中检查认证状态
console.log('当前存储的Token:', localStorage.getItem('auth_token'));
// 检查页面加载状态
console.log('页面路径:', window.location.pathname);
console.log('环境变量:', process.env.NODE_ENV);
开发环境下,应用会在控制台输出详细日志:
# 启动开发服务器时观察日志
pnpm dev
# 查看以下关键日志:
# - "健康检查通过"
# - "用户认证成功"
# - "管理员登录成功"
# - "验证码生成: XXXXXX"
# - "微信消息处理完成"
# 查看本地数据存储文件
cat .kv-data.json | jq .
# 检查用户数据
grep -E "user:|wechat:" .kv-data.json
# 检查管理员数据
grep "admin:" .kv-data.json
问题1: "端口3000已被占用"
# 解决方案1: 使用其他端口
pnpm dev -- -p 3001
# 解决方案2: 杀死占用端口的进程 (macOS/Linux)
lsof -ti:3000 | xargs kill -9
# 解决方案3: Windows 下杀死进程
netstat -ano | findstr :3000
taskkill /pid <PID> /f
问题2: "JWT_SECRET 环境变量未设置"
# 检查环境变量文件
ls -la .env*
# 确保 .env.local 存在且包含必要配置
cat .env.local | grep JWT_SECRET
# 如果不存在,复制示例文件
cp .env.example .env.local
问题3: "依赖安装失败"
# 清理依赖和缓存
rm -rf node_modules package-lock.json pnpm-lock.yaml
pnpm cache clean
# 重新安装
pnpm install
# 如果依然失败,尝试使用 npm
npm install
问题1: "管理后台登录失败"
.env.local 中的 ADMIN_USERNAME 和 ADMIN_PASSWORD问题2: "验证码生成失败"
NEXT_PUBLIC_BASE_URL=http://localhost:3000CODE_EXPIRE_TIME 设置是否合理 (推荐60秒)问题3: "页面样式异常"
# 清理 Next.js 缓存
rm -rf .next
# 重新启动开发服务器
pnpm dev
.env.local 存储敏感配置.env.local 文件到版本控制.env.example 模板.kv-data.json 文件存储数据# 如果需要测试微信功能,需要:
# 1. 注册腾讯元器新建智能体并设置为工作流模式
# 2. 工作流新建http节点
# 3. http节点设置相关参数,api地址为:/api/wechat/message/ 参数详见welogin/src/app/api/CLAUDE.md
# 4. 在腾讯元器智能体授权微信公众号 webhook URL
# 启动开发服务器
pnpm dev
# 类型检查
pnpm type-check
# 代码检查
pnpm lint
GET /api/debug/env - 环境变量检查POST /api/debug/login - 简化登录测试GET /api/debug/user - 用户信息调试# API端点测试
curl -X POST http://localhost:3000/api/auth/code
# 管理员登录测试
curl -X POST http://localhost:3000/api/admin/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"your_password"}'
git checkout -b feature/amazing-feature)git commit -m 'Add some amazing feature')git push origin feature/amazing-feature)Q: 验证码生成失败?
A: 检查NEXT_PUBLIC_BASE_URL是否正确配置,确保可以从外网访问。
Q: 管理后台无法登录?
A: 确认ADMIN_USERNAME和ADMIN_PASSWORD环境变量设置正确,密码不要包含特殊字符。
Q: 微信消息无响应?
A: 检查WECHAT_API_SECRET是否与公众号后台配置一致,确认webhook URL可访问。
Q: 部署后KV存储错误?
A: 生产环境建议配置KV_URL,或确保云函数平台支持文件系统持久化。
Q: 本地启动时出现 "EADDRINUSE" 错误?
A: 端口3000被占用,使用 pnpm dev -- -p 3001 更换端口,或杀死占用端口的进程。
Q: 本地环境变量不生效?
A: 确保 .env.local 文件存在且格式正确,修改环境变量后需要重启开发服务器。
Q: 本地数据丢失?
A: 检查 .kv-data.json 文件是否存在,该文件包含所有本地数据,删除后数据会重置。
Q: 热重载不工作?
A: 清理 .next 缓存文件夹,重新启动开发服务器。
# 开发环境
tail -f logs/application.log
# 生产环境
# 查看云函数平台日志系统
本项目采用 MIT License 许可证。
⭐ 如果这个项目对你有帮助,请给它一个Star!
Made with ❤️ by Development Team