文档中似乎没有提到这一点,我找到的只是this和this,我想在其中确认这一点:
如果现有帐户具有相同的电子邮件地址,但 使用其他凭据(例如密码或不受信任的 提供商),出于安全原因,之前的凭据将被删除。
如果用户通过 Facebook 或电子邮件/密码登录,然后通过 Google 登录,则其帐户登录方法将转换为 Google。只有 Google 才会出现这种情况,并且只有一个帐户的设置处于活动状态。
事情本来就是这样吗?有什么方法可以阻止吗?
正如文档所述:某些电子邮件域有值得信赖的提供商。最突出的是:Google 是 @gmail.com 地址的值得信赖的提供商,因为它是这些电子邮件地址的唯一颁发者。
如果用户首先在 Facebook 上注册其 Gmail 地址,然后又从 Google 提供商处使用同一 Gmail 地址进行注册,则后一个注册将被视为推翻前一个注册。如果用户稍后再次使用 Facebook 登录,则两个帐户可以链接。
据我所知,防止这种情况的唯一方法是允许每个电子邮件地址有多个帐户。
另请参阅一些 Firebase 身份验证工程师的帖子:
为了解决这个问题,我使用了阻塞功能。如果用户之前使用电子邮件/密码注册但未经验证,我会阻止他们使用 Google 登录,并在客户端上向他们显示错误。
export const beforesignin = beforeUserSignedIn(async (event) => {
const user = event.data
if (user.email && event.eventType.includes(':google.com')) {
let existingUser
try {
existingUser = await admin.auth().getUserByEmail(user.email)
} catch (error) {
logger.error('Error fetching user by email:', error)
}
if (existingUser && !existingUser.emailVerified) {
logger.info(
`User with email ${user.email} has an existing unverified account: `,
existingUser
)
// check if email is unverified
throw new HttpsError(
'failed-precondition',
'Unverified email in existing account'
)
}
// otherwise, allow the sign in
}
})