Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.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 通过谷歌登录自动登录,无需SharedReference_Java_Android_Firebase_Google Signin - Fatal编程技术网

Java 通过谷歌登录自动登录,无需SharedReference

Java 通过谷歌登录自动登录,无需SharedReference,java,android,firebase,google-signin,Java,Android,Firebase,Google Signin,我已尝试将静默登录作为 我试图通过regex限制其他域登录,我不知道是否还有其他方法,我在Firebase登录中看到了“hd”参数,但实现失败 编辑1:修复代码,现在静默登录不起作用。代码是冗余的,GoogleAppClient也被弃用 我已经看到了使用SharedReferences保存登录令牌的答案,但保存令牌安全吗 我一直在跟踪调查 MainActivity.java mAuth = FirebaseAuth.getInstance(); if(mAuth

我已尝试将静默登录作为

我试图通过regex限制其他域登录,我不知道是否还有其他方法,我在Firebase登录中看到了“hd”参数,但实现失败

编辑1:修复代码,现在静默登录不起作用。代码是冗余的,GoogleAppClient也被弃用

我已经看到了使用SharedReferences保存登录令牌的答案,但保存令牌安全吗

我一直在跟踪调查

MainActivity.java

        mAuth = FirebaseAuth.getInstance();

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

        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();

        mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this, this)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();

       //Show sign-in and sign-out buttons

    public void silentLogin() {
        OptionalPendingResult<GoogleSignInResult> pendingResult =
                Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient);
        if (pendingResult != null) {
            handleGooglePendingResult(pendingResult);
        } else {
            signIn();
        }
    }
        private void handleGooglePendingResult(OptionalPendingResult<GoogleSignInResult> pendingResult) {
        if (pendingResult.isDone()) {
            GoogleSignInResult signInResult = pendingResult.get();
            onSilentSignInCompleted(signInResult);
        } else {
            pendingResult.setResultCallback(new ResultCallback<GoogleSignInResult>() {
                @Override
                public void onResult(@NonNull GoogleSignInResult signInResult) {
                    onSilentSignInCompleted(signInResult);
                }
            });
        }
    }

    private void onSilentSignInCompleted(GoogleSignInResult signInResult) {
        GoogleSignInAccount signInAccount = signInResult.getSignInAccount();
        if (signInAccount != null) {
            //Show sign out button
        }
        else {
            signIn();
        }
    }

    private void signIn(){
        Intent signInIntent = mGoogleSignInClient.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == RC_SIGN_IN){
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            handleSignInResult(task);
        }
    }

    private void handleSignInResult(Task<GoogleSignInAccount> completedTask){
        try{
            GoogleSignInAccount acc = completedTask.getResult(ApiException.class);
            FirebaseGoogleAuth(acc);
        }
        catch (ApiException e){
            //Show error
            FirebaseGoogleAuth(null);
        }
    }

    private void FirebaseGoogleAuth(GoogleSignInAccount acct) {
        if (acct != null) {
            AuthCredential authCredential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
            mAuth.signInWithCredential(authCredential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        updateUI(null);
                    }
                }
            });
        }
        else{
            // Auth failed
        }
    }

    private void updateUI(FirebaseUser fUser){
        GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(getApplicationContext());
        if(account !=  null){
            String personName = account.getDisplayName();
            String personEmail = account.getEmail();

            if (personEmail != null) {
                if(personEmail.endsWith("gmail.com"))
                {
                    //Show details
                }
                    else
                    {
                        mGoogleSignInClient.signOut();
                        Toast.makeText(MainActivity.this,"Login with gmail account only",Toast.LENGTH_SHORT).show();
                        //Show sign in button again
                    }
            }
        }
    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        //Connection failed
    }
}
mAuth=FirebaseAuth.getInstance();
if(mAuth.getCurrentUser()!=null){
silentLogin();
}
GoogleSignenOptions gso=新建GoogleSignenOptions.Builder(GoogleSignenOptions.DEFAULT\u登录)
.requestIdToken(getString(R.string.default\u web\u client\u id))
.requestEmail()
.build();
mGoogleSignInClient=GoogleSignIn.getClient(this,gso);
mgoogleapclient=新的Googleapclient.Builder(此)
.enableAutoManage(这个,这个)
.addApi(Auth.GOOGLE\u SIGN\u IN\u API,gso)
.build();
//显示登录和注销按钮
public void silentLogin(){
可选Pendingreult Pendingreult=
谷歌签名授权(mGoogleApiClient);
如果(Pendingreult!=null){
手提袋吊挂(吊挂);
}否则{
签名();
}
}
私用作废手册Pendingreult(可选Pendingreult Pendingreult){
if(pendingreult.isDone()){
GoogleSignInResult signInResult=pendingreult.get();
onSilentSignInCompleted(signInResult);
}否则{
Pendingreult.setResultCallback(新的ResultCallback(){
@凌驾
public void onResult(@NonNull GoogleSignInResult signInResult){
onSilentSignInCompleted(signInResult);
}
});
}
}
silentsignincompleted上的私有无效(GoogleSignInResult signInResult){
GoogleSignInAccount signInAccount=signInResult.getSignInAccount();
if(signInAccount!=null){
//显示注销按钮
}
否则{
签名();
}
}
私人无效签名(){
Intent-signinint=mGoogleSignInClient.getsigninint();
startActivityForResult(签名、注册);
}
@凌驾
受保护的void onActivityResult(int-requestCode、int-resultCode、@Nullable-Intent-data){
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==RC\u登录){
Task Task=GoogleSignIn.GetSignedAccountFromIntent(数据);
handleSignInResult(任务);
}
}
私有void handleSignInResult(任务完成任务){
试一试{
GoogleSignInAccount acc=completedTask.getResult(ApiException.class);
FirebaseGoogleAuth(acc);
}
捕获(APIE){
//显示错误
FirebaseGoogleAuth(空);
}
}
私有void FirebaseGoogleAuth(谷歌签名帐户){
如果(帐户!=null){
AuthCredential AuthCredential=GoogleAuthProvider.getCredential(acct.getIdToken(),null);
mAuth.signInWithCredential(authCredential).addOnCompleteListener(这是新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
FirebaseUser=mAuth.getCurrentUser();
updateUI(用户);
}否则{
updateUI(null);
}
}
});
}
否则{
//身份验证失败
}
}
私有void updateUI(FirebaseUser fUser){
GoogleSignInAccount account=GoogleSignIn.GetLastSignedAccount(getApplicationContext());
如果(帐户!=null){
字符串personName=account.getDisplayName();
字符串personEmail=account.getEmail();
if(personEmail!=null){
如果(personEmail.endsWith(“gmail.com”))
{
//显示细节
}
其他的
{
mGoogleSignInClient.signOut();
Toast.makeText(MainActivity.this,“仅使用gmail帐户登录”,Toast.LENGTH_SHORT.show();
//再次显示登录按钮
}
}
}
}
@凌驾
public void onconnection失败(@NonNull ConnectionResult ConnectionResult){
//连接失败
}
}

您的mAuth为空,因为它是在您使用它进行处理之后定义的

mAuth=FirebaseAuth.getInstance()行应在该条件之前

按以下步骤操作:

    mAuth = FirebaseAuth.getInstance();

    if(mAuth.getCurrentUser() != null) {
        silentLogin();
    }
这肯定会奏效的

编辑: 我在项目中所做的工作:

 final GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(MyActivity.this);

 if (account != null) {
    gotoNextActivity();
 } else {
    signInButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            signIn();
        }
    });
 }

在看了前面的答案并阅读了一些文档之后,我得出了结论,因为我以以下方式实现了上述内容:

GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                        .requestEmail()
                        .requestIdToken(getString(R.string.default_web_client_id))
                        .build();

        mGoogleSignInClient = GoogleSignIn.getClient(this, googleSignInOptions);

        GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);

        updateUI(mAuth.getCurrentUser());
    }

    private void updateUI(FirebaseUser firebaseUser) {

        if (firebaseUser != null) {
            if(Objects.requireNonNull(firebaseUser.getEmail()).endsWith("gmail.com"))
            {
               //Display details of user
            }
            else
            {
                //Sign out
                mGoogleSignInClient.revokeAccess();
                updateUI(mAuth.getCurrentUser());
                Toast.makeText(this, "Login with gmail address only!", Toast.LENGTH_SHORT).show();
            }
        }else{
            // Show sign in button
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode == SIGN_IN_REQUEST_CODE){
            Task<GoogleSignInAccount> accountTask = GoogleSignIn.getSignedInAccountFromIntent(data);
            handleGoogleSignIn(accountTask);
        }
    }

    private void handleGoogleSignIn(Task<GoogleSignInAccount> accountTask) {

        try {
            GoogleSignInAccount account = accountTask.getResult(ApiException.class);
            if (account != null) {
                firebaseAuthWithGoogle(account);
            }
        }
}

    private void firebaseAuthWithGoogle(GoogleSignInAccount account) {

        AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null);

        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(task -> {
                    if (task.isSuccessful()) {
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // Show error
                    }
                });
    }
}
GoogleSignInOptions GoogleSignInOptions=新建GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT\u登录)
.requestEmail()
.requestIdToken(getString(R.string.default\u web\u client\u id))
.build();
mGoogleSignInClient=GoogleSignIn.getClient(这是googleSignInOptions);
GoogleSignInAccount账户=GoogleSignIn.GetLastSignedAccount(此账户);
updateUI(mAuth.getCurrentUser());
}
私有void updateUI(FirebaseUser FirebaseUser){
if(firebaseUser!=null){
if(Objects.requirennoull(firebaseUser.getEmail()).endsWith(“gmail.com”))
{
//显示用户的详细信息