¿Cómo devuelvo una lista de usuarios si uso la autenticación simple de nombre de usuario y contraseña de Firebase?

No estoy seguro de si estoy haciendo algo mal pero usando esta API https://www.firebase.com/docs/security/simple-login-email-password.html Puedo crear un usuario de manera satisfactoria, de acuerdo con el mensaje de devolución, pero no puede ver a ese usuario en ninguna parte de la consola de Forge. ¿Cómo sabes qué usuarios están registrados?

¿Debo tomar el ID de usuario devuelto y crear mi propio objeto de usuario en Firebase o esta duplicación es innecesaria? Necesito agregar algunas propiedades de usuario adicionales así que perhapes Necesitaré hacer esto de todos modos.

Al usar la autenticación de correo electrónico / contraseña en la Autenticación de Firebase (anteriormente conocida como Firebase SimpleLogin), la combinación de correo electrónico y contraseña de su usuario se almacena de forma segura por separado de los datos realmente almacenados en su Firebase.

Esta barrera entre los datos en su Firebase y las combinaciones de hash de correo electrónico / contraseña de los usuarios es por diseño: queremos facilitarle (1) desarrollar su aplicación, (2) prevenir cualquier pérdida accidental de credenciales de usuario, y (3) ) todavía le da flexibilidad total con la forma de almacenar sus datos de usuario en Firebase.

Eso significa que solo almacenamos la combinación de dirección de correo electrónico / hash de contraseña y nada más, por lo que depende de usted decidir cómo almacenar los datos de usuario reales en su Firebase. Tal como sugirió, debe tomar el ID de usuario y almacenar esos datos en su Firebase en una ubicación como / users / $ id, y usar el Lenguaje de reglas de seguridad de Firebase para determinar el acceso de lectura / escritura a esos datos. La id y el email únicos de su usuario ya están en la variable de auth que usará al escribir las reglas.

Aquí creé un progtwig de Android para hacer lo que Rob dijo para los principiantes de Firebase (como yo). Este progtwig primero almacena el nombre de usuario del usuario registrado o registrado y luego los muestra en una lista.

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 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() { @Override public void onComplete(@NonNull Task 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() { @Override public void onComplete(@NonNull Task 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 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); } } 

UserList.java

 public class UserList extends AppCompatActivity { private static final String TAG = "UserList" ; private DatabaseReference userlistReference; private ValueEventListener mUserListListener; ArrayList 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); } } 

}

Puede utilizar la API de Google Identity Toolkit para obtener una lista de todos los usuarios registrados en su proyecto de Firebase, esta API es utilizada por Firebase CLI a la que se puede acceder ejecutando la firebase auth:export results-file

Asegúrese de que la API de Identity Toolkit esté habilitada

firebase-users-list.js

 const serviceAccount = require('path/to/firebase-sdk-json-service-account'); const googleapis = require('googleapis'); const identitytoolkit = googleapis.identitytoolkit('v3'); const authClient = new googleapis.auth.JWT( serviceAccount.client_email, null, serviceAccount.private_key, ['https://www.googleapis.com/auth/firebase'], null ); authClient.authorize((err) => { if (err) { return console.error(err); } let nextPageToken = undefined; let users = []; const getAccounts = () => identitytoolkit.relyingparty.downloadAccount({ auth: authClient, resource: { targetProjectId: serviceAccount.project_id, maxResults: 200, nextPageToken: nextPageToken } }, (e, results) => { if (e) { return console.error(err); } users = users.concat(results.users); if (results.nextPageToken) { nextPageToken = results.nextPageToken; return getAccounts(); } else { console.log(users); } }); getAccounts(); }); 

Lista de usuarios en python:

 from firebase_admin import credentials, db, auth cred = credentials.Certificate('\path\to\serviceAccountKey.json') default_app = firebase_admin.initialize_app(cred, { "databaseURL": "https://data_base_url.firebaseio.com" }) users = auth.list_users()