import os import gradio as gr from huggingface_hub import whoami WHITELIST = set(filter(None, os.environ.get("WHITELIST", "").split(","))) def process_user_data(oauth_token: gr.OAuthToken | None): """页面加载时在后台打印用户信息""" if oauth_token is None or not oauth_token.token: return try: user_info = whoami(token=oauth_token.token) username = user_info.get("name", "未知用户") orgs = user_info.get("orgs", []) org_names = [org["name"] for org in orgs] org_str = ", ".join(org_names) if org_names else "个人用户" in_whitelist = username in WHITELIST print("="*30) print(f"📡 收到用户信息:") print(f"👤 用户名: {username}") print(f"🏢 组织: {org_str}") print(f"✅ 白名单: {in_whitelist}") print("="*30) except Exception as e: print(f"❌ 认证失败日志: {e}") def handle_submit(oauth_token: gr.OAuthToken | None): """ 提交按钮逻辑: - 已登录:运行打印逻辑1111,不发跳转信号。 - 未登录:发送 TRIGGER 信号引导跳转。 """ if oauth_token is not None and oauth_token.token: try: user_info = whoami(token=oauth_token.token) username = user_info.get("name", "未知用户") orgs = user_info.get("orgs", []) org_names = [org["name"] for org in orgs] org_str = ", ".join(org_names) if org_names else "个人用户" in_whitelist = username in WHITELIST print("="*30) print(f"📡 收到用户信息:") print(f"👤 用户名: {username}") print(f"🏢 组织: {org_str}") print(f"✅ 白名单: {in_whitelist}") print("="*30) return "SUCCESS" except Exception as e: print(f"❌ 认证失败日志:11 {e}") return "TRIGGER" return "TRIGGER" css = """ #real_login_btn { position: absolute; opacity: 0; pointer-events: none; height: 0; width: 0; } """ with gr.Blocks(css=css) as demo: # 隐藏的登录按钮引擎 login_btn = gr.LoginButton(elem_id="real_login_btn") # 隐藏的信号交互盒 signal_box = gr.Textbox(visible=False) gr.Markdown("# 🚀 业务系统") with gr.Row(): submit_btn = gr.Button("点击提交业务", variant="primary") logout_btn = gr.Button("退出登录") # --- 逻辑 A: 页面加载时(如授权跳回)在后台打印 --- demo.load(fn=process_user_data, inputs=None, outputs=None) # --- 逻辑 B: 提交按钮逻辑 --- submit_btn.click( fn=handle_submit, inputs=[], outputs=signal_box, # 信号发往隐藏组件,不显示在页面上 ).then( None, inputs=[signal_box], outputs=None, js=""" (sig) => { if (sig === "TRIGGER") { const btn = document.getElementById("real_login_btn"); if (btn) { const actualBtn = btn.querySelector('button') || btn; actualBtn.click(); } } else if (sig === "SUCCESS") { alert("已在后台处理用户信息!"); } } """ ) # --- 逻辑 C: 登出 --- logout_btn.click( None, None, None, js="() => { window.location.href = window.location.pathname; }" ) demo.launch()