我的应用正在使用Firebase登录Facebook和电子邮件密码。现在,对于那些使用Facebook签名的用户,我不想验证他们的电子邮件。但在Auth.auth().currentUser?.isEmailVerified
中,它始终返回false。因此,有没有其他方法可以检测到用户已使用Facebook登录。我知道我可以在登录之前在用户默认值中存储值,但是在卸载并重新安装应用后,我将失去该用户默认值。在firebase保持用户登录状态的同时。我可以为此使用钥匙串,但是如果firebase直接提供钥匙串,则可以轻松进行编码。
答案 0 :(得分:6)
您可以使用:
if let user = Auth.auth().currentUser {
if FBSDKAccessToken.current() != nil {
// logged in using facebook
}
else {
// logged in using manual email/password method
}
}
因此您可以仅向使用电子邮件/密码方法登录的用户发送验证电子邮件。
答案 1 :(得分:2)
我找到了一种使用Firebase方法的解决方案:
if let providerData = Auth.auth().currentUser?.providerData {
for userInfo in providerData {
switch userInfo.providerID {
case "facebook.com":
print("Facebook Login")
//isVerifiededUser = true
default:
print("provider is \(userInfo.providerID)")
}
}
}
答案 2 :(得分:1)
Firebase没有提供一种方法来显示哪种方法是用于创建Firebase帐户的第一种方法。您将拥有一个附加到Firebase用户的所有提供商的列表,并附带了他们的电子邮件/电话号码。
Firebase默认情况下仅设置经过Google SignIn验证的电子邮件,对于其他提供商,Firebase的行为是设置为false(尽管有时它确实将验证的电子邮件设置为随机)。 原因是Firebase无法保证电子邮件已在其平台上被facebook验证,但如果Google firebase受到信任。
一种选择是,无论Facebook或电子邮件身份验证,您始终发送验证电子邮件。其次,您放弃了电子邮件密码登录,而使用新的电子邮件链接身份验证,从而消除了密码登录所需的电子邮件身份验证。
编辑:
如果您一次只允许使用一种方法,则可以从Firebase用户处获取提供商列表,并检查提供商列表中是否存在“密码”登录方法,在检查已验证的电子邮件之后发送验证电子邮件,否则不要发送电子邮件并继续运行应用程序
以下是电子邮件链接身份验证的资源:https://firebase.google.com/docs/auth/ios/email-link-auth
答案 3 :(得分:0)
此代码表示在某个时候用户已使用Facebook注册,但这并不意味着该用户正在使用此提供程序进行访问。如果用户具有这些提供程序[“ google.com”,“ facebook.com”],它也将返回true。 ??
fileprivate func userHasFBProvider() -> Bool{
var fBProvider = false
guard let providerData = Auth.auth().currentUser?.providerData else {
return fBProvider
}
for userInfo in providerData {
switch userInfo.providerID {
case "facebook.com":
fBProvider = true
default:
fBProvider = false
}
}
return fBProvider
}