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

如何在Python后端应用中限制OTP验证尝试次数

OTP每小时验证次数限制的实现方案

Python标准库或MongoDB本身没有专门针对这类OTP验证次数限制的内置功能,但可以利用两者的现有特性来实现,避免从零编写复杂的自定义规则:

基于MongoDB的TTL与原子操作实现

可以通过扩展OTP存储结构或单独创建尝试记录集合来实现:

  • 方案1:扩展OTP文档
    在存储OTP的集合中,给每个文档添加两个字段:attempt_count(记录当前周期内的验证尝试次数)、cycle_start_time(记录当前限制周期的起始时间)。
    每次验证失败时,执行以下原子操作:

    1. 检查当前时间与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:45:36