[#13][안드로이드] Firebase로 Google 로그인/로그아웃 구현

Firebase로 Google 로그인/로그아웃 구현

public class LoginActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener{
    private FirebaseAuth mAuth;
    private static final int RC_SIGN_IN = 9001;
    private GoogleApiClient mGoogleApiClient;
    @Override
    public void onStart() {
        super.onStart();
        // 활동을 초기화할 때 사용자가 현재 로그인되어 있는지 확인합니다.
        FirebaseUser currentUser = mAuth.getCurrentUser();
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        // GoogleSignInOptions 생성
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder
                (GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(thisthis )
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();
            
        // 로그인 작업의 onCreate 메소드에서 FirebaseAuth 개체의 공유 인스턴스를 가져옵니다.
        mAuth = FirebaseAuth.getInstance();
        // 로그인 버튼 이벤트 > signInIntent 호출
        Button login_btn_google= (Button) findViewById(R.id.login_google);
        login_btn_google.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.v("알림""구글 LOGIN");
                Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
                startActivityForResult(signInIntent, RC_SIGN_IN);
            }
        });
        // 로그아웃 버튼 클릭 이벤트 > dialog 예/아니오
        Button logout_btn_google = (Button) findViewById(R.id.logout_google);
        logout_btn_google.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View view) {
                Log.v("알림""구글 LOGOUT");
                AlertDialog.Builder alt_bld = new AlertDialog.Builder(view.getContext());
                alt_bld.setMessage("로그아웃 하시겠습니까?").setCancelable(false)
                        .setPositiveButton("네",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // 네 클릭
                                // 로그아웃 함수 call
                                signOut();
 }
                        }).setNegativeButton("아니오",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // 아니오 클릭. dialog 닫기.
                                dialog.cancel();
                            }
                        });
                AlertDialog alert = alt_bld.create();
                // 대화창 클릭시 뒷 배경 어두워지는 것 막기
                //alert.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
                // 대화창 제목 설정
                alert.setTitle("로그아웃");
                // 대화창 아이콘 설정
                alert.setIcon(R.drawable.check_dialog_64);
                // 대화창 배경 색 설정
                alert.getWindow().setBackgroundDrawable(new ColorDrawable(Color.argb(255,62,79,92)));
                alert.show();
            }
        });
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RC_SIGN_IN) {
            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            if (result.isSuccess()) {
                // Google Sign In was successful, authenticate with Firebase
                Log.v("알림""google sign 성공, FireBase Auth.");
                GoogleSignInAccount account = result.getSignInAccount();
                firebaseAuthWithGoogle(account);
                Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(intent);
            } else {
                // Google Sign In failed, update UI appropriately
                Log.v("알림", result.isSuccess() +" Google Sign In failed. Because : " + result.getStatus().toString());
                // ...
            }
        }
    }
    // 사용자가 정상적으로 로그인한 후에 GoogleSignInAccount 개체에서 ID 토큰을 가져와서 
    //Firebase 사용자 인증 정보로 교환하고 Firebase 사용자 인증 정보를 사용해 Firebase에 인증합니다.
    private void firebaseAuthWithGoogle(GoogleSignInAccount acct){
        AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(thisnew OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        Log.v("알림""ONCOMPLETE");
                        // 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.v("알림""!task.isSuccessful()");
                            Toast.makeText(LoginActivity.this"인증에 실패하였습니다.", Toast.LENGTH_SHORT).show();
                        }else {
                            Log.v("알림""task.isSuccessful()");
                            FirebaseUser user = mAuth.getCurrentUser();
                            Toast.makeText(LoginActivity.this"FireBase 아이디 생성이 완료 되었습니다", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
    }
    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        Log.v("알림""onConnectionFailed");
    }
    // 로그아웃
    public void signOut() {
        mGoogleApiClient.connect();
        mGoogleApiClient.registerConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
            @Override
            public void onConnected(@Nullable Bundle bundle) {
                mAuth.signOut();
                if (mGoogleApiClient.isConnected()) {
                    Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(new ResultCallback<Status>() {
                        @Override
                        public void onResult(@NonNull Status status) {
                            if (status.isSuccess()) {
                                Log.v("알림""로그아웃 성공");
                                setResult(1);
                            } else {
                                setResult(0);
                            }
                            finish();
                        }
                    });
                }
            }
            @Override
            public void onConnectionSuspended(int i) {
                Log.v("알림""Google API Client Connection Suspended");
                setResult(-1);
                finish();
            }
        });
    }
}
cs


결과물
로그아웃 함수 -> finish() -> 로그인 시도 시 로그인 할 구글계정 선택 가능





댓글

  1. 형님 .... ㅠㅠ ApiException 12500 EROOR 뜨면서 로그인인증이안되네요 ...... 파이어베이스 코드 인터넷이 있는건 전부찾아봣는대 안되네요 ㅜㅜ 도대체 뭘까요 ㅜV/알림: false Google Sign In failed. Because : Status{statusCode=unknown status code: 12500, resolution=null}

    답글삭제
    답글
    1. 저도 이문제 때문에 삽질을 좀 했는데 결론은 파이어베이스에서 프로젝트 만들때 새로 만드는게 아니라 구글 API콘솔에서 미리 프로젝트를 만들고 Auth2.0을 만든 후에 파이어 베이스에서 프로젝트만들때 API콘솔의 프로젝트를 불러온 후 해당 프로젝트에 SHA-1을 등록 해야 합니다. 이미 해결하셨으면 상관없지만 해결 못하셨으면 도움 됬길 바랍니다.

      삭제
  2. 재로그인할때는 처음처럼 구글계정이 안보이고 바로 로그인이 되는데 이거는 고치는 방법이 없나요?

    답글삭제
  3. ㅠㅠㅠsignOut 함수에서 setResult와 finish에서 에러가 나는데 이 함수들은 어디에 선언되어있는건가요ㅠㅠ?

    답글삭제

댓글 쓰기

가장 많이 본 글