Files
2026-07-13 13:17:40 +08:00

104 lines
3.4 KiB
Python

"""Authentication token setup for Ray.
This module provides functions to generate and save authentication tokens
for Ray's token-based authentication system. Token loading and caching is
handled by the C++ AuthenticationTokenLoader.
"""
import logging
from pathlib import Path
from typing import Any, Dict, Optional
from ray._private.authentication.authentication_constants import (
TOKEN_AUTH_ENABLED_BUT_NO_TOKEN_FOUND_ERROR_MESSAGE,
)
from ray._private.authentication.authentication_token_generator import (
generate_new_authentication_token,
)
from ray._raylet import (
AuthenticationMode,
AuthenticationTokenLoader,
get_authentication_mode,
)
from ray.exceptions import AuthenticationError
logger = logging.getLogger(__name__)
def generate_and_save_token() -> None:
"""Generate a new random token and save it in the default token path.
Returns:
The newly generated authentication token.
"""
# Generate a UUID-based token
token = generate_new_authentication_token()
token_path = _get_default_token_path()
try:
# Create directory if it doesn't exist
token_path.parent.mkdir(parents=True, exist_ok=True)
# Write token to file with explicit flush and fsync
with open(token_path, "w") as f:
f.write(token)
logger.info(f"Generated new authentication token and saved to {token_path}")
except Exception:
raise
def _get_default_token_path() -> Path:
"""Get the default token file path (~/.ray/auth_token).
Returns:
Path object pointing to ~/.ray/auth_token
"""
return Path.home() / ".ray" / "auth_token"
def ensure_token_if_auth_enabled(
system_config: Optional[Dict[str, Any]] = None, create_token_if_missing: bool = True
) -> None:
"""Check authentication settings and set up token resources if authentication is enabled.
Ray calls this early during ray.init() to do the following for token-based authentication:
1. Check whether you enabled token-based authentication.
2. Make sure a token is available if authentication is enabled.
3. Generate and save a default token for new local clusters if one doesn't already exist.
Args:
system_config: Ray raises an error if you set AUTH_MODE in system_config instead of the environment.
create_token_if_missing: Generate a new token if one doesn't already exist.
Raises:
RuntimeError: Ray raises this error if authentication is enabled but no token is found when connecting
to an existing cluster.
"""
# Check if you enabled token authentication.
if get_authentication_mode() != AuthenticationMode.TOKEN:
if (
system_config
and "AUTH_MODE" in system_config
and system_config["AUTH_MODE"] != "disabled"
):
raise RuntimeError(
"Set authentication mode can only be set with the `RAY_AUTH_MODE` environment variable, not using the system_config."
)
return
token_loader = AuthenticationTokenLoader.instance()
if not token_loader.has_token(ignore_auth_mode=True):
if create_token_if_missing:
# Generate a new token.
generate_and_save_token()
# Reload the cache so subsequent calls to token_loader read the new token.
token_loader.reset_cache()
else:
raise AuthenticationError(
TOKEN_AUTH_ENABLED_BUT_NO_TOKEN_FOUND_ERROR_MESSAGE
)