forked from iti-framework/iTi-Flask
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.5 KiB
Python
60 lines
1.5 KiB
Python
"""
|
|
验证码服务
|
|
"""
|
|
|
|
from iti.applications.extensions.cache import cache_redis, cache_simple
|
|
import random
|
|
from enum import Enum
|
|
from iti.applications.common.exceptions.biz_exp import BizException
|
|
|
|
|
|
class VerificationCodeUsage(str, Enum):
|
|
"""
|
|
验证码使用场景
|
|
"""
|
|
|
|
COMMON = "common" # 通用
|
|
LOGIN = "login" # 登录
|
|
REGISTER = "register" # 注册
|
|
RESET_PASSWORD = "reset_password" # 重置密码
|
|
BIND_PHONE = "bind_phone" # 绑定手机号
|
|
BIND_EMAIL = "bind_email" # 绑定邮箱
|
|
UPDATE_PASSWORD = "update_password" # 修改密码
|
|
|
|
|
|
def get_verification_code(
|
|
subject: str, usage: VerificationCodeUsage = VerificationCodeUsage.COMMON
|
|
) -> str:
|
|
"""
|
|
获取验证码
|
|
"""
|
|
return cache_simple.get(key=f"verification_code:{usage}:{subject}")
|
|
|
|
|
|
def set_verification_code(
|
|
subject: str,
|
|
code: str = None,
|
|
usage: VerificationCodeUsage = VerificationCodeUsage.COMMON,
|
|
) -> str:
|
|
"""
|
|
设置验证码,并返回验证码
|
|
"""
|
|
if code is None:
|
|
code = str(random.randint(100000, 999999))
|
|
cache_simple.set(
|
|
key=f"verification_code:{usage}:{subject}", value=code, timeout=60 * 5
|
|
)
|
|
return code
|
|
|
|
|
|
def check_verification_code(
|
|
subject: str, code: str, usage: VerificationCodeUsage = VerificationCodeUsage.COMMON
|
|
) -> bool:
|
|
"""
|
|
检查验证码
|
|
"""
|
|
cached = get_verification_code(subject, usage)
|
|
if cached is None:
|
|
raise BizException("验证码过期或未发送")
|
|
return cached == code
|