我使用了Firebase电话身份验证,经过验证后,我想更新已登录用户的个人资料详细信息。因此,我编写了一个云函数来执行此操作,然后在该函数返回响应后调用user.reload()
方法。但是令我惊讶的是,我的应用程序在我的控制台上注销了:
[错误:flutter / lib / ui / ui_dart_state.cc(177)]未处理的异常:[firebase_auth / user-token-expired]用户的凭证不再有效。用户必须再次登录。
我做了一些研究,发现这是一种安全措施,所以我不得不重新验证用户身份。
这就是我所做的:
Future<Response> updateUserprofile({context, name, 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});
response.success = functionResponse.data['success'];
response.message = functionResponse.data['message'];
_user.reload();
AuthCredential credential = AuthCredential(providerId: PhoneAuthProvider.PROVIDER_ID, signInMethod: PhoneAuthProvider.PHONE_SIGN_IN_METHOD);
await user.reauthenticateWithCredential(credential);
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;
}
}
但是我在控制台上仍然遇到相同的错误:
[错误:flutter / lib / ui / ui_dart_state.cc(177)]未处理的异常:[firebase_auth / user-token-expired]用户的凭证不再有效。用户必须再次登录。
答案 0 :(得分:1)
您正在更新用户的电子邮件。如以下所述,这会使Firebase ID令牌无效:https://firebase.google.com/docs/auth/admin/manage-sessions。
似乎也是预期的行为,如此处所指出的:Firebase Auth - After updating the user's email, Firebase Auth logs out the user。我知道那也是您要尝试做的事吗?
如果user.reload()
返回该异常,则比您以前调用它的情况仍然如此:
AuthCredential credential = AuthCredential(providerId: PhoneAuthProvider.PROVIDER_ID, signInMethod: PhoneAuthProvider.PHONE_SIGN_IN_METHOD);
await user.reauthenticateWithCredential(credential);
也许您应该在重新加载用户之前重新进行身份验证?
我要注意的另一件事是您使用createUser.call
。由于您要更新现有用户的凭据,为什么不使用updateUser
(https://firebase.google.com/docs/auth/admin/manage-users#update_a_user)?