OTP API Throttling

Overview

We need to restrict number of OTP message generated for particular e-mail or mobile.

Purpose is simply to avoid misuse through


Approach 1

Create one table, otp_throttling with columns (type, key, count)

Each time generate OTP is called:

  • Check if user exists → throw exception - user already exists with Mobile/Email.
  • Check if there is an entry with same type, userkey in the table
  • if no entry, then add entry with TTL as per configuration.
  • if entry is found then, check if threshold is already reached.
  • if threshold is reached → Generate error with message, that user has reached max OTP generation, and is blocked for 24 hours.
  • If threshold is not reached → increment the counter as well as ttl, and proceed to OTP generation.

Pros:

  • Easy to implement and clean solution, as both data are for seperate purpose
  • We can use ttl at table level for both tables, and row will get deleted automatically.

Cons:

  • Additional data storage.

Approach 2

It is same as approach 1, except existing OTP table should be used.

Pros:

  • No additional table will be required

Cons:

  • Both data will be stored in same table.
  • Need to use  TTL at column level


Open Questions

  • 5 OTP in 24 hours limit is from first generation of otp or from last usage. i.e. say first generation was done at 09:00 AM → till 09:00 AM next morning - user cannot generate more than 5 OTP, or each time OTP is generated we update the timestamp, say 5th otp was generated at 05:00PM - then user cannot generate OTP till 05:00 PM next day.