我想从登录用户的谷歌个人资料中获取名字和姓氏。经检查,谷歌正在使用
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;
在我看来,您可以单独使用 Supabase 来实现这一点,但它现在是一个未记录的功能。
目前,你可以(几乎)用 Supabase 实现你想要的。实际上,您已经 实现了它,与当前的 Supabase 功能一样好,在您当前的
handle_new_user
功能中:
我按照他们的 User Management Starter 使用
功能在登录时处理用户元数据handle_new_user
此功能使您可以在
public.profiles.full_name
列中使用从 Google 帐户传输的全名元数据。但是,名字和姓氏不能单独使用。 (旁注:handle_new_user
触发功能如何工作的细节的一个很好的解释是这篇文章。)
这种元数据传输在 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
。这总共给您留下了四个选项:
只使用全名。这将是我的首选解决方案,因为不是每个人都有名字和姓氏。另外,如果您的软件总是同时使用名字和姓氏,那么它就不需要知道全名的任何潜在子结构。
将
full_name
自己分成名字和姓氏。这可以通过修改 handle_new_user
函数来实现。请参阅此处如何在 PostgreSQL 中处理此问题。但实际上,最好使用全名,因为自动拆分总是会出错。
Extend Supabase。 如果您为软件自行托管 Supabase,则可以对其 gotrue 组件进行必要的调整,以便在登录时从 Google 用户传递更多元数据。 Supabase毕竟是开源的。你也可以在 pull request 中将你的更改提供回 Supabase,并希望他们将它们包含到正式版本中,但这当然不能保证。
使用 Google API Google Identity Services for Web 自己获取
givenName
和 familyName
.