cacode's picture
Upload 74 files
7c15d35 verified
import secrets
import string
from datetime import datetime, timedelta
from typing import Optional
from jose import JWTError, jwt
from passlib.context import CryptContext
from app.config import settings
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
def generate_card_key(length: int = 16, prefix: str = "") -> str:
"""生成卡密"""
chars = string.ascii_uppercase + string.digits
random_part = ''.join(secrets.choice(chars) for _ in range(length))
if prefix:
return f"{prefix}-{random_part}"
return random_part
def generate_access_link(card_key: str, base_url: str = "http://localhost:3000") -> str:
"""生成访问链接"""
return f"{base_url}/access/{card_key}"
def generate_session_id() -> str:
"""生成会话ID"""
return secrets.token_urlsafe(32)
def verify_password(plain_password: str, hashed_password: str) -> bool:
"""验证密码"""
return pwd_context.verify(plain_password, hashed_password)
def get_password_hash(password: str) -> str:
"""哈希密码"""
return pwd_context.hash(password)
def create_access_token(data: dict, expires_delta: Optional[timedelta] = None) -> str:
"""创建访问令牌"""
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta
else:
expire = datetime.utcnow() + timedelta(minutes=15)
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, settings.SECRET_KEY, algorithm=settings.ALGORITHM)
return encoded_jwt
def verify_token(token: str) -> Optional[dict]:
"""验证令牌"""
try:
payload = jwt.decode(token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM])
return payload
except JWTError:
return None