我希望我的用户可以使用许多不同的提供商登录,但如果他们只使用一个电子邮件地址,他们将获得相同的结例如,在stackoverflow中我可以通过Facebook,Google登录......但我仍然可以保留我的个人资料以及我的帖子......
在Firebase Web中,例如,如果我的用户使用电子邮件/密码提供商创建了帐户,则他的电子邮件=“[email protected]”password =“123456”。此帐户有uid =“account1”,我使用此uid作为密钥,在Firebase数据库中存储有关他的其他信息。
有一天,他选择由Google提供商和Facebook提供商登录(仍然是[email protected]),我在auth设置中测试了2个案例:
所以firebase可以帮助我在很多应用程序中做我喜欢的事情(通过许多不同的方式登录,但结果相同)?
Firebase Auth通过“使用相同的电子邮件地址阻止创建多个帐户”设置支持此功能。但是,Google是一个特例,因为它是经过验证的提供商,并会使用相同的电子邮件覆盖未经验证的帐户。例如,如果创建了一个电子邮件/密码帐户但未经过验证,然后用户使用相同的电子邮件登录Google,则会覆盖旧密码并取消链接,但会返回相同的用户(相同的uid)。
对于其他情况,这是它的处理方式。
假设您使用电子邮件/密码通过帐户[email protected]使用电子邮件/密码登录。然后,用户尝试使用相同的电子邮件登录Facebook提供商。 Auth后端将抛出错误,并且将需要链接。完成此操作后,用户可以使用任一帐户登录。
这是一个例子:
var existingEmail = null;
var pendingCred = null;
var facebookProvider = new firebase.auth.FacebookAuthProvider();
firebase.auth().signInWithPopup(facebookProvider)
.then(function(result) {
// Successful sign-in.
});
.catch(function(error) {
// Account exists with different credential. To recover both accounts
// have to be linked but the user must prove ownership of the original
// account.
if (error.code == 'auth/account-exists-with-different-credential') {
existingEmail = error.email;
pendingCred = error.credential;
// Lookup existing account’s provider ID.
return firebase.auth().fetchProvidersForEmail(error.email)
.then(function(providers) {
if (providers.indexOf(firebase.auth.EmailAuthProvider.PROVIDER_ID) != -1) {
// Password account already exists with the same email.
// Ask user to provide password associated with that account.
var password = window.prompt('Please provide the password for ' + existingEmail);
return firebase.auth().signInWithEmailAndPassword(existingEmail, password);
} else if (providers.indexOf(firebase.auth.GoogleAuthProvider.PROVIDER_ID) != -1) {
var googProvider = new firebase.auth.GoogleAuthProvider();
// Sign in user to Google with same account.
provider.setCustomParameters({'login_hint': existingEmail});
return firebase.auth().signInWithPopup(googProvider).then(function(result) {
return result.user;
});
} else {
...
}
})
.then(function(user) {
// Existing email/password or Google user signed in.
// Link Facebook OAuth credential to existing account.
return user.linkWithCredential(pendingCred);
});
}
throw error;
});
@bojeil上面的代码是正确的除了它错过了一行。
var existingEmail = null;
var pendingCred = null;
**var facebookprovider = new firebase.auth.FacebookAuthProvider();**
firebase.auth().signInWithPopup(facebookProvider)
你必须先将facebookprovider初始化,然后再将其作为参数传递。