我正在尝试找出一种干净而简单的方法来获取在使用Java SDK时调用uid
所产生的createUser()
。使用Javascript SDK(例如this question/answer)时很容易做到这一点。我还在context of the Firebase iOS API中看到了Stackoverflow上提出的问题,显然这并不容易。我的问题是如何使用Firebase Java SDK。具体来说,我的用例与iOS相关问题中的用例相同,即允许管理员用户创建用户帐户(电子邮件/密码身份验证),并以uid为密钥在Firebase中存储有关创建用户的其他信息。了解并使用uid作为密钥至关重要,因为它是安全规则的基础。
我已经看到了几个建议的解决方案,这两个解决方案都涉及在创建新用户帐户后执行的一些过程。这些是
无论哪种方式,我都有一个带有多个异步回调的复杂解决方案来处理使用Javascript API时微不足道的问题。
因此,我有三个具体问题:
createUser()
API与Javascript版本相同?更新:深入挖掘并尝试一下,我找到了问题的答案。事实证明,Firebase提供的API文档已过时和/或不一致。
Re Q1:根据Javadoc for createUser(),唯一可用的回调处理程序是Firebase.ResultHandler
。但是,根据Changelog,API Reference document和Creating User Accounts上的文档,也可以使用Firebase.ValueResultHandler
。这提供了对UID的直接访问
Re Q2:答案是肯定的。验证新创建的用户帐户会导致替换auth
令牌。
问题3:真正的问题应该是“什么时候Firebase人员会更新Javadoc?”或者更好的问题是“为什么在没有更新和准确的文档的情况下发布SDK的新版本?”
答案 0 :(得分:3)
以下代码是处理创建新用户的正确方法
Firebase ref = new Firebase("https://<YOUR-FIREBASE>.firebaseio.com");
ref.createUser("harry@foo.com", "badPassword", new Firebase.ValueResultHandler<Map<String, Object>>() {
public void onSuccess(Map<String, Object> result) {
System.out.println("New account with uid: " + result.get("uid"));
}
public void onError(FirebaseError firebaseError) {
// there was an error
}
});
我已经更新了问题以解释原因。
答案 1 :(得分:0)
试试这个。这适用于最新版Google I / O中出现的较新版本的Firebase。我没有宣传这个新版本或者放弃旧版本。我只是说这是上述解决方案的替代方案:
mAuth = FirebaseAuth.getInstance();
//creates the user with email and password...make this another type of login if you want
mAuth.createUserWithEmailAndPassword(mEmail, mPassword).addOnCompleteListener(signup.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
//do something
}
}
});
现在您可以添加AuthStateListener。您必须将代码放在onCreate,onStart和onStop方法中。请注意,上述代码可以采用任何合理的方法(例如onCreate,onStart,onResume等)。我们走了:
FirebaseAuth mAuth;
FirebaseAuth.AuthStateListener mAuthListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_something);
mAuth = FirebaseAuth.getInstance();
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if(user != null){
//check for null to prevent NullPointerException when dealing with user
if(!user.getUid().matches("")){
//make this check just in case...I've experienced unexplainable glitches here
String uid = user.getUid();
//do more stuff with Uid
}
}
}
}
}
@Override
public void onStart(){
super.onStart();
mAuth.addAuthStateListener(mAuthListener);
}
@Override
public void onStop(){
super.onStop();
if(mListener != null){
mAuth.removeAuthStateListener(mAuthListener);
}
}
最后,发生的事情是,一旦用户被创建(并同时登录),mAuthListener就会进行回调(它会执行mAuthListener中的任何内容,在这种情况下,它会获取用户的内容) UID并用它做其他事情)。如果您在Android中需要有关此新Firebase的帮助,可以使用以下链接来帮助您:https://firebase.google.com/docs/android/setup