如何在Firebase Phone Authentication中自定义短信验证模板?
自定义Firebase Phone Authentication短信模板的方法
一、通过Firebase控制台修改基础模板(仅支持官方占位符)
这是官方提供的基础自定义路径,操作步骤如下:
- 登录Firebase控制台并进入目标项目
- 左侧菜单选择Authentication,切换到Sign-in method标签页
- 找到Phone认证方式,点击右侧的编辑按钮
- 滚动到SMS template区域,可修改短信内容,但仅能使用官方指定的两个占位符:
%LOGIN_CODE%:自动替换为系统生成的验证码%APP_NAME%:自动替换为你的Firebase项目名称
- 修改完成后点击保存即可生效
注意:此方式无法添加自定义变量,仅能基于官方占位符调整话术。
二、用云函数+自定义逻辑实现个性化模板(支持自定义内容)
如果需要加入应用专属信息(如用户昵称、业务标识等),需通过云函数接管短信发送流程,具体步骤如下:
1. 关闭Firebase自动短信发送
在Firebase控制台的Phone认证设置中,关闭默认的自动短信发送逻辑,避免与自定义流程冲突。
2. 部署云函数生成验证码并发送自定义短信
先初始化云函数项目,再编写如下示例代码:
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); // 云函数:生成验证码并发送自定义短信 exports.sendCustomVerificationSms = functions.https.onCall(async (data, context) => { const phoneNumber = data.phoneNumber; const userCustomData = data.userCustomData; // 传入自定义信息,如用户昵称 // 生成6位随机验证码 const verificationCode = Math.floor(100000 + Math.random() * 900000).toString(); // 将验证码存入实时数据库,设置5分钟过期时间 await admin.database().ref(`verificationCodes/${phoneNumber}`).set({ code: verificationCode, expiresAt: Date.now() + 5 * 60 * 1000 }); // 构造个性化短信内容,可自由加入自定义信息 const smsContent = `您好${userCustomData.nickname},您的XX应用登录验证码是:${verificationCode}。请在5分钟内完成验证,请勿泄露给他人。`; // 调用第三方短信服务商API发送短信(示例用Twilio,需提前配置密钥) const twilio = require("twilio"); const client = twilio(functions.config().twilio.sid, functions.config().twilio.token); await client.messages.create({ body: smsContent, from: functions.config().twilio.phoneNumber, to: phoneNumber }); return { success: true, message: "验证码已发送" }; });
3. 前端调用云函数触发短信发送
前端不再调用Firebase原生的signInWithPhoneNumber,改为调用自定义云函数:
// 前端示例代码 const sendVerificationCode = async (phoneNumber, userNickname) => { const sendCustomSms = firebase.functions().httpsCallable('sendCustomVerificationSms'); const result = await sendCustomSms({ phoneNumber: phoneNumber, userCustomData: { nickname: userNickname } }); console.log(result.data); };
4. 验证用户输入的验证码
前端获取用户输入的验证码后,查询数据库验证有效性:
const verifyCode = async (phoneNumber, inputCode) => { const codeRef = firebase.database().ref(`verificationCodes/${phoneNumber}`); const snapshot = await codeRef.once('value'); const storedData = snapshot.val(); if (!storedData || storedData.code !== inputCode || storedData.expiresAt < Date.now()) { return { valid: false, message: "验证码无效或已过期" }; } // 验证通过后,可生成自定义令牌完成Firebase登录 // const customToken = await admin.auth().createCustomToken(uid); // 清理已使用的验证码 await codeRef.remove(); return { valid: true, message: "验证成功" }; };
注意事项
- 自定义方式需自行对接第三方短信服务商,Firebase不再承担短信发送职责
- 需做好验证码的存储安全,设置合理过期时间,验证后及时删除记录
- 确保云函数的权限配置正确,防止未授权调用
内容的提问来源于stack exchange,提问作者shatlyk-jr
相关产品推荐
相关产品推荐

