Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止同一用户从不同设备登录?我的应用是付费的,所以我不想共享凭据_Java_Firebase_Firebase Authentication - Fatal编程技术网

Java 如何防止同一用户从不同设备登录?我的应用是付费的,所以我不想共享凭据

Java 如何防止同一用户从不同设备登录?我的应用是付费的,所以我不想共享凭据,java,firebase,firebase-authentication,Java,Firebase,Firebase Authentication,我是firebase的新手,但我设法用firebase开发了一个应用程序 -电子邮件和密码验证 此应用程序适用于某个组织的成员,因此该应用程序没有注册,该组织会给我一个列表,我会将其添加到用户列表中。我的问题是,我只有45个注册用户,但有近85个用户正在使用此应用程序。我知道我应该使用身份验证令牌,但我不太清楚。有谁能解释一下我可以同时防止多次登录的最简单方法吗? 我已经附加了登录代码(我试图存储设备名称,但这是一种糟糕的方式),所以有人能帮我做些什么吗 public class EmailLo

我是firebase的新手,但我设法用firebase开发了一个应用程序 -电子邮件和密码验证 此应用程序适用于某个组织的成员,因此该应用程序没有注册,该组织会给我一个列表,我会将其添加到用户列表中。我的问题是,我只有45个注册用户,但有近85个用户正在使用此应用程序。我知道我应该使用身份验证令牌,但我不太清楚。有谁能解释一下我可以同时防止多次登录的最简单方法吗? 我已经附加了登录代码(我试图存储设备名称,但这是一种糟糕的方式),所以有人能帮我做些什么吗

public class EmailLogin extends AppCompatActivity implements
        View.OnClickListener {
    public String  Email;
    private static final String TAG = "EmailPassword";
public  static  int  device = 0;
    private TextView forgoPwd;
    private TextView mDetailTextView;
    private EditText mEmailField;
    private EditText mPasswordField;
    private ProgressDialog PD;
    private CheckBox saveLoginCheckBox;
    private SharedPreferences loginPreferences;
    private SharedPreferences.Editor loginPrefsEditor;
    private Boolean saveLogin;
    // [START declare_auth]
    private FirebaseAuth mAuth;
    // [END declare_auth]
    private DatabaseReference root;
    // [START declare_auth_listener]
    private FirebaseAuth.AuthStateListener mAuthListener;
    // [END declare_auth_listener]
    private String  temp_key;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.emailpass);


        PD = new ProgressDialog(this);
        PD.setMessage("Loading...");
        PD.setCancelable(true);
        PD.setCanceledOnTouchOutside(false);
        // Views

        mEmailField = (EditText) findViewById(R.id.field_email);
        Email = mEmailField.toString();
        mPasswordField = (EditText) findViewById(R.id.field_password);
        Button btnCount = (Button) findViewById(R.id.email_sign_in_button);
       // Button regis = (Button) findViewById(R.id.regis);
        saveLoginCheckBox = (CheckBox)findViewById(R.id.checkBox);
        loginPreferences = getSharedPreferences("loginPrefs", MODE_PRIVATE);
        loginPrefsEditor = loginPreferences.edit();
        saveLogin = loginPreferences.getBoolean("saveLogin", false);
        if (saveLogin == true) {
            mEmailField.setText(loginPreferences.getString("username", ""));
            mPasswordField.setText(loginPreferences.getString("password", ""));
            saveLoginCheckBox.setChecked(true);
        }


        //regis.setOnClickListener(this);
        forgoPwd = (TextView)findViewById(R.id.forgo);
        forgoPwd.setOnClickListener(this);
        // Buttons
        btnCount.setOnClickListener(this);
        //  findViewById(R.id.email_create_account_button).setOnClickListener(this);
        //   findViewById(R.id.sign_out_button).setOnClickListener(this);

        // [START initialize_auth]
        mAuth = FirebaseAuth.getInstance();
        // [END initialize_auth]

        // [START auth_state_listener]
        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // User is signed in
                   Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
                } else {
                    // User is signed out
                    Log.d(TAG, "onAuthStateChanged:signed_out");
                }
                // [START_EXCLUDE]
                updateUI(user);
                // [END_EXCLUDE]
            }
        };
        // [END auth_state_listener]
    }


    public ProgressDialog mProgressDialog;

    public void showProgressDialog() {
        if (mProgressDialog == null) {
            mProgressDialog = new ProgressDialog(this);
            mProgressDialog.setMessage(getString(R.string.loading));
            mProgressDialog.setIndeterminate(true);
        }
    }
    public void hideProgressDialog() {
        if (mProgressDialog != null && mProgressDialog.isShowing()) {
            mProgressDialog.dismiss();
        }
    }
    // [START on_start_add_listener]
    @Override
    public void onStart() {
        super.onStart();
        mAuth.addAuthStateListener(mAuthListener);
    }
    // [END on_start_add_listener]

    // [START on_stop_remove_listener]
    @Override
    public void onStop() {
        super.onStop();
        if (mAuthListener != null) {
            mAuth.removeAuthStateListener(mAuthListener);
        }
    }
    // [END on_stop_remove_listener]

    private void createAccount(String email, String password) {
        Log.d(TAG, "createAccount:" + email);
        if (!validateForm()) {
            return;
        }

        showProgressDialog();

        // [START create_user_with_email]
        mAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        Log.d(TAG, "createUserWithEmail:onComplete:" + task.isSuccessful());

                        // 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(EmailLogin.this, R.string.auth_failed,
                                    Toast.LENGTH_SHORT).show();
                        }

                        // [START_EXCLUDE]
                        hideProgressDialog();
                        // [END_EXCLUDE]
                    }
                });
        // [END create_user_with_email]
    }

    private void signIn(String email, String password) {
        Log.d(TAG, "signIn:" + email);
        if (saveLoginCheckBox.isChecked()) {
            loginPrefsEditor.putBoolean("saveLogin", true);
            loginPrefsEditor.putString("username", mEmailField.getText().toString());
            loginPrefsEditor.putString("password", password);
            loginPrefsEditor.commit();
        } else {
            loginPrefsEditor.clear();
            loginPrefsEditor.commit();
        }
        if (!validateForm()) {
            return;
        }
        PD.show();
        showProgressDialog();

        // [START sign_in_with_email]
        mAuth.signInWithEmailAndPassword(email, password)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        Log.d(TAG, "signInWithEmail:onComplete:" + task.isSuccessful());
                        if (task.isSuccessful())
                        {
                            onAuthSuccess(task.getResult().getUser());
                        }
                        // 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()) {
                            Log.w(TAG, "signInWithEmail:failed", task.getException());
                            Toast.makeText(EmailLogin.this, R.string.auth_failed,
                                    Toast.LENGTH_SHORT).show();
                        }

                        // [START_EXCLUDE]
                        if (!task.isSuccessful()) {

                            //    mStatusTextView.setText(R.string.auth_failed);
                        }PD.dismiss();
                        hideProgressDialog();
                        // [END_EXCLUDE]
                    }
                });
        // [END sign_in_with_email]
    }
    private void onAuthSuccess(FirebaseUser user) {

        if (device == 0)
getDeviceName();
        device++;
        String username = usernameFromEmail(user.getEmail());
        Intent intent = new Intent(getApplicationContext(),Home_screen.class);
        intent.putExtra("user",username);
        startActivity(intent);
        finish();
    }
    public String getDeviceName() {
        String manufacturer = Build.MANUFACTURER;
        String model = Build.MODEL;
        root = FirebaseDatabase.getInstance().getReference().child("users");
        doDb(manufacturer);
    return manufacturer+model ;
    }

    private void doDb(String manu) {
        Map<String,Object> map = new HashMap<String, Object>();
        temp_key = root.push().getKey();
        root.updateChildren(map);
        DatabaseReference mess_root = root.child(temp_key);
        Map<String,Object> map2 = new HashMap<String, Object>();
        String email = FirebaseAuth.getInstance().getCurrentUser().getEmail();
        int index = email.indexOf('@');
        email = email.substring(0,index);
        map2.put("user",email);
        map2.put("msg",manu);
        mess_root.updateChildren(map2);


    }




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

    private boolean validateForm() {
        boolean valid = true;

        String email = mEmailField.getText().toString();
        if (TextUtils.isEmpty(email)) {
            mEmailField.setError("Required.");
            valid = false;
        } else {
            mEmailField.setError(null);
        }

        String password = mPasswordField.getText().toString();
        if (TextUtils.isEmpty(password)) {
            mPasswordField.setError("Required.");
            valid = false;
        } else {
            mPasswordField.setError(null);
        }

        return valid;
    }

    private void updateUI(FirebaseUser user) {
        hideProgressDialog();
        if (user != null) {
            //Timer timer = new Timer();
            //timer.schedule(new TimerTask(){
            //    public void run() {
                    Intent i = new Intent(EmailLogin.this, Home_screen.class);
                    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(i);
                    finish();
                //    return;
              //  }
           // }, 600000);

        }
      /*
        if (user != null) {

            Intent intent = new Intent(getApplicationContext(),Home_screen.class);
            startActivity(intent);
            finish();
            mStatusTextView.setText(getString(R.string.emailpassword_status_fmt, user.getEmail()));
            mDetailTextView.setText(getString(R.string.firebase_status_fmt, user.getUid()));

            findViewById(R.id.email_password_buttons).setVisibility(View.GONE);
            findViewById(R.id.email_password_fields).setVisibility(View.GONE);

        } */



        else {
//            mStatusTextView.setText(R.string.signed_out);
            //          mDetailTextView.setText(null);

            //   findViewById(R.id.email_password_buttons).setVisibility(View.VISIBLE);
            //  findViewById(R.id.email_password_fields).setVisibility(View.VISIBLE);

        }
    }

    @Override
    public void onClick(View v) {
        int i = v.getId();

        if (i == R.id.email_sign_in_button) {
            signIn(mEmailField.getText().toString(), mPasswordField.getText().toString());
        }
        //if(i == R.id.regis)
        {

        }
        if(i == R.id.forgo) {

            FirebaseAuth auth = FirebaseAuth.getInstance();
            String mail =  mEmailField.getText().toString();
            if (TextUtils.isEmpty(mail)) {
                mEmailField.setError("Required.");

            } else {
                auth.sendPasswordResetEmail(mEmailField.getText().toString())
                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if (task.isSuccessful()) {
                                    Toast.makeText(EmailLogin.this, "Email sent to your account",
                                            Toast.LENGTH_SHORT).show();
                                }
                            }
                        });
            }

        }
    }


}
public类EmailLogin扩展了AppCompatActivity实现
View.OnClickListener{
公共字符串电子邮件;
私有静态最终字符串TAG=“EmailPassword”;
公共静态int设备=0;
私有文本视图forgoPwd;
私有文本视图mDetailTextView;
私有编辑文本mEmailField;
私有编辑文本mPasswordField;
私营部门;
私有复选框saveLoginCheckBox;
私人共享参考登录参考;
私有共享引用编辑器登录引用编辑器;
私有布尔存储登录;
//[开始声明\u验证]
私人消防队;
//[结束声明授权]
私有数据库引用根;
//[启动声明\u验证\u侦听器]
私有FirebaseAuth.AuthStateListener mAuthListener;
//[结束声明\u验证\u侦听器]
私有字符串临时密钥;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(窗口。功能\u无\u标题);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_全屏,
WindowManager.LayoutParams.FLAG(全屏);
setContentView(R.layout.emailpass);
PD=新进度对话框(本);
PD.setMessage(“加载…”);
PD.可设置可取消(真);
PD.SetCanceledOnTouchOut(假);
//观点
mEmailField=(EditText)findViewById(R.id.field\u电子邮件);
Email=mEmailField.toString();
mPasswordField=(EditText)findViewById(R.id.field\u密码);
按钮btnCount=(按钮)findViewById(R.id.email\u sign\u in\u按钮);
//按钮regis=(按钮)findViewById(R.id.regis);
saveLoginCheckBox=(复选框)findViewById(R.id.CheckBox);
loginPreferences=getSharedReferences(“loginPrefs”,MODE\u PRIVATE);
loginpreferenceditor=loginPreferences.edit();
saveLogin=loginPreferences.getBoolean(“saveLogin”,false);
if(saveLogin==true){
mEmailField.setText(loginPreferences.getString(“用户名”);
mPasswordField.setText(loginPreferences.getString(“密码”);
saveLoginCheckBox.setChecked(true);
}
//regis.setOnClickListener(此);
forgoPwd=(TextView)findViewById(R.id.forgo);
forgoPwd.setOnClickListener(此);
//钮扣
btnCount.setOnClickListener(此);
//findViewById(R.id.email\u create\u account\u按钮);
//findviewbyd(R.id.sign\u out\u按钮);
//[开始初始化\u验证]
mAuth=FirebaseAuth.getInstance();
//[结束初始化\u验证]
//[启动身份验证状态侦听器]
mAuthListener=new FirebaseAuth.AuthStateListener(){
@凌驾
AuthStateChanged上的公共void(@NonNull FirebaseAuth FirebaseAuth){
FirebaseUser=firebaseAuth.getCurrentUser();
如果(用户!=null){
//用户已登录
Log.d(标记为“+user.getUid()”);
}否则{
//用户已注销
Log.d(标记“onAuthStateChanged:signed_out”);
}
//[开始时不包括]
updateUI(用户);
//[完]
}
};
//[结束身份验证状态侦听器]
}
公共进程对话;
public void showProgressDialog(){
如果(mProgressDialog==null){
mProgressDialog=新建进度对话框(此);
setMessage(getString(R.string.load));
mProgressDialog.setUndeterminate(true);
}
}
public void hideProgressDialog(){
if(mProgressDialog!=null&&mProgressDialog.isShowing()){
mProgressDialog.disclose();
}
}
//[启动\u启动\u添加\u侦听器]
@凌驾
public void onStart(){
super.onStart();
mAuth.addAuthStateListener(mAuthListener);
}
//[结束于\u开始\u添加\u侦听器]
//[启动\u停止\u删除\u侦听器]
@凌驾
公共void onStop(){
super.onStop();
if(mAuthListener!=null){
removeAuthStateListener(mAuthListener);
}
}
//[结束于\u停止\u删除\u侦听器]
私有void createAccount(字符串电子邮件、字符串密码){
Log.d(标记“createAccount:”+电子邮件);
如果(!validateForm()){
返回;
}
showProgressDialog();
//[使用电子邮件开始创建用户]
mAuth.createUserWithEmailAndPassword(电子邮件,密码)
.addOnCompleteListener(这是新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
Log.d(标记为“createUserWithEmail:onComplete:”+task.isSuccessful());
//如果登录失败,则向用户显示消息。如果登录成功
//将通知身份验证状态侦听器,并使用逻辑来处理
//可以在侦听器中处理已登录用户。
如果(!task.issusccessful()){
吐司
activeDeviceByUser
  <uid>: <device ID>