如何在使用 Supabase Auth 登录 Google 时添加额外的用户元数据?

问题描述 投票:0回答:1

我想从登录用户的谷歌个人资料中获取名字和姓氏。经检查,谷歌正在使用

givenName
familyName
。是否可以仅使用 Supabase 来执行此操作,还是在获取访问令牌后我需要为此使用 Google API?它在 Supabase 文档 上说,但我不确定该怎么做,因为我还没有使用过 Google API。

我已经阅读了 Google API 文档,看到它将在下个月被弃用,所以我想知道向前推进的最佳方法是什么。

我正在为 Nuxt 3 使用 Supabase 模块:

const supabase = useSupabaseClient();
const accessToken = ref('');

const loginWithGoogle = async () => {
  try {
    const { data, error } = await supabase.auth.signInWithOAuth({
      provider: "google",
      options: {
        redirectTo: "http://localhost:3000/app/home",
        scopes: "openid profile email",
      },
    });
    if (error) throw error;
    accessToken.value = data.session.provider_token;
  } catch (error) {
    console.log("Error logging in with Google: ", error);
  }
};

我按照他们的 User Management Starter 使用

handle_new_user
功能在登录时处理用户元数据:

begin
  insert into public.profiles (id, full_name, first_name, last_name, username, avatar_url)
  values (new.id, new.raw_user_meta_data->>'full_name', new.raw_user_meta_data->>'first_name', new.raw_user_meta_data->>'last_name', new.raw_user_meta_data->>'username', new.raw_user_meta_data->>'avatar_url');
  return new;
end;
nuxt.js supabase
1个回答
1
投票

在我看来,您可以单独使用 Supabase 来实现这一点,但它现在是一个未记录的功能

目前,你可以(几乎)用 Supabase 实现你想要的。实际上,您已经 实现了它,与当前的 Supabase 功能一样好,在您当前的

handle_new_user
功能中:

我按照他们的 User Management Starter 使用

handle_new_user
功能在登录时处理用户元数据

此功能使您可以在

public.profiles.full_name
列中使用从 Google 帐户传输的全名元数据。但是,名字和姓氏不能单独使用。 (旁注:
handle_new_user
触发功能如何工作的细节的一个很好的解释是这篇文章。)

为什么您现有的解决方案与当前的 Supabase 一样好

这种元数据传输在 gotrue/api/provider/*.go 文件中的

Supabase gotrue
项目中处理。例如,比较 gotrue issue #127,他们扩展了从 Twitter 和 Github 传输的元数据。

现在,当您查看 google.go l 时。 68,你看到目前有两条用户元数据被传输用于使用谷歌登录:

data := &UserProvidedData{
    Metadata: map[string]string{
        nameKey:      u.Name,
        avatarURLKey: u.AvatarURL,
    },
}

nameKey
avatarURLKey
provider.go
 中的
定义如下:

const (
    userNameKey  = "user_name"
    avatarURLKey = "avatar_url"
    nameKey      = "full_name"
    aliasKey     = "slug"
)

所以这些是您现有的

handle_new_user
函数中使用的相同 JSON 字段名称,它将元数据传输到您的
public.profiles
表。

替代解决方案

对于您的用例,上述解决方案的缺点是未提供

first_name
last_name
,仅提供
full_name
。这总共给您留下了四个选项:

  1. 只使用全名。这将是我的首选解决方案,因为不是每个人都有名字和姓氏。另外,如果您的软件总是同时使用名字和姓氏,那么它就不需要知道全名的任何潜在子结构。

  2. full_name
    自己分成名字和姓氏。这可以通过修改
    handle_new_user
    函数来实现。请参阅此处如何在 PostgreSQL 中处理此问题。但实际上,最好使用全名,因为自动拆分总是会出错。

  3. Extend Supabase。 如果您为软件自行托管 Supabase,则可以对其 gotrue 组件进行必要的调整,以便在登录时从 Google 用户传递更多元数据。 Supabase毕竟是开源的。你也可以在 pull request 中将你的更改提供回 Supabase,并希望他们将它们包含到正式版本中,但这当然不能保证。

  4. 使用 Google API Google Identity Services for Web 自己获取

    givenName
    familyName
    .

© www.soinside.com 2019 - 2024. All rights reserved.