处理 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 实时数据库用户 ID 与 Firebase 身份验证 UID 不匹配?