这是一个最小可行测试项目:
- 前端:原生 HTML + TypeScript
- 认证:Firebase Web SDK(邮箱密码 + 手机短信)
- 部署:Cloudflare Pages 静态站
在 Firebase Console 中完成以下配置:
- Authentication -> Sign-in method -> 启用
Phone和Email/Password。 - Authentication -> Settings -> Authorized domains 添加:
localhost- 你的 Pages 域名(例如
your-project.pages.dev)
- 建议先配置测试手机号(Authentication -> Sign-in method -> Phone -> Phone numbers for testing)。
pnpm install
pnpm build
pnpm preview打开:http://127.0.0.1:8788
如需监听 TypeScript 变更:
pnpm dev注意:
pnpm dev只监听 TS 构建;如修改index.html或src/styles.css,请重新执行一次pnpm build。
方式 A:Pages 绑定 Git 仓库
- 在 Cloudflare Pages 创建项目并连接仓库。
- Build command 填:
pnpm build - Build output directory 填:
dist - 部署后,拿到
*.pages.dev域名并回填到 Firebase Authorized domains。
方式 B:手动部署
pnpm build
pnpm wrangler pages deploy dist --project-name <你的-pages-项目名>页面采用“邮箱登录 / 手机登录”两个标签页,不会同时展示两个表单。
- 输入邮箱与密码。
- 点击“邮箱登录(不存在则创建)”。
- 若邮箱账号存在则直接登录;不存在则自动创建并登录。
- 输入 E.164 手机号(例如
+8613800138000)。 - 点击“发送验证码”。
- 系统会自动进行人机验证(Invisible reCAPTCHA),通常无需手动点击。
- 输入短信验证码后点击“确认登录”。
- 页面结果区会显示登录成功后的
uid和phoneNumber。
本项目支持两种关联路径(都在前端实现):
- 邮箱账号 -> 关联手机号:先邮箱登录,再走手机验证码流程,内部使用
linkWithPhoneNumber。 - 手机号账号 -> 关联邮箱:先手机号登录,再点邮箱登录按钮,内部使用
linkWithCredential。
在执行关联前,页面会显示当前账号的 provider 列表(例如:手机号、邮箱密码),便于确认当前绑定状态。
Firebase 默认规则:
- 首次某方式登录:创建新用户。
- 后续同方式登录:登录到原有
uid。 - 跨方式关联后:邮箱和手机号都会指向同一个
uid。
在“只做登录认证”场景下,不需要在 Cloudflare 额外接数据库:
- 用户身份、手机号、邮箱、会话令牌由 Firebase Auth 管理。
- 静态前端部署在 Pages 即可。
建议在以下场景再引入数据库(如 D1 / Supabase / Firestore):
- 需要保存业务资料(会员信息、订单、配置、审计日志)。
- 需要基于
uid做业务数据读写。
-
reCAPTCHA key invalid:检查 Firebase 授权域名是否包含当前访问域名。 -
auth/invalid-phone-number:手机号格式必须是 E.164(以+开头)。 -
auth/too-many-requests:发送过于频繁,等待后重试。 -
部分地区号码不可用:先用 Firebase 测试手机号排查流程问题。
-
auth/operation-not-allowed:通常是未启用对应登录方式。- 到 Firebase Console -> Authentication -> Sign-in method。
- 确认
Phone已启用。 - 若当前代码使用邮箱+密码登录,请启用
Email/Password。 Email link (passwordless)只有在你实现了邮件链接登录流程时才需要启用。- 如果刚启用,等待 1-2 分钟后刷新页面再试。
-
Email/Password与Email link (passwordless)应该怎么选?- 你现在这版代码使用的是“邮箱+密码”模式,因此必须开启
Email/Password。 - 这里的“密码”是该邮箱账号在 Firebase Auth 里的登录密码(用户可注册/设置),不是 Cloudflare 或 Google 控制台密码。
- 如果你倾向无密码,我可以下一步把前端改成
sendSignInLinkToEmail的免密邮件链接登录流程,再只保留Email link (passwordless)。
- 你现在这版代码使用的是“邮箱+密码”模式,因此必须开启
已启用结算账号并完成 reCAPTCHA Enterprise 配置。