为什么我不建议一开始就做用户系统?

我做过的第一个站,前两周几乎全花在注册登录上:密码哈希、邮箱验证链接、找回密码、会话过期、退出登录。上线三个月后,注册用户 12 个,其中 8 个是我自己的测试号。那套代码后来删了,但那两周没还给我。

一套"能用"的账号,最少拖出五个你没打算做的东西

注册表单只是露出水面的那一角。水面下是:密码不能以明文存(bcrypt 或 argon2,迭代次数还要随机器性能调);邮箱验证要发信,就得接邮件服务、处理退信、处理被判成垃圾邮件;找回密码要签发一次性 token 并设过期时间;会话要管过期、要能踢下线、要考虑多设备;最后还有注销与数据删除——在个人信息保护的要求下,这不是可选项。

每一项都不难,但每一项都要测试、要打日志、要防滥用。注册接口上线几周内通常就会有人来刷,你得配验证码或速率限制,而在有反向代理的部署里,速率限制还得先正确拿到真实客户端 IP,否则拦的是代理自己。

10015.io 没有账号,不是因为懒

Fatih Telis 的 10015.io 有 50 多个工具,几乎所有工具都在客户端运行,极少请求服务端。既然结果不出浏览器,服务端就没有任何属于用户的状态需要保存。没有状态,账号系统就失去了一半的存在理由。

10015.io 官网首页截图
10015.io 官网首页截图

10015.io 首页的插画里,电脑屏幕上浮着一个带 Aa 图标的文档窗口。

TinyWow 是同一条路的更极端版本:250 多个工具全部免注册,并且明说上传的文件 1 小时后自动删除。免注册在这里不只是"体验好",它是这个承诺在技术上的前提。如果每个用户都要登录、每个文件都要关联账号,"1 小时后删除"就变成一句需要额外工程去兑现的承诺;没有账号,删除只是一个定时任务扫临时目录。

10015.io 用浏览器扩展代替了账号

没有账号系统,就有个绕不开的问题:用户怎么记住你,你怎么知道他回来过。

10015.io 的答案是做浏览器扩展——Chrome 和 Firefox 各一个。扩展装在浏览器里,是一个常驻的入口,用户点一下就能打开工具,不需要注册,也不需要记住域名。对工具站来说,这比账号更贴合使用场景:用户要的不是一个"身份",是一个"随时能打开的入口"。

TinyWow 走的是另一条路,但效果可以互相印证:它的流量里约 47% 是直接访问,搜索只占三分之一左右。将近一半的人是敲域名或点书签进来的,而不是搜进来的。这个比例说明"被记住"这件事可以不靠账号实现——靠的是工具本身够好用、够急时能救场。

反过来看,账号系统在这件事上能提供的帮助其实很有限:注册用户在多数小工具站里的回访率,并不比书签高多少,而你为此要长期维护一整套认证。

Data Fetcher 把身份这件事外包给了宿主

Andy Cloak 的 Data Fetcher 是 Airtable 的一个扩展,MRR 23000 美元、600 个付费客户,整个公司在伦敦只有他一个人。他能一个人扛 600 个付费客户,一个重要原因是登录、权限、计费由 Airtable 平台承担——他写的是"取数据",不是"证明你是你"。

这是早期项目最划算的做法之一:找一个已经有用户系统的宿主平台(扩展、插件、应用市场),把身份外包出去。代价是遵守它的规则、分一部分收入,换来的是不用自己养一套认证,也不用为密码泄露担责。

真要做,先做最"轻"的那一级

不是所有场景都能躲开。用户要在两台设备上看到同一份结果,就必须有身份。但"有身份"和"有账号系统"之间差着好几个数量级。

最轻的一级是许可证 key。Cakedesk 是 Max Schmitt 一个人做的桌面端发票应用,Electron + React + Node.js,一次性 69 欧元不订阅,2024 年卖出约 170 份,2025 年 239 份新授权。校验一个 key 有没有被用过的代码量,大概是一套找回密码流程的十分之一,而且它不需要存任何用户个人信息。

往上一级是"邮箱 + 魔法链接":没有密码,就没有密码泄露,也没有找回密码这一整套流程。

最后才是完整的账号中心。我给自己定的升级触发条件只有一个:出现了必须由服务端记住、且用户愿意为它跨设备付费的状态。没到这一步,先别动。

判断要不要升级时,可以看一眼存储层——一旦有了账号,用户表、会话表、权限表就得跟主业务库放在一起,SQLite 这种单文件方案在这个阶段依然够用,但它意味着你要开始认真对待备份,而备份在容器化部署里是个容易做错的活:数据库文件必须挂到持久化的 volume 上,否则 Docker 重建一次容器,用户就没了。

还有一个常被低估的连带责任:一旦你存了用户数据,它就进入了备份、迁移、权限审计的范围。忘了续域名的人不少,忘了给加密备份续期的人更多——而账号系统会把"备份失误"从一个小事故升级成一次需要通知用户的事故。这也是为什么我倾向于把这件事尽量往后推:不是永远不会做,是要等到有明确的业务理由,而不是因为"网站好像都该有个登录"。

一年以后,如果你的站还在靠"注册用户数"来证明自己活着,那多半是账号系统本身在消耗你,而不是用户。


Cakedesk 数据来自作者 Max Schmitt 的年度复盘;Data Fetcher 数据来自 Andy Cloak 在 Indie Hackers 的公开分享。