处理 Firebase 身份验证和数据库实时之间事务的最佳方式

Posted

技术标签:

【中文标题】处理 Firebase 身份验证和数据库实时之间事务的最佳方式【英文标题】:Best way to handle a transaction between Firebase Authentication and Database realtime 【发布时间】:2018-07-23 01:09:56 【问题描述】:

成功创建新用户帐户后,使用 Firebase 身份验证,我尝试再次请求在 Firebase 数据库中创建他的个人资料(姓名、电子邮件和电话),但如果第二次请求失败,我将拥有一个用户没有个人资料,这种情况是不可能的,因为他在登录时将无法编辑他的个人资料,所以目前我正在删除这个最近在 Firebase Auth 中创建的用户,以允许他重试创建,但是它不能解决问题,因为删除请求也可能失败。在 Firebase 中处理交易的最佳方式是什么,让用户和他的个人资料都成功创建或都没有?

 private void attemptToCreateAccount(final Credentials cred) 
        getCompositeDisposable().add(
                getAuthService().createAccount(cred)
                        .subscribeOn(getSchedulerProvider().io())
                        .observeOn(getSchedulerProvider().ui())
                        .subscribeWith(new DisposableSingleObserver<User>() 
                            @Override
                            public void onSuccess(User user) 
                                 addUserProfileToDatabase(user.getEmail(), user.getUserUid(), cred.getUsername(), cred.getPassword());
                            

                            @Override
                            public void onError(Throwable e) 
                                getView().showMessage(e.toString());
                            
                        )
        );
    

--------------------------

 private void addUserProfileToDatabase(final String email, final String userUid, final String name, final String password) 
        final Profile profile = new Profile("", "", "", email, "", name);
        getCompositeDisposable().add(
                getDatabaseSource().createNewProfileToUser(userUid, profile)
                .subscribeOn(getSchedulerProvider().io())
                .observeOn(getSchedulerProvider().ui())
                .subscribeWith(new DisposableCompletableObserver()
                    @Override
                    public void onComplete() 
                        getView().saveUserData(userUid, email, name);
                        getView().goToProfilePageActivity();
                    

                    @Override
                    public void onError(Throwable e) 
                        // TODO RETRY OPERATION OR DELETE THE CURRENT CREATED USER
                        getView().showMessage(e.getLocalizedMessage());
                        deleteUserCreatedWithoutProfile(email, password);
                    
                )
        );
    

    --------------------------

private void deleteUserCreatedWithoutProfile(String email, String password)
        getCompositeDisposable().add(
                getDatabaseSource().deleteUser(email, password)
                .observeOn(getSchedulerProvider().io())
                .observeOn(getSchedulerProvider().ui())
                .subscribeWith(new DisposableCompletableObserver()

                    @Override
                    public void onComplete() 
                        Log.e("FIREBASE", "user deleted because profile could not be created successfully");
                    

                    @Override
                    public void onError(Throwable e) 
                        Log.e("FIREBASE", "Houston We have a problem. User was created without a profile.");
                    
                )
        );
    

【问题讨论】:

【参考方案1】:

不需要 FirebaseDatabase 你可以在这里存储用户信息 firebaseAuth 你怎么做

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
        .setDisplayName("Jane Q. User")
        .setPhotoUri(Uri.parse("https://example.com/jane-q-user/profile.jpg"))
        .build();

user.updateProfile(profileUpdates)
        .addOnCompleteListener(new OnCompleteListener<Void>() 
            @Override
            public void onComplete(@NonNull Task<Void> task) 
                if (task.isSuccessful()) 
                    Log.d(TAG, "User profile updated.");
                
            
        );

更多信息请访问link

【讨论】:

我没有使用 FirebaseAuth,因为我可能需要保存一些默认情况下不存在的信息,例如 phoneNumber 和 CellPhoneNumber

以上是关于处理 Firebase 身份验证和数据库实时之间事务的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

成功身份验证后,Flutter Firebase 数据库权限被拒绝

Firebase 实时数据库中有关身份验证的信息

为啥注册用户后 Firebase 实时数据库用户 ID 与 Firebase 身份验证 UID 不匹配?

如何将 Firebase 身份验证链接到实时数据库?

用于 Firebase 实时数据库/Firebase 身份验证的 Android 唯一密钥

如何在 vue 上处理 Firebase 身份验证