说一下手机验证码登录和数据库对比的python代码逻辑

not image

在实现**手机验证码登录**功能时,核心逻辑包括**验证码生成、存储、验证**三个步骤。以下是一个基于 Python 的示例实现,使用 Flask 框架和 MySQL 数据库,展示完整的验证码登录流程。 --- ## ✅ 一、数据库设计(MySQL) 我们需要一个表来存储验证码信息,包含以下字段: ```sql CREATE TABLE verification_codes ( id INT AUTO_INCREMENT PRIMARY KEY, phone_number VARCHAR(20) NOT NULL, code VARCHAR(6) NOT NULL, created_at DATETIME NOT NULL, expires_at DATETIME NOT NULL, is_used BOOLEAN DEFAULT FALSE ); ``` - `phone_number`: 用户手机号 - `code`: 6位验证码 - `created_at`: 验证码生成时间 - `expires_at`: 验证码过期时间(例如:5分钟后) - `is_used`: 是否已被使用 --- ## ✅ 二、验证码生成逻辑 验证码通常为 6 位数字,使用 `random` 模块生成: ```python import random from datetime import datetime, timedelta def generate_verification_code(): return ''.join(random.choices('0123456789', k=6)) def get_expiration_time(): return datetime.now() + timedelta(minutes=5) ``` --- ## ✅ 三、验证码存储逻辑(数据库操作) 使用 `pymysql` 或 `SQLAlchemy` 操作 MySQL 数据库,示例使用 `pymysql`: ```python import pymysql def save_verification_code(phone_number, code): conn = pymysql.connect( host='localhost', user='root', password='password', database='your_db', charset='utf8mb4' ) cursor = conn.cursor() created_at = datetime.now() expires_at = created_at + timedelta(minutes=5) sql = """ INSERT INTO verification_codes (phone_number, code, created_at, expires_at) VALUES (%s, %s, %s, %s) """ cursor.execute(sql, (phone_number, code, created_at, expires_at)) conn.commit() conn.close() ``` --- ## ✅ 四、验证码验证逻辑 验证用户提交的手机号和验证码是否匹配,且未过期、未使用: ```python def verify_code(phone_number, user_input_code): conn = pymysql.connect( host='localhost', user='root', password='password', database='your_db', charset='utf8mb4' ) cursor = conn.cursor(pymysql.cursors.DictCursor) now = datetime.now() sql = """ SELECT * FROM verification_codes WHERE phone_number = %s AND code = %s AND expires_at > %s AND is_used = FALSE ORDER BY created_at DESC LIMIT 1 """ cursor.execute(sql, (phone_number, user_input_code, now)) result = cursor.fetchone() if result: # 标记为已使用 update_sql = """ UPDATE verification_codes SET is_used = TRUE WHERE id = %s """ cursor.execute(update_sql, (result['id'],)) conn.commit() conn.close() return True else: conn.close() return False ``` --- ## ✅ 五、Flask 路由示例(发送验证码 + 登录) ```python from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/send-code', methods=['POST']) def send_code(): data = request.json phone_number = data.get('phone_number') code = generate_verification_code() # 保存验证码到数据库 save_verification_code(phone_number, code) # 实际开发中,这里应调用短信服务发送验证码 print(f"验证码已生成: {phone_number} -> {code}") return jsonify({"success": True, "message": "验证码已发送"}) @app.route('/login', methods=['POST']) def login(): data = request.json phone_number = data.get('phone_number') user_input_code = data.get('code') if verify_code(phone_number, user_input_code): return jsonify({"success": True, "message": "登录成功"}) else: return jsonify({"success": False, "message": "验证码错误或已过期"}) if __name__ == '__main__': app.run(debug=True) ``` --- ## ✅ 六、注意事项与安全建议 1. **验证码时效性**:设置合理的过期时间(如5分钟),防止暴力破解。 2. **验证码唯一性**:每个手机号每次请求应生成新的验证码,旧验证码应被覆盖或标记为无效。 3. **防滥用机制**:限制同一手机号发送验证码的频率(如每分钟最多1次)。 4. **数据库安全**:验证码明文存储存在风险,可

评论区:

评论:

请输入内容: