nex_docus/backend/app/core/security.py

66 lines
1.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"""
安全相关工具密码哈希、JWT Token 生成与验证
"""
from datetime import datetime, timedelta
from typing import Optional
from jose import JWTError, jwt
from passlib.context import CryptContext
from app.core.config import settings
import logging
logger = logging.getLogger(__name__)
# 密码加密上下文
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
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:
"""
创建 JWT Access Token
"""
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta
else:
expire = datetime.utcnow() + timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
to_encode.update({"exp": expire})
logger.info(f"Creating token with payload: {to_encode}")
logger.info(f"Using SECRET_KEY: {settings.SECRET_KEY[:10]}...")
logger.info(f"Using ALGORITHM: {settings.ALGORITHM}")
encoded_jwt = jwt.encode(to_encode, settings.SECRET_KEY, algorithm=settings.ALGORITHM)
logger.info(f"Generated token: {encoded_jwt[:50]}...")
return encoded_jwt
def decode_access_token(token: str) -> Optional[dict]:
"""
解码 JWT Token
"""
try:
logger.info(f"Decoding token: {token[:50]}...")
logger.info(f"Using SECRET_KEY: {settings.SECRET_KEY[:10]}...")
logger.info(f"Using ALGORITHM: {settings.ALGORITHM}")
payload = jwt.decode(token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM])
logger.info(f"Decoded payload: {payload}")
return payload
except JWTError as e:
logger.error(f"JWT decode error: {e}")
return None