Supabase+Next.js谷歌登录后更新手机号失败,OTP验证无效求助
问题分析与解决方案
你的问题核心在于对Supabase Auth更新手机号的流程理解有误:调用updateUser({phone: ...})只是发起手机号验证流程,并不会直接将手机号写入auth用户表,必须完成OTP验证步骤后,手机号才会被正式更新并持久化。
正确的手机号验证与更新流程
- 发起验证请求:用户输入手机号后,调用
updateUser触发OTP发送(这一步你已经实现,但只是流程的第一步) - 完成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
相关产品推荐
相关产品推荐

