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 — 身份验证 — 如何重新进行身份验证?
Firebase Auth 与 firebaseui-web 在身份验证后不会重定向
FirebaseUI Auth - Facebook 登录错误:来自 Facebook 的 debug_token 响应不成功