from datetime import datetime, timedelta from typing import Optional import jwt from flask import current_app def get_user_token( user_id: int, password_reset: Optional[bool] = False ) -> str: """ Return authentication token for a given user. Token expiration time depends on token type (authentication or password reset) """ expiration_days: float = ( 0.0 if password_reset else current_app.config['TOKEN_EXPIRATION_DAYS'] ) expiration_seconds: float = ( current_app.config['PASSWORD_TOKEN_EXPIRATION_SECONDS'] if password_reset else current_app.config['TOKEN_EXPIRATION_SECONDS'] ) now = datetime.utcnow() payload = { 'exp': now + timedelta(days=expiration_days, seconds=expiration_seconds), 'iat': now, 'sub': user_id, } return jwt.encode( payload, current_app.config['SECRET_KEY'], algorithm='HS256', ) def decode_user_token(auth_token: str) -> int: """ Return user id from token """ payload = jwt.decode( auth_token, current_app.config['SECRET_KEY'], algorithms=['HS256'], ) return payload['sub']