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

基于Python实现手机号OTP发送与验证的方案求助(含代码示例)

手机号OTP验证实现方案(支持Firebase/Twilio)

以下方案均满足每日50-100条短信的发送需求,附带可直接参考的Python代码:

一、Firebase Auth 短信OTP验证

前置准备

  1. 登录Firebase控制台,创建项目并启用「手机号/密码」认证方式
  2. 下载项目的服务账号密钥(JSON格式)
  3. 安装依赖:pip install firebase-admin

代码实现

1. 初始化Firebase Admin SDK

import firebase_admin
from firebase_admin import credentials
from firebase_admin import auth

# 替换为你的服务账号密钥路径
cred = credentials.Certificate("path/to/serviceAccountKey.json")
firebase_admin.initialize_app(cred)

2. 发送OTP短信

def send_firebase_otp(phone_number):
    try:
        # 手机号格式需带国际区号,比如+86138xxxxxxx
        auth.generate_phone_number_verification_code(phone_number)
        # Firebase会自动发送OTP短信,无需额外调用发送接口
        return {"status": "success", "message": "OTP已发送"}
    except Exception as e:
        return {"status": "error", "message": str(e)}

3. 验证OTP

def verify_firebase_otp(phone_number, otp_code):
    try:
        # 验证OTP有效性
        auth.verify_phone_number_verification_code(phone_number, otp_code)
        # 验证成功后可获取用户信息或生成自定义令牌
        user = auth.get_user_by_phone_number(phone_number)
        custom_token = auth.create_custom_token(user.uid)
        return {"status": "success", "custom_token": custom_token}
    except Exception as e:
        return {"status": "error", "message": str(e)}

二、Twilio 短信OTP验证

前置准备

  1. 注册Twilio账号,获取「Account SID」「Auth Token」和「Twilio手机号」
  2. 安装依赖:pip install twilio python-dotenv

代码实现

1. 配置Twilio客户端

from twilio.rest import Client
import random
import os
from dotenv import load_dotenv

load_dotenv()  # 从.env文件加载配置

# 替换为你的Twilio凭证
account_sid = os.getenv("TWILIO_ACCOUNT_SID")
auth_token = os.getenv("TWILIO_AUTH_TOKEN")
twilio_phone = os.getenv("TWILIO_PHONE_NUMBER")

client = Client(account_sid, auth_token)

2. 生成并发送OTP

# 模拟存储OTP(实际项目建议用数据库/Redis)
otp_storage = {}

def generate_otp():
    return str(random.randint(100000, 999999))

def send_twilio_otp(phone_number):
    otp_code = generate_otp()
    try:
        message = client.messages.create(
            body=f"你的验证码是:{otp_code},5分钟内有效",
            from_=twilio_phone,
            to=phone_number  # 格式需带国际区号,比如+86138xxxxxxx
        )
        # 存储OTP及过期时间(需自行实现过期逻辑)
        otp_storage[phone_number] = {"otp": otp_code, "expires_at": ...}
        return {"status": "success", "message_sid": message.sid}
    except Exception as e:
        return {"status": "error", "message": str(e)}

3. 验证OTP

def verify_twilio_otp(phone_number, otp_code):
    stored_otp = otp_storage.get(phone_number)
    if not stored_otp:
        return {"status": "error", "message": "未找到该手机号的OTP记录"}
    # 检查OTP是否过期(需自行实现过期时间判断)
    if stored_otp["otp"] == otp_code:
        del otp_storage[phone_number]  # 验证成功后删除OTP
        return {"status": "success", "message": "验证通过"}
    else:
        return {"status": "error", "message": "验证码错误"}

方案选择建议

  • Firebase Auth:适合已经使用Firebase生态的项目,免费额度足以覆盖每日50-100条短信,无需自行管理OTP存储和发送逻辑
  • Twilio:适合需要自定义短信内容、OTP规则的场景,付费方式灵活,支持全球手机号覆盖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:52:36