如何在Python后端应用中限制OTP验证尝试次数
OTP每小时验证次数限制的实现方案
Python标准库或MongoDB本身没有专门针对这类OTP验证次数限制的内置功能,但可以利用两者的现有特性来实现,避免从零编写复杂的自定义规则:
基于MongoDB的TTL与原子操作实现
可以通过扩展OTP存储结构或单独创建尝试记录集合来实现:
方案1:扩展OTP文档
在存储OTP的集合中,给每个文档添加两个字段:attempt_count(记录当前周期内的验证尝试次数)、cycle_start_time(记录当前限制周期的起始时间)。
每次验证失败时,执行以下原子操作:- 检查当前时间与
cycle_start_time是否超出1小时:- 若超出,重置
attempt_count为1,更新cycle_start_time为当前时间。 - 若未超出,递增
attempt_count,若递增后数值超过3,则返回验证次数超限提示。
可以通过MongoDB的findOneAndUpdate方法完成上述逻辑,保证操作的原子性。
- 若超出,重置
- 检查当前时间与
方案2:独立尝试记录集合
创建一个otp_attempts集合,每个文档结构如下:{ "identifier": "用户手机号/邮箱", "attempt_count": 1, "created_at": ISODate("2024-05-20T10:00:00Z") }给
created_at字段添加TTL索引,设置过期时间为3600秒(1小时):db.otp_attempts.createIndex({ "created_at": 1 }, { expireAfterSeconds: 3600 })每次验证时,执行
findOneAndUpdate操作:- 匹配条件:
identifier等于目标用户标识,且created_at在最近1小时内。 - 更新规则:若文档存在则递增
attempt_count,不存在则插入新文档并设置attempt_count为1。
最后判断返回的attempt_count是否超过3,以此限制验证次数。
- 匹配条件:
Python侧的配合实现
Python标准库中没有直接的速率限制工具,但可以利用datetime模块处理时间周期判断,配合MongoDB的原子操作完成逻辑。无需复杂的自定义计数器,仅需简单的条件判断即可。
内容的提问来源于stack exchange,提问作者ajsg
相关产品推荐
相关产品推荐

