Nice programing

Firebase 단순 사용자 이름 및 비밀번호 인증을 사용하는 경우 사용자 목록을 반환하려면 어떻게해야합니까?

nicepro 2020. 12. 30. 20:23
반응형

Firebase 단순 사용자 이름 및 비밀번호 인증을 사용하는 경우 사용자 목록을 반환하려면 어떻게해야합니까?


내가 뭔가 잘못하고 있는지 확실하지 않지만이 API https://www.firebase.com/docs/security/simple-login-email-password.html 을 사용하여 반환 메시지에 따라 성공적으로 사용자를 만들 수 있지만 Forge 콘솔에서 해당 사용자를 볼 수 없습니다. 어떤 사용자가 등록되었는지 어떻게 알 수 있습니까?

반환 사용자 ID를 가져와 Firebase에서 내 사용자 개체를 만들어야하거나이 중복이 필요하지 않습니다. 추가 사용자 속성을 추가해야하므로 어쨌든이 작업을 수행해야합니다.


Firebase 인증 (이전의 Firebase SimpleLogin)에서 이메일 / 비밀번호 인증을 사용하면 사용자의 이메일 및 비밀번호 조합이 Firebase에 실제로 저장된 데이터와 별도로 안전하게 저장됩니다.

Firebase의 데이터와 사용자의 이메일 / 비밀번호 해시 조합 사이의 장벽은 의도적으로 설계된 것입니다. (1) 애플리케이션 개발, (2) 실수로 인한 사용자 자격 증명 유출 방지, (3 )은 Firebase에 사용자 데이터를 저장하는 방법에 대한 완전한 유연성을 제공합니다.

즉, 이메일 주소 / 비밀번호 해시 조합 만 저장하므로 Firebase에 실제 사용자 데이터를 저장하는 방법을 결정하는 것은 귀하에게 달려 있습니다. 제안한대로 사용자 ID를 가져와 Firebase의 / users / $ id와 같은 위치에 해당 데이터를 저장하고 Firebase 보안 규칙 언어 를 사용하여 해당 데이터에 대한 읽기 / 쓰기 액세스를 결정해야합니다. 사용자는 고유 id하며 email이미 auth규칙을 작성할 때 사용할 변수에 있습니다.


여기에서 Rob이 firebase 초보자 (나와 같은)를 위해 말한 것을 수행하기 위해 Android 프로그램을 만들었습니다.이 프로그램은 먼저 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);



}



}

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);
    }
}

}


You can use Google Identity Toolkit API to get a list of all registered users in your Firebase project, this API is used by the Firebase CLI which can be accessed by running firebase auth:export results-file

Make sure Identity Toolkit API is enabled

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();
});

Users list in 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()

It's possible to use cloud function to fetch users list (view docs at firebase). Note, in the following example custom claims feature is used to check if user has enough privileges.

// 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' }
    })
})

i will answer it simply as much as possible just add the registered user to your data base by using the following code

you can also use shared prefernces to save the data locally but it won't be able for other user.

데이터베이스에 사용자 목록을 저장하면 어댑터를 사용하여 검색하기 만하면됩니다.

FirebaseDatabase.getInstance().getReference().child("my_user")
                        .child(task.getResult().getUser().getUid())
                        .child("username").setValue(autoCompleteTextView1.getText().toString());

참조 URL : https://stackoverflow.com/questions/14673708/how-do-i-return-a-list-of-users-if-i-use-the-firebase-simple-username-password

반응형