import os import platform import sys import time from typing import Any import gradio as gr from huggingface_hub import HfApi def _safe_preview_secret(value: str | None, *, start: int = 6, end: int = 4) -> str | None: if not value: return None if len(value) <= start + end: return "*" * len(value) return f"{value[:start]}...{value[-end:]}" def _serialize_obj(obj: Any) -> dict[str, Any]: # Try common serialization paths, then fallback to attribute introspection for attr in ("model_dump", "dict", "to_dict"): if hasattr(obj, attr) and callable(getattr(obj, attr)): try: return dict(getattr(obj, attr)()) # type: ignore[arg-type] except Exception: pass if hasattr(obj, "__dict__") and isinstance(obj.__dict__, dict): return {k: v for k, v in obj.__dict__.items() if not k.startswith("_")} # Last resort: pick readable attributes result: dict[str, Any] = {} for name in dir(obj): if name.startswith("_"): continue try: value = getattr(obj, name) except Exception: continue if isinstance(value, (str, int, float, bool, dict, list, tuple, type(None))): result[name] = value return result def show_profile(profile: gr.OAuthProfile | None) -> dict[str, Any]: if profile is None: return {"error": "No profile found. Please sign in with the button first."} data = _serialize_obj(profile) return { "profile": data, } def show_token_info(token: gr.OAuthToken | None) -> dict[str, Any]: if token is None or not getattr(token, "token", None): return {"error": "No OAuth token available. Please sign in first."} token_str = token.token # type: ignore[assignment] info: dict[str, Any] = { "present": True, "length": len(token_str), "preview": _safe_preview_secret(token_str), } try: api = HfApi() who = api.whoami(token=token_str) # who typically contains: {"name": username, "email": ..., "orgs": [...]} info["whoami"] = who except Exception as e: info["whoami_error"] = str(e) return info def show_env_info() -> dict[str, Any]: keys_of_interest = [ "SPACE_HOST", "OPENID_PROVIDER_URL", "OAUTH_CLIENT_ID", "OAUTH_CLIENT_SECRET", "OAUTH_SCOPES", "HF_TOKEN", "HUGGING_FACE_HUB_TOKEN", "HF_HOME", "PYTHONPATH", ] env_details: dict[str, Any] = {} for k in keys_of_interest: v = os.getenv(k) if v is None: env_details[k] = None else: env_details[k] = _safe_preview_secret(v) system_info = { "python_version": sys.version, "platform": platform.platform(), "time": time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()), } all_env_names = sorted(list(os.environ.keys())) return { "selected_environment": env_details, "all_environment_variable_names": all_env_names, "system": system_info, } with gr.Blocks() as demo: gr.Markdown(""" # HF OAuth Info Tester Use the button below to sign in with Hugging Face. Then click the buttons to inspect the signed-in profile, token-derived info, and selected environment details. """) with gr.Row(): gr.LoginButton() info = gr.JSON(label="Output") with gr.Row(): btn_profile = gr.Button("Show User Profile") btn_token = gr.Button("Show Token Info (whoami)") btn_env = gr.Button("Show Environment Info") btn_profile.click(fn=show_profile, inputs=None, outputs=info) btn_token.click(fn=show_token_info, inputs=None, outputs=info) btn_env.click(fn=show_env_info, inputs=None, outputs=info) if __name__ == "__main__": demo.launch()