Source code for nwp500.cli.token_storage

"""Token storage and management for CLI authentication."""

from __future__ import annotations

import json
import logging
from pathlib import Path

from nwp500.auth import AuthTokens

_logger = logging.getLogger(__name__)

TOKEN_FILE = Path.home() / ".nwp500_tokens.json"


[docs] def save_tokens(tokens: AuthTokens, email: str) -> None: """ Save authentication tokens and user email to a file. Args: tokens: AuthTokens object containing credentials email: User email address """ try: with open(TOKEN_FILE, "w") as f: # Use the built-in to_dict() method for serialization token_data = tokens.to_dict() token_data["email"] = email json.dump(token_data, f) _logger.info(f"Tokens saved to {TOKEN_FILE}") except OSError as e: _logger.error(f"Failed to save tokens: {e}")
[docs] def load_tokens() -> tuple[AuthTokens | None, str | None]: """ Load authentication tokens and user email from a file. Returns: Tuple of (AuthTokens, email) or (None, None) if tokens cannot be loaded """ if not TOKEN_FILE.exists(): return None, None try: with open(TOKEN_FILE) as f: data = json.load(f) email = data.get("email") if not email: _logger.error("No email found in token file") return None, None # Use the built-in model_validate() method for deserialization tokens = AuthTokens.model_validate(data) _logger.info(f"Tokens loaded from {TOKEN_FILE} for user {email}") return tokens, email except (OSError, json.JSONDecodeError, KeyError, ValueError) as e: _logger.error( f"Failed to load or parse tokens, will re-authenticate: {e}" ) return None, None