FireBaseUI Auth - 如何知道帐户是来自新注册用户还是现有用户?

Posted

技术标签:

【中文标题】FireBaseUI Auth - 如何知道帐户是来自新注册用户还是现有用户?【英文标题】:FireBaseUI Auth - how to know if account is from a new signup or existing user? 【发布时间】:2018-08-27 02:27:16 【问题描述】:

我正在使用firebaseUI for authentication。它本质上是打开一个外部活动并将用户登录到 firebase 并在 onActivityResult 中向开发人员发送回调。它很好用,问题是我需要知道用户是新注册用户还是现有用户。是否有任何类型的元数据或我可以用来知道这一点的东西?这是我目前在 JAVA android 中所拥有的:

    private void ititFireBaseUi() 

       AuthUI.getInstance()
               .signOut(getActivity())
               .addOnCompleteListener(new OnCompleteListener<Void>() 
                   public void onComplete(@NonNull Task<Void> task) 
                       // Choose authentication providers
                       List<AuthUI.IdpConfig> providers = Arrays.asList(
                               new AuthUI.IdpConfig.Builder(AuthUI.EMAIL_PROVIDER).build(),
                               new AuthUI.IdpConfig.Builder(AuthUI.PHONE_VERIFICATION_PROVIDER).build(),
                               new AuthUI.IdpConfig.Builder(AuthUI.GOOGLE_PROVIDER).build(),
                               new AuthUI.IdpConfig.Builder(AuthUI.FACEBOOK_PROVIDER).build());
                       //new AuthUI.IdpConfig.Builder(AuthUI.TWITTER_PROVIDER).build());

// Create and launch sign-in intent
                       startActivityForResult(
                               AuthUI.getInstance()
                                       .createSignInIntentBuilder()
                                       .setAvailableProviders(providers)
                                       .setLogo(R.drawable.logo)
                                       .build(),
                               RC_SIGN_IN);
                   
               );

   

然后是结果:

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == RC_SIGN_IN) 
            IdpResponse response = IdpResponse.fromResultIntent(data);
//I WOULD LIKE TO KNOW HERE IF THE USER IS A NEW USER OR EXISTING USER
            String msg = "";
            if (resultCode == RESULT_OK) 
                // Successfully signed in
                FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                msg = "generating token with email:" + user.getEmail();

                Timber.d(msg);
                Toast.makeText(getActivity(), msg, Toast.LENGTH_LONG).show();

                presenter.generateTokenWithFireBase(user);
                // ...
             else 
                // Sign in failed, check response for error code

            
        
    

我看到meta class 可能对我有帮助,但我不知道如何使用它。

gradle : 实现 'com.firebaseui:firebase-ui-auth:3.2.2'

【问题讨论】:

【参考方案1】:

不要使用创建和登录时间戳比较。我发现它不可靠。

IdpResponse 有一个isNewUser() 方法可以告诉您登录是否是新帐户。

【讨论】:

【参考方案2】:
public boolean isNewSignUp()
        FirebaseUserMetadata metadata = mAuth.getCurrentUser().getMetadata();
        return metadata.getCreationTimestamp() == metadata.getLastSignInTimestamp();
    

在撰写本文时,看起来每个登录的用户都有我怀疑的元数据。我们可以检查最后一次登录时间以了解它是否是新帐户。我听说他们将来会让这更容易,在尝试之前检查更高版本的 firebase 身份验证。

【讨论】:

在进行匿名注册时遇到了问题。当用户向提供者注册时,additionalUserInfo 的 isNewUser() 将始终返回 false。这个答案解决了我的问题。 @Frank van Puffelen 为什么会这样? 元数据刷新需要 1 分钟。不是实时的。 所以?在登录后直接完成时,您的方法是否总是返回 true? 。每次通话之间只需等待 1 分钟。如果用户在一分钟后创建,它将返回 false。 Firebase UI 团队向我解释了这一点

以上是关于FireBaseUI Auth - 如何知道帐户是来自新注册用户还是现有用户?的主要内容,如果未能解决你的问题,请参考以下文章

FirebaseUI for Web — 身份验证 — 如何重新进行身份验证?

如何自定义 FirebaseUI-Web 的主题

Firebase Auth 与 firebaseui-web 在身份验证后不会重定向

禁用帐户选择器 FirebaseUI React

FirebaseUI Auth - Facebook 登录错误:来自 Facebook 的 debug_token 响应不成功

Firebase UI - Auth - 使用自己的布局