2013-02-03 13 views
46

का उपयोग करता हूं तो मैं उपयोगकर्ताओं की एक सूची कैसे लौटा सकता हूं, यह सुनिश्चित नहीं है कि मैं कुछ गलत कर रहा हूं लेकिन इस एपीआई https://www.firebase.com/docs/security/simple-login-email-password.html का उपयोग करके मैं सफलतापूर्वक उपयोगकर्ता बना सकता हूं - वापसी संदेश के अनुसार, लेकिन मैं कर सकता हूं फोर्ज कंसोल में कहीं भी उस उपयोगकर्ता को न देखें। आप कैसे जानते हैं कि उपयोगकर्ता क्या पंजीकृत हैं?यदि मैं फ़ायरबेस सरल उपयोगकर्ता नाम और पासवर्ड प्रमाणीकरण

क्या मुझे वापसी उपयोगकर्ता आईडी लेनी चाहिए और फ़ायरबेस में अपना स्वयं का उपयोगकर्ता ऑब्जेक्ट बनाना चाहिए या यह डुप्लिकेशंस अनावश्यक है। मुझे कुछ अतिरिक्त उपयोगकर्ता गुण जोड़ने की ज़रूरत है, इसलिए पेहैप्स मुझे वैसे भी ऐसा करने की आवश्यकता होगी।

+0

@Frank_van_Puffelen मैं के बारे में एक बहुत खोज की है विषय लेकिन कोई समाधान नहीं मिला है, कृपया मेरी मदद करें। –

उत्तर

57

फ़ायरबेस सॉफ़्टवेयर (जिसे पहले फायरबेस सरललॉगिन के नाम से जाना जाता है) में ईमेल/पासवर्ड प्रमाणीकरण का उपयोग करते समय, आपके उपयोगकर्ता का ईमेल और पासवर्ड संयोजन सुरक्षित रूप से आपके फ़ायरबेस में संग्रहीत डेटा से अलग से संग्रहीत किया जाता है।

आपके फ़ायरबेस और आपके उपयोगकर्ताओं के ईमेल/पासवर्ड हैश संयोजन में डेटा के बीच यह बाधा डिज़ाइन द्वारा है: हम आपके लिए (1) अपने आवेदन को विकसित करना आसान बनाना चाहते हैं, (2) किसी आकस्मिक उपयोगकर्ता प्रमाणिक रिसाव को रोकें , और (3) अभी भी आपको फायरबेस में अपने उपयोगकर्ता डेटा को स्टोर करने के तरीके के साथ कुल लचीलापन देता है।

इसका मतलब है कि हम केवल ईमेल पता/पासवर्ड हैश संयोजन को स्टोर करते हैं और कुछ भी नहीं, इसलिए यह तय करने के लिए आप अपने फ़ायरबेस में वास्तविक उपयोगकर्ता डेटा को कैसे स्टोर करते हैं। जैसा कि आपने सुझाव दिया है, आपको उस उपयोगकर्ता को उस डेटा को पढ़ने/लिखने के लिए निर्धारित करने के लिए उपयोगकर्ता आईडी लेना चाहिए और उस डेटा को अपने फ़ायरबेस में/उपयोगकर्ता/$ आईडी जैसे स्थान पर फायरबेस Security Rules Language का उपयोग करना चाहिए। आपके उपयोगकर्ता का अद्वितीय id और email पहले से ही auth वैरिएबल में हैं जो आप नियम लिखते समय उपयोग करेंगे।

+2

जानकारी के लिए धन्यवाद - मुझे लगता है कि वहां एक निर्भरता है, हालांकि, यदि मैं प्रति उपयोगकर्ता डेटा को सिंक से बाहर करता हूं, तो गलती से हटा दिया जाता है, मैं कैसे जानूंगा कि वर्तमान में मेरे एप्लिकेशन का उपयोग कौन कर सकता है? यह अच्छा है कि डेटा अलग है लेकिन निश्चित रूप से इस तथ्य से नकार दिया गया है कि मैं इसे प्रशासन पीओवी से नहीं देख सकता हूं? – markbarton

+0

फ़ायरबेस कंसोल में उपयोगकर्ताओं को (पासवर्ड के बिना) की एक सूची होती थी, उन्हें हटाने की क्षमता के साथ, लेकिन अब यह चला गया है। कोई मौका जो वापस जोड़ा जाएगा? – georgedyer

+0

हम इसे किसी बिंदु पर जोड़ देंगे, लेकिन मेरे पास अभी तक एक ठोस टाइमलाइन नहीं है।एक बार जब हमने इस पर प्रगति की है तो मैं यहां फॉलो-अप करूंगा - आपकी प्रतिक्रिया के लिए धन्यवाद! –

9

यहाँ मैं पहले signedUp या signedIn उपयोगकर्ता के उपयोगकर्ता नाम की दुकान है और फिर उन्हें सूचीदृश्य में प्रदर्शित there.this कार्यक्रम बाहर क्या रोब firebase शुरुआत के लिए कहा करने के लिए (मेरे जैसे) एक Android कार्यक्रम बनाया

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

}

3

आप Google Identity Toolkit API उपयोग कर सकते हैं अपने Firebase परियोजना में सभी पंजीकृत उपयोगकर्ताओं की एक सूची प्राप्त करने के लिए, इस एपीआई Firebase CLI जो firebase auth:export results-file

चलाकर पहुँचा जा सकता है द्वारा किया जाता है सुनिश्चित करें कि पहचान टूलकिट एपीआई बनाओ सक्षम किया गया है

firebase-उन-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(); 
}); 
संबंधित मुद्दे