基于Python实现手机号OTP发送与验证的方案求助(含代码示例)
手机号OTP验证实现方案(支持Firebase/Twilio)
以下方案均满足每日50-100条短信的发送需求,附带可直接参考的Python代码:
一、Firebase Auth 短信OTP验证
前置准备
- 登录Firebase控制台,创建项目并启用「手机号/密码」认证方式
- 下载项目的服务账号密钥(JSON格式)
- 安装依赖:
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验证
前置准备
- 注册Twilio账号,获取「Account SID」「Auth Token」和「Twilio手机号」
- 安装依赖:
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
相关产品推荐
相关产品推荐

