如何在Supabase Python库中实现邮箱OTP的verify_otp验证?
Flask后端结合Supabase实现邮箱OTP验证的正确方式
你的核心问题在于verify_otp调用时的type参数配置错误,以及异常处理的针对性不足。以下是修正后的完整实现:
正确的Verify OTP路由实现
from supabase import AuthError # 导入Supabase专用认证错误类 @stylist_bp.route('/verify-otp', methods=['POST']) def verify_otp(): data = request.get_json() email = data.get('email') otp = data.get('otp') if not email or not otp: return jsonify({'error': '邮箱和OTP验证码不能为空'}), 400 try: # 关键修正:type参数使用'signup'而非'email' verify_response = supabase.auth.verify_otp({ 'email': email, 'token': otp, 'type': 'signup' # 必须与生成OTP时的认证类型严格匹配 }) # 提取核心会话信息返回给前端,用于后续接口鉴权 session = verify_response.data.session return jsonify({ 'message': 'OTP验证成功', 'session': { 'access_token': session.access_token, 'refresh_token': session.refresh_token, 'user_id': session.user.id } }), 200 except AuthError as e: # 精准捕获Supabase认证类错误,比如OTP无效、过期、不匹配 return jsonify({'error': e.message}), 401 except Exception as e: # 兜底处理其他未知异常 return jsonify({'error': str(e)}), 500
关键参数说明
type: 'signup':这个值必须和你生成OTP时调用的接口类型完全匹配。如果是注册场景发送的验证码,就用signup;如果是魔法登录链接用magiclink,密码恢复用recovery,以此类推。email:用户提交的邮箱,必须和接收OTP的邮箱完全一致。token:用户输入的6位OTP验证码。
生成OTP时的对应要求
确保你的send-otp路由是注册场景的逻辑,示例参考:
@stylist_bp.route('/send-otp', methods=['POST']) def send_otp(): data = request.get_json() email = data.get('email') try: # 发送注册用OTP,密码设为占位值(邮箱OTP注册无需真实密码) supabase.auth.sign_up({ 'email': email, 'password': 'temp-placeholder' }) return jsonify({'message': 'OTP验证码已发送至你的邮箱'}), 200 except AuthError as e: return jsonify({'error': e.message}), 400
若你是调用
send_otp方法发送验证码,同样要指定type='signup',保证前后类型统一。
内容的提问来源于stack exchange,提问作者Ayo
相关产品推荐
相关产品推荐

