我可以构建使用 google 身份验证提供商登录的用户的文档集合吗?
Can I structure document collection of users that sign in using google auth provider?
所以我正在尝试使用 React 和 Firebase 做一个应用程序,现在一切都很好。
在我的应用程序中,有几个选项可以授权用户。 Google、电子邮件和密码以及 Twitter。
当用户使用他的电子邮件创建帐户时,我可以轻松地为该用户构建数据在我的 firestore 中的样子,我就是这样做的:
firebase.createUser(
{ email, password },
{
firstName,
lastName,
emailAddress: email,
birthDate: null,
activeStatus: false,
dateJoined: new Date(),
avatarUrl: null,
friends: [],
posts: [
{
content: "I have just joined!",
date: new Date(),
likes: [],
comments: [],
shares: []
}
]
}
).then(() => {
history.push("/login")
})
我的 firestore 中的输出是这样的:
Firestore screen - email
现在我想以相同的方式构建使用 Google 身份验证登录的用户数据。
这就是我使用 Google 登录的样子:
const loginWithGoogle = () => {
firebase.login({ provider: 'google', type: 'popup' })
.then(() => {
localStorage.setItem('authUser', auth)
history.push("/home")
})
.catch(error => {
console.log(error.message)
})
}
默认情况下,firestore 中的输出看起来是这样的:Firestore screen - google
所以我的问题是:
我什至如何尝试使两种身份验证类型的集合看起来相同?
我应该以某种方式发现用户是第一次使用 google 提供商登录,然后尝试构建该集合,还是有更好的方法来做到这一点?
感谢所有回复。
*******************************
对于正在为此苦苦挣扎的人:
感谢@Ajordat 的回复,我做到了,这就是它的外观和对我来说完美的工作方式:
const loginWithGoogle = () => {
firebase.login({ provider: 'google', type: 'popup' })
.then((user) => {
const fullName = user.profile.displayName.split(" ")
const firstName = fullName[0]
const lastName = fullName[1]
if (user.additionalUserInfo.isNewUser) {
firestore.collection("users").doc(user.user.uid).set({
...user.profile,
firstName,
lastName,
birthDate: null,
activeStatus: false,
dateJoined: new Date(),
friends: [],
posts: [
{
author: firstName + " " + lastName,
content: "I have just joined!",
date: new Date(),
likes: [],
comments: [],
shares: []
}
]
})
} else {
console.log("user exists")
}
localStorage.setItem('authUser', auth)
history.push("/home")
})
.catch(error => {
console.log(error.message)
})
}
您应该使用方法 AdditionalUserInfo.isNewUser()
来检查用户是否是第一次登录。它总是 false
除了那一次,您需要使用它来根据需要在 Firestore 上创建用户。
所以我正在尝试使用 React 和 Firebase 做一个应用程序,现在一切都很好。
在我的应用程序中,有几个选项可以授权用户。 Google、电子邮件和密码以及 Twitter。
当用户使用他的电子邮件创建帐户时,我可以轻松地为该用户构建数据在我的 firestore 中的样子,我就是这样做的:
firebase.createUser(
{ email, password },
{
firstName,
lastName,
emailAddress: email,
birthDate: null,
activeStatus: false,
dateJoined: new Date(),
avatarUrl: null,
friends: [],
posts: [
{
content: "I have just joined!",
date: new Date(),
likes: [],
comments: [],
shares: []
}
]
}
).then(() => {
history.push("/login")
})
我的 firestore 中的输出是这样的: Firestore screen - email
现在我想以相同的方式构建使用 Google 身份验证登录的用户数据。
这就是我使用 Google 登录的样子:
const loginWithGoogle = () => {
firebase.login({ provider: 'google', type: 'popup' })
.then(() => {
localStorage.setItem('authUser', auth)
history.push("/home")
})
.catch(error => {
console.log(error.message)
})
}
默认情况下,firestore 中的输出看起来是这样的:Firestore screen - google
所以我的问题是:
我什至如何尝试使两种身份验证类型的集合看起来相同?
我应该以某种方式发现用户是第一次使用 google 提供商登录,然后尝试构建该集合,还是有更好的方法来做到这一点?
感谢所有回复。
*******************************
对于正在为此苦苦挣扎的人:
感谢@Ajordat 的回复,我做到了,这就是它的外观和对我来说完美的工作方式:
const loginWithGoogle = () => {
firebase.login({ provider: 'google', type: 'popup' })
.then((user) => {
const fullName = user.profile.displayName.split(" ")
const firstName = fullName[0]
const lastName = fullName[1]
if (user.additionalUserInfo.isNewUser) {
firestore.collection("users").doc(user.user.uid).set({
...user.profile,
firstName,
lastName,
birthDate: null,
activeStatus: false,
dateJoined: new Date(),
friends: [],
posts: [
{
author: firstName + " " + lastName,
content: "I have just joined!",
date: new Date(),
likes: [],
comments: [],
shares: []
}
]
})
} else {
console.log("user exists")
}
localStorage.setItem('authUser', auth)
history.push("/home")
})
.catch(error => {
console.log(error.message)
})
}
您应该使用方法 AdditionalUserInfo.isNewUser()
来检查用户是否是第一次登录。它总是 false
除了那一次,您需要使用它来根据需要在 Firestore 上创建用户。