在Flutter应用中,我使用Firebase的电话号码身份验证作为主要身份验证形式。验证之后,我在users
集合中创建一个具有以下详细信息的用户:
{
phoneNumber: FirebaseAuth.instance.currentUser().phoneNumber,
displayName: 'Comes from user textbox',
...
}
但是说某天某用户想要更改其电话号码。我该怎么做呢?因为我不能简单地在文档中更改用户的电话号码,因为该电话号码需要进行身份验证。验证之后,用户将获得一个新的authUID。那么哪个应该是新用户?
有人可以解释想要保留其个人资料详细信息但更改其号码的用户背后的逻辑。
答案 0 :(得分:1)
为了实现这一点,可以使用FirebaseUser.updatePhoneNumberCredential
。这使您可以更新用户的电话号码。
您将以与首先使用电话号码进行身份验证相同的方式来使用它(使用signInWithCredential
),即,您使用FirebaseAuth.verifyPhoneNumber
来检索凭证并传递从中获取的凭证verificationCompleted
或您的用户输入收到的SMS代码。我仅假定您知道如何执行此任务,因此将仅勾勒出它的外观:
FirebaseAuth.instance.verifyPhoneNumber(
phoneNumber: phoneNumber,
timeout: const Duration(minutes: 2),
verificationCompleted: (credential) async {
await (await FirebaseAuth.instance.currentUser()).updatePhoneNumberCredential(credential);
// either this occurs or the user needs to manually enter the SMS code
},
verificationFailed: null,
codeSent: (verificationId, [forceResendingToken]) async {
String smsCode;
// get the SMS code from the user somehow (probably using a text field)
final AuthCredential credential =
PhoneAuthProvider.getCredential(verificationId: verificationId, smsCode: smsCode);
await (await FirebaseAuth.instance.currentUser()).updatePhoneNumberCredential(credential);
},
codeAutoRetrievalTimeout: null);
调用updatePhoneNumberCredential
时,您可能还想更新数据库文档。另外,您可以听onAuthStateChanged
并以此方式更新文档。
答案 1 :(得分:0)
async function save(phone: string, e) {
e.preventDefault();
const { currentUser:fuser } = firebase.auth();
if(fuser && fuser.phoneNumber !== phone) {
try {
const verifier = new firebase.auth.RecaptchaVerifier('recaptcha-container', {
callback: (response) => console.log('callback', response),
size: 'invisible',
});
const phoneProvider = new firebase.auth.PhoneAuthProvider();
const id = await phoneProvider.verifyPhoneNumber(phone, verifier);
const code = window.prompt('Bitte zugeschickten Code eingeben');
const cred = firebase.auth.PhoneAuthProvider.credential(id, code);
await fuser.updatePhoneNumber(cred);
console.log('phone number changed', id, cred, fuser);
setSuccess(true);
} catch(e) {
console.error(e);
}
}
}