如果我使用Firebase简单用户名和密码身份验证,如何返回用户列表

mar*_*ton 57 firebase firebase-authentication

不确定我是否做错了但使用此api https://www.firebase.com/docs/security/simple-login-email-password.html我可以成功创建用户 - 根据回复消息,但我无法在Forge控制台中的任何位置看到该用户.你怎么知道用户注册了什么?

我应该在Firebase中获取返回的用户ID并创建我自己的用户对象,还是不需要复制.我确实需要添加一些额外的用户属性,因此无论如何我都需要这样做.

Rob*_*rco 72

在Firebase身份验证(以前称为Firebase SimpleLogin)中使用电子邮件/密码身份验证时,您的用户的电子邮件和密码组合将与Firebase中实际存储的数据分开安全地存储.

您的Firebase中的数据与用户的电子邮件/密码哈希组合之间的这种障碍是设计的:我们希望您更轻松地(1)开发您的应用程序,(2)防止任何意外的用户凭据泄漏,(3) )仍然可以让您充分灵活地了解如何在Firebase中存储用户数据.

这意味着我们只存储电子邮件地址/密码哈希组合而不存储任何其他内容,因此您可以决定如何在Firebase中存储实际用户数据.根据您的建议,您应该获取用户ID并将该数据存储在Firebase中的位置(例如/ users/$ id),并使用Firebase 安全规则语言来确定对该数据的读/写访问权限.您的用户是唯一的id,email并且已经在auth您编写规则时使用的变量中.

  • 通过控制台访问的用户列表现在又回到了新的Google Firebase中 (7认同)
  • 列出所有创建的用户并删除用户看起来是必须的! (5认同)
  • 这是必须的.​​.....如果管理 SDK 不能跨越用户,那么有点违背用户数据库的目的。 (3认同)
  • 感谢您提供的信息 - 我认为存在依赖关系,如果我为每个用户存储的数据不同步,说意外删除,我怎么知道谁当前可以访问我的应用程序?它的好处是数据是分开的,但肯定是因为我无法从管理POV中看到这一点而被否定了? (2认同)
  • 谢谢弗兰克的回答。但是,如果您正在谈论的单独用户数据库仅存储电子邮件/密码组合(而不是任何其他用户信息),为什么在管理器用户部分 (https://firebase.google.com/docs/auth/web/manage -users) 他们提到了能够保存 `displayName` 和 `photoURL` 的 `user.updateProfile` 方法吗?那么这些信息存储在哪里?它没有保存在我的 Firestore 中 - 我检查过 - 所以我假设它在那个单独的数据库中。如果当前用户是唯一可以看到它的人,这种方法有什么意义? (2认同)

May*_*hwa 10

在这里,我创建了一个Android程序,用于执行Rob为firebase初学者(像我一样)所说的内容.该程序首先存储signedUp或signedIn用户的用户名,然后在listView中显示它们

SignInActivity.java

public class SignInActivity extends BaseActivity implements View.OnClickListener,View.OnKeyListener{

private DatabaseReference mDatabase;
public static FirebaseAuth mAuth;
private static final String TAG = "MainActivity";

EditText usernameField;
EditText passwordField;
TextView changeSignUpModeTextView;
Button signUpButton;
ImageView logo;
RelativeLayout relativeLayout;

Boolean signUpModeActive;
static ArrayList<String> userList = new ArrayList<>();

@Override
public void onStart() {
    super.onStart();

    // Check auth on Activity start
    if (mAuth.getCurrentUser() != null) {
        onAuthSuccess(mAuth.getCurrentUser());
    }
}
@Override
public boolean onKey(View view, int i, KeyEvent keyEvent) {

    if(i == keyEvent.KEYCODE_ENTER && keyEvent.getAction() == keyEvent.ACTION_DOWN){
        signUpOrLogIn(view);
    }
     return false;
}

@Override
public void onClick(View view) {

    if(view.getId() == R.id.changeSignUpMode){

        if (signUpModeActive == true){

            signUpModeActive = false;
            changeSignUpModeTextView.setText("Sign Up");
            signUpButton.setText("Log In");

        }else{

            signUpModeActive = true;
            changeSignUpModeTextView.setText("Log In");
            signUpButton.setText("Sign Up");
        }

    }else if(view.getId() == R.id.logo || view.getId() == R.id.relativeLayout){

        InputMethodManager inm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        inm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);

    }

}


public void signUpOrLogIn(View view) {

    showProgressDialog();
    String email = usernameField.getText().toString().trim();
    String password = passwordField.getText().toString().trim();

    if (signUpModeActive == true) {
        mAuth.createUserWithEmailAndPassword(email,password)
                .addOnCompleteListener(MainActivity.this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        hideProgressDialog();
                        Toast.makeText(MainActivity.this, "createUserWithEmail:onComplete:" + task.isSuccessful(), Toast.LENGTH_SHORT).show();
                        // If sign in fails, display a message to the user. If sign in succeeds
                        // the auth state listener will be notified and logic to handle the
                        // signed in user can be handled in the listener.
                        if (!task.isSuccessful()) {
                            Toast.makeText(MainActivity.this, "Authentication failed." + task.getException().toString().substring(task.getException().toString().indexOf(" ")),
                                    Toast.LENGTH_SHORT).show();
                            Log.i("Error", task.getException().toString());
                        } else {
                            onAuthSuccess(task.getResult().getUser());
                            showUserList();
                        }
                    }
                });
    } else {
        mAuth.signInWithEmailAndPassword(email,password)
                .addOnCompleteListener(MainActivity.this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        hideProgressDialog();
                        // If sign in fails, display a message to the user. If sign in succeeds
                        // the auth state listener will be notified and logic to handle the
                        // signed in user can be handled in the listener.
                        if (!task.isSuccessful()) {
                            // there was an error

                            Toast.makeText(MainActivity.this, task.getException().toString(),
                                    Toast.LENGTH_LONG).show();
                        } else

                        {
                            onAuthSuccess(task.getResult().getUser());
                            showUserList();
                        }
                    }
                });
    }
}

public void showUserList(){
    startActivity(new Intent(getApplicationContext(), UserList.class));
    finish();
}
private void onAuthSuccess(FirebaseUser user) {
    String username = usernameFromEmail(user.getEmail());

    // Write new user
    writeNewUser(user.getUid(), username, user.getEmail());

    // Go to MainActivity

}
private String usernameFromEmail(String email) {
    if (email.contains("@")) {
        return email.split("@")[0];
    } else {
        return email;
    }
}

private void writeNewUser(String userId, String name, String email) {
    User user = new User(name, email);

    mDatabase.child("users").child(userId).setValue(user);
    ArrayList<String> userNames = new ArrayList<>();
    userNames.add(name);
    mDatabase.child("usernamelist").setValue(userNames);
}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mAuth = FirebaseAuth.getInstance();
    mDatabase = FirebaseDatabase.getInstance().getReference();


    if(mAuth.getCurrentUser()!=null){
        showUserList();
    }

    usernameField = (EditText) findViewById(R.id.username);
    passwordField = (EditText) findViewById(R.id.password);
    changeSignUpModeTextView = (TextView) findViewById(R.id.changeSignUpMode);
    signUpButton = (Button) findViewById(R.id.signupbutton);
    logo = (ImageView)findViewById(R.id.logo);
    relativeLayout= (RelativeLayout)findViewById(R.id.relativeLayout);

    signUpModeActive = true;

    changeSignUpModeTextView.setOnClickListener(this);

    usernameField.setOnKeyListener(this);
    passwordField.setOnKeyListener(this);

    logo.setOnClickListener(this);
    relativeLayout.setOnClickListener(this);



}



}
Run Code Online (Sandbox Code Playgroud)

UserList.java

public class UserList extends AppCompatActivity {

private static final String TAG = "UserList" ;
private DatabaseReference userlistReference;
private ValueEventListener mUserListListener;
ArrayList<String> usernamelist = new ArrayList<>();
ArrayAdapter arrayAdapter;;

ListView userListView;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_user_list);
    userlistReference = FirebaseDatabase.getInstance().getReference().child("usernamelist");
    onStart();
    userListView = (ListView) findViewById(R.id.userlistview);


}

@Override
protected void onStart() {
    super.onStart();
    final ValueEventListener userListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            usernamelist = new ArrayList<>((ArrayList) dataSnapshot.getValue());
            usernamelist.remove(usernameOfCurrentUser());
            Log.i(TAG, "onDataChange: "+usernamelist.toString());
            arrayAdapter = new ArrayAdapter(UserList.this,android.R.layout.simple_list_item_1,usernamelist);
            userListView.setAdapter(arrayAdapter);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.w(TAG, "onCancelled: ",databaseError.toException());
            Toast.makeText(UserList.this, "Failed to load User list.",
                    Toast.LENGTH_SHORT).show();
        }
    };
    userlistReference.addValueEventListener(userListener);

    mUserListListener = userListener;
}
public String usernameOfCurrentUser()
{
    String email = MainActivity.mAuth.getCurrentUser().getEmail();
    if (email.contains("@")) {
        return email.split("@")[0];
    } else {
        return email;
    }
}
@Override
public void onStop() {
    super.onStop();

    // Remove post value event listener
    if (mUserListListener != null) {
        userlistReference.removeEventListener(mUserListListener);
    }

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
        case R.id.action_logout:
            FirebaseAuth.getInstance().signOut();
            startActivity(new Intent(this, MainActivity.class));
            finish();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

}


ego*_*ego 5

可以使用云函数来获取用户列表(查看firebase上的文档)。请注意,在以下示例中,自定义声明功能用于检查用户是否具有足够的权限。

// USERS: return full users list for admin
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
import * as admin from 'firebase-admin'
import * as functions from 'firebase-functions'

export const listUsers = functions.https.onCall((data, context) => {
  // check if user is admin (true "admin" custom claim), return error if not
  const isAdmin = context.auth.token.admin === true
  if (!isAdmin) {
    return { error: `Unauthorized.` }
  }

  return admin
    .auth()
    .listUsers()
    .then((listUsersResult) => {
      // go through users array, and deconstruct user objects down to required fields
      const result = listUsersResult.users.map((user) => {
        const { uid, email, photoURL, displayName, disabled } = user
        return { uid, email, photoURL, displayName, disabled }
      })

      return { result }
    })
    .catch((error) => {
      return { error: 'Error listing users' }
    })
})
Run Code Online (Sandbox Code Playgroud)