You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Supabase+Next.js谷歌登录后更新手机号失败,OTP验证无效求助

问题分析与解决方案

你的问题核心在于对Supabase Auth更新手机号的流程理解有误:调用updateUser({phone: ...})只是发起手机号验证流程,并不会直接将手机号写入auth用户表,必须完成OTP验证步骤后,手机号才会被正式更新并持久化。

正确的手机号验证与更新流程

  1. 发起验证请求:用户输入手机号后,调用updateUser触发OTP发送(这一步你已经实现,但只是流程的第一步)
  2. 完成OTP验证:用户收到OTP并输入后,调用verifyOtp方法完成验证,此时手机号才会真正更新到auth用户表中

修正后的代码示例

第一步:提交手机号触发OTP发送

// 用户输入手机号后执行
const { error: updateError } = await supabase.auth.updateUser({
  phone: mobile // 无需模板字符串,直接传入手机号变量即可
});

if (updateError) {
  console.error("发送OTP失败:", updateError);
  // 这里可以给用户展示错误提示,比如手机号格式不正确等
  return;
}

第二步:验证用户输入的OTP

// 用户输入OTP验证码后执行
const { data, error: verifyError } = await supabase.auth.verifyOtp({
  phone: mobile,
  token: userInputOtp, // 用户输入的OTP码
  type: "sms"
});

if (verifyError) {
  console.error("验证OTP失败:", verifyError);
  // 提示用户验证码错误或过期
  return;
}

// 验证成功后,auth用户表的手机号会更新,session中的用户信息也会同步
console.log("手机号验证成功,用户信息已更新:", data.user);

额外排查点

  • MessageBird配置检查:确认Supabase控制台中已正确配置MessageBird的API密钥、发送号码,且号码区域与用户手机号匹配,确保OTP能正常送达
  • 会话有效性:确保调用updateUser时用户处于已登录状态(session有效),未过期或被注销
  • 手机号格式:确认传入的手机号符合E.164格式(如+8613xxxxxxxxx),Supabase对手机号格式有严格要求,格式错误会导致验证流程异常

内容的提问来源于stack exchange,提问作者Lonare

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 23:40:10