Flutter Firebase - 未能正确删除经过 Google 身份验证的用户
Posted
技术标签:
【中文标题】Flutter Firebase - 未能正确删除经过 Google 身份验证的用户【英文标题】:Flutter Firebase - failing to properly delete a Google authenticated user 【发布时间】:2021-03-07 18:00:20 【问题描述】:我正在尝试但未能重新触发用户在删除用户后使用 Google 登录对自己进行身份验证时所执行的身份验证步骤。在第二次使用 Google 登录时,被删除的用户只需立即登录(而不是通过身份验证步骤)。我希望能够为自己的测试目的重新触发身份验证步骤。
具体来说,我有一个用户,我已经按照FlutterFire documentation 进行了身份验证和登录,即
Future<UserCredential> signInWithGoogle() async
// Trigger the authentication flow
final GoogleSignInAccount googleUser = await GoogleSignIn().signIn();
// Obtain the auth details from the request
final GoogleSignInAuthentication googleAuth = await googleUser.authentication;
// Create a new credential
final GoogleAuthCredential credential = GoogleAuthProvider.credential(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
);
// Once signed in, return the UserCredential
return await FirebaseAuth.instance.signInWithCredential(credential);
然后我继续删除用户;再次,根据FlutterFire documentation,即
try
await FirebaseAuth.instance.currentUser.delete();
catch on FirebaseAuthException (e)
if (e.code == 'requires-recent-login')
print('The user must reauthenticate before this operation can be executed.');
这行得通,因为用户不再列在 Firebase 控制台中经过身份验证的用户中。 然而,如果我现在再次调用 signInWithGoogle(),那么用户不会再次通过身份验证步骤(即被提示输入电子邮件、密码等),而是只需签名即可马上。就好像用户没有被正确删除一样。我将如何重新触发身份验证步骤?
【问题讨论】:
删除后注销用户。 @DougStevenson 我现在刚刚尝试过,即在await FirebaseAuth.instance.currentUser.delete();
之后立即调用await FirebaseAuth.instance.signOut()
。我仍然看到相同的行为。
可能流程有点自动化,这意味着如果您使用物理设备进行测试,Google 的身份验证凭据会被重新识别?
@Julian2611 我正在用安卓模拟器测试它。
我明白了。你能以某种方式验证模拟器不记得你的谷歌登录凭据吗?也许通过重置一些设置?因为我认为这可能是问题所在,因为我在使用 firebase 和 Angular 时观察到了类似的行为。
【参考方案1】:
您还必须在Firebase
退出或删除后调用GoogleSignIn().signOut()
。
【讨论】:
是的,就是这样;这样做,以及清除存储在模拟器中的凭据(如@Julian2611 所建议)解决了我的问题。谢谢。【参考方案2】:在我的情况下,我必须在删除函数 try-catch 中重新验证 firebase 用户,因为 currentUser() 总是返回 null 并且 GoogleSignIn().signOut()
不起作用。也许是一个错误。
import 'package:google_sign_in/google_sign_in.dart';
import 'package:firebase_auth/firebase_auth.dart';
final GoogleSignIn _googleSignIn = GoogleSignIn();
final FirebaseAuth _auth = FirebaseAuth.instance;
//will need to sign in to firebase auth again as currentUser always returns null
//this try-catch block should be inside the function that deletes user
try
//FirebaseUser user = await _auth.currentUser(); //returns null so useless
//signin to google account again
GoogleSignInAccount googleSignInAccount = await _googleSignIn.signIn();
GoogleSignInAuthentication googleSignInAuthentication =
await googleSignInAccount.authentication;
//get google credentials
AuthCredential credential = GoogleAuthProvider.getCredential(
idToken: googleSignInAuthentication.idToken,
accessToken: googleSignInAuthentication.accessToken);
//use credentials to sign in to Firebase
AuthResult authResult = await _auth.signInWithCredential(credential);
//get firebase user
FirebaseUser user = authResult.user;
print(user.email);
//delete user
await user.delete();
//signout from google sign in
await _googleSignIn.signOut();
catch (e)
print('Failed to delete user ' + e.toString());
【讨论】:
以上是关于Flutter Firebase - 未能正确删除经过 Google 身份验证的用户的主要内容,如果未能解决你的问题,请参考以下文章
Flutter 和 Firebase:从 Firebase 中的数组中删除项目(地图)
如何从 Flutter 应用程序中删除 firebase 用户? [复制]
如何使用 Flutter 在 Firebase 中正确登录和注册?