在我当前的项目中,我先用电子邮件ID注册一个用户,然后在该用户更新电话号码时在个人资料部分中注册该电话号码,并对我的电话号码进行身份验证,并使用PhoneAuthCredetials合并同一用户的两种身份验证方法。
现在真正的麻烦是,我的用户可以使用电话号码或电子邮件ID登录,但对于电子邮件ID,用户必须输入密码,而对于电话号码,则需要输入OTP。
(我尝试过,输入了signInWithEmailAndPassword()
的电话号码和密码,但是没有用)
我希望用户使用带有密码的电子邮件或电话登录。 Flipkart的方式。
有什么办法可以解决这个问题?
答案 0 :(得分:3)
当前,此功能不存在。
但是,有一些方法可以即兴发挥并仍然可以实现。这是我的建议:
首先,当用户创建一个帐户时,您需要在数据库上创建一个单独的列表,仅用于将电子邮件映射到电话号码。您的数据库可能看起来像这样:
这样,您将获得电子邮件及其链接电话号码的完整列表。
现在,在登录阶段,请执行以下操作:
当用户单击登录按钮时,请检查用户是否输入了电子邮件或电话号码。您可以使用Patterns类执行此检查:
如果用户输入了电子邮件,请继续使用signInWithEmailAndPassword()
方法。
signInWithEmailAndPassword()
并传递您收到的电子邮件以及用户输入的密码。使用此方法的缺点是,它会产生一个额外的呼叫(从电话号码中获取电子邮件),但至少应该可以。
我真的希望这对您有所帮助,编码愉快!
答案 1 :(得分:3)
使用以下代码创建云功能
const functions = require('firebase-functions');
const firebase = require('firebase');
const admin = require('firebase-admin');
admin.initializeApp();
firebase.initializeApp({
//Add config for web-app here
//Required because Admin SDK doesn't include signInWithEmailAndPassword method
});
exports.signInWithPhoneAndPassword = functions.https.onCall(async (data, context) => {
const phoneNumber = data.phone;
if (phoneNumber === undefined) {
return {'s':400,'m':'Bad argument: no phone number'};
}
const user = await admin.auth().getUserByPhoneNumber(phoneNumber);
const pass = data.password;
try {
await firebase.auth().signInWithEmailAndPassword(user.email, pass);
} catch (e) {
return {'s':400,'m':'Wrong password'};
}
const token = await admin.auth().createCustomToken(user.uid, {'devClaim':true}); //developer claims, optional param
return {'s':200,'t':token};
});
在客户端调用此函数,如果它返回带有"s"==200
的对象,则使用带有signInWithCustomToken
(Calling a Cloud Function from Android through Firebase)的令牌
答案 2 :(得分:1)
Firebase电话身份验证正在使用OTP。这样,无需记住用户密码。一旦通过身份验证,您将被注册。 OTP代码充当密码。不过,如果您想自定义身份验证方法,firebase会提供自定义身份验证方法https://firebase.google.com/docs/auth/android/custom-auth