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

如何在Supabase Auth中通过Google登录时添加额外用户元数据?

解决方案:通过Supabase获取Google用户的名字与姓氏

1. 无需额外调用Google API,仅用Supabase即可实现

Supabase在OAuth登录时,只要请求了profile scope(你的代码中已配置),Google会自动返回用户的given_name(名字)和family_name(姓氏)等基础信息,这些数据会被Supabase存入用户的raw_user_meta_data中,直接通过Supabase的用户对象或数据库触发器即可获取,不需要额外调用Google API。

2. 调整数据库触发器SQL(关键修正)

你的当前触发器中使用的first_name、last_name、avatar_url字段名与Google返回的字段不匹配,需要修正为Google实际返回的字段名:

begin
  insert into public.profiles (id, full_name, first_name, last_name, username, avatar_url)
  values (
    new.id,
    new.raw_user_meta_data->>'name', -- Google返回的用户全名
    new.raw_user_meta_data->>'given_name', -- 对应givenName(名字)
    new.raw_user_meta_data->>'family_name', -- 对应familyName(姓氏)
    new.raw_user_meta_data->>'username',
    new.raw_user_meta_data->>'picture' -- Google返回的头像地址字段为picture,而非avatar_url
  );
  return new;
end;

3. 前端验证与获取用户信息

登录成功后,可直接从Supabase的用户对象中读取名字和姓氏,无需存储provider_token(除非有其他额外需求):

// 登录后获取用户信息
const getUserInfo = async () => {
  const { data: { user }, error } = await supabase.auth.getUser();
  if (error) throw error;
  // 读取名字和姓氏
  const givenName = user.user_metadata.given_name;
  const familyName = user.user_metadata.family_name;
  console.log('用户名字:', givenName, '用户姓氏:', familyName);
};

4. 关于Google API弃用的说明

你提到的即将弃用的API大概率是指旧版Google+相关接口,而当前通过OpenID Connect的profile scope获取用户基础信息是标准协议,属于Google长期支持的OAuth流程,不存在弃用风险,可以放心使用。

最佳实践总结

  • 保持使用Supabase原生OAuth流程,避免额外的Google API调用,减少复杂度与权限风险
  • 确保触发器中字段映射与Google返回的元数据字段一致,避免数据为空
  • 直接从Supabase用户对象的user_metadata中读取所需信息,无需依赖第三方API调用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:56:20