哈罗大家好,我是【考拉搞AI】,十年老登转型全栈AI 的 全栈AI程序员。
上篇文章介绍了
backend-generate-skill:一句话生成后端骨架,搞定选型、目录、配置、接口契约。
但骨架只是房子的框架,里面还没有人。绝大多数后端项目,第一个要写的业务模块都是同一个——用户系统:注册、登录、JWT 鉴权、短信验证码、找回密码、个人资料。
接下来,我将继续结合我的亲身实战经验,将这座大厦所有需要的部件拆解揉碎,然后像搭积木一样,将具体的业务模块一个个拼接上去。从专业角度上将这叫做业务拆分解耦。
熟悉后端的童鞋们都知道,后端存在着多个耳熟能详的业务模块,比如一套电商系统,就会拆成
用户系统、订单系统、商品系统、购物车系统、物流系统、促销系统以及短信&消息系统等等,每个系统之间相互独立却又密不可分,彼此可以通过消息系统来对接,既达到了解耦大大提升了系统性能,也能提高项目的可维护度。
AI 时代 我们需要拆分,而不是直接跟AI 说:“我要做一套淘宝商城系统,要XXX,给我搞定”。这样AI 必然会放飞自我,最终落地的东西必然是 “东拼西凑”“东一榔头西一棒槌”,即使能用,也需要大量的时间去维护完善,费时费力不讨好。
可是AI 时代,该怎么做业务拆分呢?
这就是今天的重头戏——
从业务的角度将不同的模块划分,然后用标准的SKILL来完成用户&登录&鉴权模块的搭建。
用户&登录&鉴权模块,基本就那些核心内容,特殊内容较少,那么我们就可以将其拆解揉碎,落地成
SKILL,用标准的 规范让AI 生成。避免每次跟AI 拉扯,也避免AI 彻底放飞自我。
废话不多说,开干。
一、它做什么
auth-skill是一个用户系统生成器。一句话触发,产出四样东西:
领域模型与表结构 DDL:标准用户表、refresh token 表、第三方绑定表(按需裁剪);
接口契约增量:完整的接口文档,组合模式下追加进项目的
api-contract.md,前端可以直接拿去对接;可运行实现:Java / Go / Python / Node 四种技术栈任选,含短信发送、图形验证码、微信登录;
环境变量清单:JWT 密钥、阿里云短信、微信 appid 等,全部走 env,不写死在代码里。
覆盖的功能范围:
模块 | 内容 |
|---|---|
注册 | 开放注册 / 仅后台创建 / 邀请制,手机号唯一约束防重 |
登录 | 账号密码、短信验证码(默认阿里云)、uniapp 微信小程序(code→openid,可选解析手机号)、第三方 oauth |
令牌 | JWT access + refresh 双令牌,refresh 哈希存储 + 轮换 + 重放检测 |
密码找回 | 短信验证码重置,重置后吊销全部令牌强制重登 |
图形验证码 | 算术题 SVG,无第三方图片库依赖,作用于密码登录和发短信 |
资料管理 | 资料读写、凭旧密码改密(吊销其他设备)、换绑手机号(短信验证)、注销账号(二次确认) |
用户 ID 默认自增 BIGINT,MongoDB 用默认 ObjectId;有防枚举、多实例需求时可选 UUIDv7 / 雪花 / 内外双 ID。
二、安装与使用
老地址 不用多说:
git地址https://github.com/jiushiwon/wg-skills/tree/main/module-generate-skill/auth-skill
一天一个SKILL——前端最佳自动化测试 webapp-testing
模式 | 场景 | 技术栈来源 |
|---|---|---|
组合模式 | 项目已有骨架(比如刚用 backend-generate-skill 生成过) | 读 |
独立模式 | 只要登录模块,还没有骨架 | 现场选型(规则与 backend-generate-skill 一致),生成最小可运行骨架 + 全新的 |
组合模式是它的主场:骨架生成完,接着说「加登录」,用户系统直接长在骨架上,信封、错误码、JWT 工具沿用已有规范,不重复生成。
三、生成前会问什么
技能不会替你瞎猜业务边界,生成前有一张确认清单,每项都有默认值:
登录形态:常规 / uniapp 小程序 / 两者都要(默认常规)
登录方式:账号密码 / 短信验证码(默认两者都要)
短信供应商:默认阿里云(Dysmsapi),密钥走 env
图形验证码:默认关,勾选才开
密码找回:默认开
令牌模式:默认 access + refresh 双令牌(access 2h,refresh 30d 滑动续期)
uniapp 身份标识:仅 openid / 解析手机号(企业级),二选一必须确认
没有特殊要求的话一路默认就行,生成的就是一个标准的用户系统。
四、安全红线
这个SKILL的核心价值不在"省了多少代码",而在于把登录鉴权里容易踩的坑固化成了 16 条模块红线,生成即遵守:
密码必须 bcrypt(cost ≥ 10),禁止 MD5/SHA 裸哈希、禁止明文;
短信验证码用 CSPRNG 生成(禁
random),6 位、5 分钟过期、一次性、60s 防重发、每日每号上限 10 次,按场景分键(登录和找回互不串用);refresh token 不落明文:DB 只存 SHA-256 哈希,轮换时旧令牌立即作废,检测到重放可连带吊销该用户全部令牌;
登录失败统一文案"账号或密码错误",禁止区分"用户不存在"与"密码错误"(防枚举),连续失败 5 次锁定 15 分钟;
找回密码不泄露手机号是否已注册:未注册号同样占限流配额,统一返回成功,否则可凭响应差异枚举手机号;
JWT payload 只放 sub / jti / exp,不放角色权限等可变数据;
微信登录:appid/secret 走环境变量,code→openid 走微信
jscode2session,session_key 不落库、不下发前端,禁止前端传明文手机号冒充;所有密钥(JWT、阿里云 AccessKey、短信签名模板、微信密钥)一律走环境变量,禁止入库或硬编码。
这些规则每一条背后都是真实的事故类型。与其指望每次开发都记得,不如让生成器默认就是对的。
五、边界
SKILL好用的一半原因是它知道自己的边界:
不实现权限系统。角色、权限、RBAC 一律不做,
wg_user表不开任何权限列,只留一个「当前用户注入」的扩展点——权限交给下游的org-permission-skill。职责单一,才不会长成又一个什么都有、什么都改不动的用户中心。不实现 SSO / OAuth2 服务端。第三方登录只做客户端模式:后端拿前端传来的 code 向第三方换 openid。
不复制已有规范。响应信封、错误码、JWT 工具由 backend-convention-skill 定义,本模块只引用不照抄。
六、使用示例
没有斜杠命令,不用记参数,自然语言触发:
帮我加一个用户系统(登录 + 注册 + 资料管理) 现有 FastAPI 项目里加手机号验证码登录,要双令牌 做一个 auth 模块,账号密码 + 短信登录,开图形验证码和密码找回 帮我做个 uniapp 微信小程序登录,要能解析手机号 加个人资料页:修改密码、换绑手机号、注销账号交付标准是:可运行代码 +api-contract.md接口文档同时交付,缺一则视为未完成。生成的代码可以直接跑,接口文档可以直接给前端。
下面是实测案例,非常的奈斯高效(java为例):
最终结果,清晰可见、注释完整、规范标准,并且有数据库初始化文件,用起来非常的奈斯。
具体细节 和 其他 语言框架就不多介绍了,小伙伴们可以尝试下。
七、和其他 SKILL 的关系
auth-skill不是孤立的,它在整套后端 Skill 里的位置:
上游依赖
backend-convention-skill(规范)和database-skill(数据库选型);短信通道默认用内置的最小阿里云实现,检测到项目已接入
notification-skill时委托给它,不重复实现;下游是
org-permission-skill(权限)和ai-chat-skill(AI 对话),它们依赖本模块的用户表和当前用户注入。
骨架、用户、权限、通知、AI 对话,各管一段,按需组合。
八、小结
AI 时代,写前端项目很简单,写一个简单Demo后端项目也很简单,但是要前后端对接、合理选择语言与框架以及数据库设计就相对麻烦了。本SKILL 就是解决这类问题的,当然只是一个项目的第一步。
但千万不可小瞧这一第一步,对于复杂大型项目来说,一个安全稳定可靠的鉴权系统可是整个系统稳定和可靠的前提!
接下来我还会继续拆解具体的业务场景,比如 ERP 中权限组织架构模块、电商支付模块、消息中间件模块、日志模块、生产级链路追踪模块以及与AI对接模块等等,这些都根据博主自身多年的实战案例而研究得出,讲究的就是具有实际性和可用性,让小伙伴们VibeCoding开发大型项目的时候,不再是没做好业务拆分,导致 “一锅大杂烩”而无法维护!
对这些方面有需求的或者正常往这方面思考的童鞋们千万不要错过。
如果使用起来有问题或者对某个模块不清楚的欢迎评论,喜欢的童鞋点赞+关注,后续还会更多硬核实战内容分享!
一天一个 Skill——一句话生成后端骨架 Java/Python/Nodejs/Go + MySQL/MongoDB/PostgreSQL
【VibeCoding系列】从0 到1 全面用AI 手搓一个 uniapp 全栈小程序
一天一个SKILL——上下文溢出问题的解决妙招 实时计划文档 planning-with-files
一天一个SKILL——一句话生成uniapp小程序标准化骨架
Claude Code Hooks:六大案例从原理源码到工程级自动化落地(彻底根治 AI 编程失控)