You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Supabase Auth:Google OAuth登录成功,但onAuthStateChange未触发

解决Google Slides插件中Supabase OAuth登录后无法获取会话的问题

核心原因

你的插件运行在Google Slides的iframe环境中,OAuth登录在新标签页完成后,原iframe内的Supabase实例无法自动同步会话状态——浏览器的同源策略和iframe上下文隔离导致新标签页的会话Cookie不会自动同步到iframe,且onAuthStateChange无法跨标签页触发。

解决方案步骤

1. 开启Supabase跨标签页会话同步

初始化Supabase客户端时,启用crossTabAuth配置(Supabase JS v2+支持),让实例能跨标签页同步会话:

import { createClient } from '@supabase/supabase-js';

const supabaseClient = createClient(
  process.env.REACT_APP_SUPABASE_URL,
  process.env.REACT_APP_SUPABASE_ANON_KEY,
  {
    auth: {
      autoRefreshToken: true,
      persistSession: true,
      crossTabAuth: true, // 关键配置:开启跨标签页会话同步
    },
  }
);

2. 处理Redirect页面的会话确认

你设置的redirectTo页面(https://<domain>.com/success)需要完成两个关键操作:

  • 完成Supabase OAuth回调,将会话写入Cookie
  • 通知原插件所在的iframe会话已更新

在success页面添加以下代码:

import { createClient } from '@supabase/supabase-js';

const supabaseClient = createClient(
  YOUR_SUPABASE_URL,
  YOUR_SUPABASE_ANON_KEY
);

// 完成OAuth回调流程
await supabaseClient.auth.getSession();

// 向同源窗口发送会话更新通知
window.postMessage({ type: 'SUPABASE_SESSION_UPDATED' }, window.location.origin);

// 可选:自动关闭当前登录标签页
setTimeout(() => window.close(), 1000);

3. 在插件中监听跨页面消息

在React顶层组件中添加postMessage监听器,收到会话更新通知后主动刷新会话:

const [session, setSession] = useState<Session | null>(null);

useEffect(() => {
  // 初始获取会话
  const fetchInitialSession = async () => {
    const { data: { session } } = await supabaseClient.auth.getSession();
    setSession(session);
  };
  fetchInitialSession();

  // 监听Supabase原生认证状态变化
  const authListener = supabaseClient.auth.onAuthStateChange((event, session) => {
    setSession(session);
  });

  // 监听跨页面的会话更新通知
  const handleMessage = async (event) => {
    // 验证消息来源安全
    if (event.origin !== window.location.origin) return;
    if (event.data.type === 'SUPABASE_SESSION_UPDATED') {
      const { data: { session } } = await supabaseClient.auth.getSession();
      setSession(session);
    }
  };
  window.addEventListener('message', handleMessage);

  // 组件卸载时清理监听
  return () => {
    authListener.subscription.unsubscribe();
    window.removeEventListener('message', handleMessage);
  };
}, []);

4. 配置Supabase站点权限

在Supabase控制台的Authentication → URL Configuration中:

  • 将插件域名和redirectTo页面域名添加到Allowed Redirect URLs
  • 将插件域名添加到Allowed Origins (CORS),确保iframe能正常请求Supabase接口

内容的提问来源于stack exchange,提问作者pyron_orion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:23:30