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正确实现注销

如何使用 Flutter 在 Firebase 中正确登录和注册?

Flutter:一个应用程序中有多个firebase项目,但显示的数据不正确

在 Flutter 中使用 Firebase 然后(Instagram)进行正确的登录架构