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

在Supabase自定义SMS服务商认证中遇OTP验证失败问题求助

解决自定义SMS OTP验证提示“验证码过期或无效”的排查方案
  • 检查验证码存储的一致性
    确认Edge Function生成的验证码和RPC函数存入数据库的是同一个值,注意是否有大小写、空格、截断问题。比如生成的是6位数字,存的时候是不是被转成了字符串或其他格式,验证时要保持类型一致。
    可以在Edge Function里加日志输出生成的验证码,在RPC函数里也加日志记录存入的值,对比两者是否完全匹配。

  • 验证过期时间逻辑
    检查RPC存储验证码时设置的过期时间是否正确,比如是否设置了NOW() + INTERVAL '5 minutes'这类合理的有效期,同时验证接口查询时是否正确判断了当前时间小于过期时间。
    注意数据库时区和Edge Function/Flutter应用的时区是否一致,时区偏差会导致误判过期。

  • 核对验证接口的查询条件
    确认验证OTP的RPC或查询逻辑,是否同时匹配了手机号、验证码,并且过滤了未过期、未被使用的记录。比如查询语句应该类似:

    SELECT * FROM otp_codes 
    WHERE phone = $1 AND code = $2 AND expires_at > NOW() AND used = false;
    

    如果漏了手机号匹配,可能会匹配到其他用户的过期验证码,导致错误提示。

  • 检查验证码使用状态的更新时机
    验证成功后要立即标记验证码为已使用(比如设置used = true),避免重复验证。如果验证逻辑里没更新状态,多次验证后可能因为之前的记录被标记为已使用(或其他原因)导致后续验证失败。

  • 排查Edge Function和RPC的执行顺序
    确认Edge Function是先生成验证码,再调用RPC存储,最后发送短信。如果存储步骤在发送之后,可能用户收到验证码时数据库还没存入,导致验证时查不到,触发无效提示。

  • Flutter端调用验证接口的参数正确性
    检查Flutter代码中传递给验证接口的手机号、验证码是否和发送时一致,比如手机号是否带国家码、是否有格式转换(如去掉空格、括号),验证码是否是用户输入的完整6位数字,没有被误处理成整数导致前导零丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:49:58