Spaces:
Sleeping
Sleeping
File size: 4,854 Bytes
690700c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 |
# """
# Security Utilities
# Password hashing and JWT token management
# """
# from datetime import datetime, timedelta
# from typing import Optional
# from jose import JWTError, jwt
# from passlib.context import CryptContext
# from app.config import settings
# # Password hashing context
# pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
# # ============================================================================
# # PASSWORD HASHING
# # ============================================================================
# def hash_password(password: str) -> str:
# """
# Hash a password using bcrypt.
# Args:
# password: Plain text password
# Returns:
# str: Hashed password
# """
# return pwd_context.hash(password)
# def verify_password(plain_password: str, hashed_password: str) -> bool:
# """
# Verify a password against a hash.
# Args:
# plain_password: Plain text password to verify
# hashed_password: Hashed password from database
# Returns:
# bool: True if password matches, False otherwise
# """
# return pwd_context.verify(plain_password, hashed_password)
# # ============================================================================
# # JWT TOKEN MANAGEMENT
# # ============================================================================
# def create_access_token(data: dict, expires_delta: Optional[timedelta] = None) -> str:
# """
# Create a JWT access token.
# Args:
# data: Data to encode in token (user_id, email, etc.)
# expires_delta: Optional custom expiration time
# Returns:
# str: Encoded JWT 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})
# encoded_jwt = jwt.encode(to_encode, settings.SECRET_KEY, algorithm=settings.ALGORITHM)
# return encoded_jwt
# def decode_access_token(token: str) -> Optional[dict]:
# """
# Decode and verify a JWT token.
# Args:
# token: JWT token to decode
# Returns:
# dict: Decoded token data or None if invalid
# """
# try:
# payload = jwt.decode(token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM])
# return payload
# except JWTError:
# return None
"""
Security utilities for password hashing and JWT tokens
"""
from passlib.context import CryptContext
from datetime import datetime, timedelta
from jose import JWTError, jwt
from app.config import settings
# Password hashing context
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
def hash_password(password: str) -> str:
"""
Hash a password using bcrypt
Args:
password: Plain text password
Returns:
Hashed password
"""
# Bcrypt has a 72 byte limit, truncate if longer
if len(password.encode('utf-8')) > 72:
password = password[:72]
return pwd_context.hash(password)
def verify_password(plain_password: str, hashed_password: str) -> bool:
"""
Verify a password against its hash
Args:
plain_password: Plain text password to verify
hashed_password: Stored hashed password
Returns:
True if password matches, False otherwise
"""
# Truncate to 72 bytes for bcrypt
if len(plain_password.encode('utf-8')) > 72:
plain_password = plain_password[:72]
return pwd_context.verify(plain_password, hashed_password)
def create_access_token(data: dict, expires_delta: timedelta = None) -> str:
"""
Create a JWT access token
Args:
data: Data to encode in the token (usually user_id, email)
expires_delta: Token expiration time (default: from settings)
Returns:
Encoded JWT token string
"""
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})
encoded_jwt = jwt.encode(to_encode, settings.SECRET_KEY, algorithm=settings.ALGORITHM)
return encoded_jwt
def decode_access_token(token: str) -> dict:
"""
Decode and verify a JWT token
Args:
token: JWT token string
Returns:
Decoded token data (dict)
Raises:
JWTError: If token is invalid or expired
"""
try:
payload = jwt.decode(token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM])
return payload
except JWTError:
return None
|