我了解Firebase团队会在任何敏感数据更新时将用户注销,以作为一项安全措施,因此必须重新验证用户身份。使用其他身份验证方法,我可以简单地要求用户输入密码以更新其电子邮件。但是使用电话验证是不可能的。
所以我使用生成了一个认证凭据
AuthCredential credential = AuthCredential(providerId: PhoneAuthProvider.PROVIDER_ID, signInMethod: PhoneAuthProvider.PHONE_SIGN_IN_METHOD);
在我这样调用auth实例的当前用户之前
await _user.reauthenticateWithCredential(credential);
_user.reload();
但这仍然使我的用户注销,并要求该用户再次登录。
错误:
[错误:flutter / lib / ui / ui_dart_state.cc(177)]未处理的异常:[firebase_auth / user-token-expired]用户的凭证不再有效。用户必须再次登录。
这是我的完整代码
Future<Response> updateUserprofile({context, String name,String email}) async{
User _user = _firebaseAuth.currentUser;
Response response = Response(success: false);
Provider.of<AuthenticationProvider>(context, listen: false).loading = true;
try{
HttpsCallableResult functionResponse = await createUser.call({'displayName': name, 'email':email, 'phoneNumber': _user.phoneNumber});
response.success = functionResponse.data['success'];
response.message = functionResponse.data['message'];
_user.updateProfile(displayName: name);
_user.updateEmail(email);
AuthCredential credential = AuthCredential(providerId: PhoneAuthProvider.PROVIDER_ID, signInMethod: PhoneAuthProvider.PHONE_SIGN_IN_METHOD);
await _user.reauthenticateWithCredential(credential);
_user.reload();
Provider.of<AuthenticationProvider>(context, listen: false).loading = false;
return response;
}catch(e){
Provider.of<AuthenticationProvider>(context, listen: false).loading = false;
response.message = e.message;
return response;
}
}