现代化 Web 验证与卡密授权系统,提供用户自助中心、开发者控制台、管理员后台、客户端 HMAC 验证 API 和内置 API 文档站点。
- 全面移除旧机器人通道,统一使用自写 Web + JWT 身份认证。
- User/Admin/Developer 均采用 access token + refresh token 轮换。
- 用户自助敏感接口必须携带 Bearer Token,不能再仅凭用户名调用。
- 客户端 SDK 通道
/public/*使用 HMAC-SHA256、Nonce 和时间窗防篡改/防重放。 - 生产环境限制 CORS、启用安全响应头、强制配置
SECRET_KEY。 - 数据模型增加关键索引和唯一约束,提升查询与一致性。
- 内置
/docs文档网站和/api/openapi.jsonOpenAPI 规格。
pip install -r requirements.txt
python seed.py
python app.py访问:
- 首页:
http://127.0.0.1:5000/ - API 文档:
http://127.0.0.1:5000/docs - 管理员:
http://127.0.0.1:5000/admin/login - 开发者:
http://127.0.0.1:5000/dev/login - 用户中心:
http://127.0.0.1:5000/user/dashboard
测试账号由 seed.py 创建:
| 角色 | 账号 | 密码 |
|---|---|---|
| 管理员 | admin |
admin12345 |
| 开发者 | dev_001 |
dev12345 |
| 用户 | testuser1 / testuser2 / testuser3 |
test123456 |
新密码策略要求 8 位以上;测试数据仍可登录,注册和改密会按新规则校验。
| 变量 | 默认值 | 说明 |
|---|---|---|
FLASK_ENV |
development |
production 时启用生产校验 |
SECRET_KEY |
dev-only-change-me |
JWT/Flask 密钥;生产必须设置 |
DATABASE_URL |
sqlite:///data.db |
SQLAlchemy 数据库连接 |
CORS_ORIGINS |
http://127.0.0.1:5000,http://localhost:5000 |
允许的前端来源,逗号分隔 |
JWT_ACCESS_EXPIRE |
900 |
access token 秒数 |
JWT_REFRESH_EXPIRE |
604800 |
refresh token 秒数 |
HMAC_TIME_WINDOW |
30 |
HMAC 请求时间窗 |
HMAC_NONCE_EXPIRE |
300 |
Nonce 防重放缓存时间 |
RATE_LIMIT_ENABLED |
true |
是否启用接口限流 |
RATE_LIMIT_DEFAULT_REQUESTS / RATE_LIMIT_DEFAULT_WINDOW |
300 / 60 |
普通接口限流次数/窗口秒数 |
RATE_LIMIT_AUTH_REQUESTS / RATE_LIMIT_AUTH_WINDOW |
20 / 300 |
登录和 refresh 限流次数/窗口秒数 |
RATE_LIMIT_2FA_REQUESTS / RATE_LIMIT_2FA_WINDOW |
8 / 300 |
2FA 验证限流次数/窗口秒数 |
RATE_LIMIT_REGISTRATION_REQUESTS / RATE_LIMIT_REGISTRATION_WINDOW |
5 / 3600 |
注册发码限流次数/窗口秒数 |
RATE_LIMIT_VERIFY_CODE_REQUESTS / RATE_LIMIT_VERIFY_CODE_WINDOW |
8 / 900 |
注册验证码确认限流次数/窗口秒数 |
RATE_LIMIT_PUBLIC_LOGIN_REQUESTS / RATE_LIMIT_PUBLIC_LOGIN_WINDOW |
60 / 60 |
Public 登录限流次数/窗口秒数 |
RATE_LIMIT_PUBLIC_HEARTBEAT_REQUESTS / RATE_LIMIT_PUBLIC_HEARTBEAT_WINDOW |
240 / 60 |
Public 心跳限流次数/窗口秒数 |
ACCOUNT_LOCK_MAX_ATTEMPTS |
5 |
单账号失败尝试达到该次数后临时管控 |
ACCOUNT_LOCK_WINDOW_SECONDS |
900 |
失败尝试统计窗口秒数 |
ACCOUNT_LOCK_DURATION_SECONDS |
900 |
临时管控持续秒数 |
MAIL_SERVER |
smtp.qq.com |
SMTP 服务器 |
MAIL_PORT |
587 |
SMTP 端口 |
MAIL_USERNAME |
空 | SMTP 用户 |
MAIL_PASSWORD |
空 | SMTP 授权码 |
MAIL_FROM_NAME |
WebAuth |
邮件发件显示名 |
这些接口面向客户端程序,需要 HMAC 请求头:
POST /public/login:客户端登录与 HWID 校验POST /public/heartbeat:心跳保活
请求头:
X-App-ID: <app_id>
X-Timestamp: <unix_seconds>
X-Nonce: <random_nonce>
X-Signature: HMAC_SHA256("timestamp:nonce:raw_body", app_secret)
POST /user/web_login:用户登录,返回 token pairPOST /user/refresh:刷新 tokenPOST /user/logout:登出并撤销 tokenGET /user/info:当前用户信息,需要 BearerPOST /user/pay_key:兑换卡密,需要 BearerPOST /user/reset_password:修改密码,需要 BearerPOST /user/reset_hwid:重置 HWID,需要 BearerPOST /user/register/POST /user/confirm_register:注册流程
POST /dev/login/POST /dev/refresh/POST /dev/logoutGET /dev/get_appPOST /dev/create_appPOST /dev/create_keyGET /dev/get_key_listGET /dev/groupsPOST /dev/create_groupPOST /dev/delete_groupPOST /dev/check_userPOST /dev/ban/POST /dev/unban
POST /admin/login/POST /admin/refresh/POST /admin/logoutGET /admin/get_statsGET /admin/get_all_usersPOST /admin/check_userPOST /admin/ban/POST /admin/unbanPOST /admin/reset_hwidPOST /admin/set_vip_levelGET /admin/get_all_appsPOST /admin/delete_appPOST /admin/create_keyGET /admin/get_key_listGET /admin/get_online_userGET /admin/get_devsPOST /admin/add_dev/POST /admin/delete_devGET /admin/get_audit_logs
- 设置强随机
SECRET_KEY,例如openssl rand -hex 32。 - 使用 HTTPS 反代,并在
FLASK_ENV=production下运行。 - 设置明确的
CORS_ORIGINS,不要使用通配符。 - 使用 PostgreSQL/MySQL 等生产数据库并配置
DATABASE_URL。 - 配置 SMTP,生产环境不会在邮件失败时生成可用测试验证码。
- 将
instance/data.db纳入备份与访问控制。
python -m compileall .
python seed.py
python app.py
python test_client.py