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
相关产品推荐
相关产品推荐

