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

Supabase Auth:如何获取完整第三方登录提供商信息

获取Supabase第三方登录的完整提供商信息

要获取Google、Discord等第三方登录的完整信息,你可以利用Supabase内置的系统表,以下是具体解决方案:

核心信息来源

Supabase的两个系统表存储了第三方登录的关键数据:

  • auth.users:包含用户基础信息,其中provider字段直接存储登录提供商名称(如google、discord),raw_user_meta_data包含部分用户元数据。
  • auth.identities:关联用户的所有登录身份,每个第三方登录对应一条记录,identity_data字段是JSON格式,包含第三方提供商返回的完整用户信息(如Google的头像、姓名,Discord的用户名、头像标识等)。

方案一:优化现有触发器,直接从auth.users提取更多信息

修改触发器函数,直接使用auth.users自带的provider和provider_id字段(无需从raw_user_meta_data提取),并整合元数据:

-- 更新触发器函数
create or replace function public.handle_new_user() 
returns trigger as $$
BEGIN
  INSERT INTO public.users (
    id,
    email,
    avatar,
    username,
    fullname,
    provider,
    provider_id
  )
  VALUES (
    new.id,
    new.email,
    jsonb_extract_path_text(new.raw_user_meta_data, 'avatar_url'),
    jsonb_extract_path_text(new.raw_user_meta_data, 'name'),
    jsonb_extract_path_text(new.raw_user_meta_data, 'full_name'),
    -- 整合提供商名称与元数据
    json_build_object(
      'provider_name', new.provider,
      'meta_data', new.raw_user_meta_data
    ),
    new.provider_id -- 直接使用auth.users自带的provider_id字段
  );
  RETURN new;
END;
$$ language plpgsql security definer;

方案二:关联auth.identities获取完整第三方身份信息

如果需要更完整的提供商返回数据,可在触发器中查询auth.identities表,获取第三方返回的原始身份数据:

-- 更新触发器函数
create or replace function public.handle_new_user() 
returns trigger as $$
DECLARE
  identity_record auth.identities%ROWTYPE;
BEGIN
  -- 获取当前用户的第三方身份记录(多身份场景可调整逻辑)
  SELECT * INTO identity_record
  FROM auth.identities
  WHERE user_id = new.id
  LIMIT 1;

  INSERT INTO public.users (
    id,
    email,
    avatar,
    username,
    fullname,
    provider,
    provider_id
  )
  VALUES (
    new.id,
    new.email,
    -- 优先用第三方身份数据, fallback到用户元数据
    COALESCE(jsonb_extract_path_text(identity_record.identity_data, 'avatar_url'), jsonb_extract_path_text(new.raw_user_meta_data, 'avatar_url')),
    COALESCE(jsonb_extract_path_text(identity_record.identity_data, 'username'), jsonb_extract_path_text(new.raw_user_meta_data, 'name')),
    COALESCE(jsonb_extract_path_text(identity_record.identity_data, 'name'), jsonb_extract_path_text(new.raw_user_meta_data, 'full_name')),
    -- 存储完整的身份信息
    json_build_object(
      'provider_name', identity_record.provider,
      'identity_data', identity_record.identity_data,
      'user_meta_data', new.raw_user_meta_data
    ),
    identity_record.provider_id
  );
  RETURN new;
END;
$$ language plpgsql security definer;

前端获取完整信息说明

useUser()返回的是Supabase Auth的基础用户对象,若要获取你自定义public.users表中的完整提供商信息,需要额外查询:

import { useUser } from '@supabase/auth-helpers-react';
import { supabase } from '../path/to/supabase-client';

const UserProfile = () => {
  const { user } = useUser();
  const [profile, setProfile] = useState(null);

  useEffect(() => {
    if (user) {
      const fetchProfile = async () => {
        const { data } = await supabase.from('users').select('*').eq('id', user.id).single();
        setProfile(data);
      };
      fetchProfile();
    }
  }, [user]);

  return profile ? (
    <div>
      <p>提供商:{profile.provider.provider_name}</p>
      <p>第三方用户信息:{JSON.stringify(profile.provider.identity_data)}</p>
    </div>
  ) : null;
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:53:06