Android

Android SNS 로그인 (구글)

Dean83 2022. 3. 24. 23:02

참조 :  https://developers.google.com/identity/sign-in/android/start

요약 : firebase 및 https://console.cloud.google.com 에서 프로젝트를 각각 추가 해야함.

1. 프로젝트 생성 (firebase 및 구글 콘솔)
   - firebase의 경우, https://console.firebase.google.com/u/0/?hl=ko 이동 -> Authentication -> Sign-in method -> 구글 에서 웹 sdk 구성에서 확인 가능
   - https://console.cloud.google.com/ 에서 어플리케이션 생성, OAuth 동의 화면 및 이용자 설정등 해주어야 함. 

** SHA1 등록 방법
    - keytool을 이용한 방법과 안드로이드 스튜디오에서 사용하는 방법이 있음. 
    - 안드로이드 스튜디오 : 터미널에서, .\gradlew signingReport 입력 후 엔터 -> SHA1 항목을 복사하여, 구글 콘솔에 입력
    ** 안드로이드 스튜디오는 디버깅용이고, 실제 keystore를 사용할 경우, https://developers.google.com/android/guides/client-auth 방법을 따라서 해야함. 2개의 sha1값을 추가하면 좋음. 

2. 프로젝트 세팅 (firebase)
    - https://console.firebase.google.com 에서 프로젝트로 이동 -> Authentication -> Sign-in method -> 구글 선택 후 활성화. 
    - sha1 값 세팅해야함. 

3. 프로젝트 세팅 (안드로이드 스튜디오)
    - 안드로이드 스튜디오 -> tools -> firebase -> Authentication 에서 gradle 설정 추가

4. 코드
     - 구글로그인을 위한 변수 추가
     - 버튼클릭시 이벤트 함수에, INTENT를 통한 구글 로그인 진행
     - INTENT 종료후 호출되는 콜백함수인 onActivityResult 함수에서 token을 받아온 후 firebase에서 이메일 조회

//메인액티비티 혹은 구글로그인 액티비티 클래스에 맴버변수 추가

private FirebaseAuth mAuth;
    private GoogleApi mGoogleApiClient;
    private GoogleSignInClient mGoogleSignInClient;
    private static final int RC_SIGN_IN = 9001;

//onCreate에 다음 코드 추가. web 클라이언트id 필요 
 mAuth = FirebaseAuth.getInstance();
        GoogleSignInOptions opt = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestIdToken("348397439360-5nuf62n0teh63l79t0bq7mgs7gon45b2.apps.googleusercontent.com")
                .requestEmail().build();
        mGoogleSignInClient = GoogleSignIn.getClient(this, opt);

//구글 로그인 버튼 클릭 함수에 다음코드 추가
 Intent signInIntent = mGoogleSignInClient.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);


//로그인 intent 종료 후 콜백 함수인 onActivityResult에 코드 추가
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        // 구글로그인
        if(requestCode == RC_SIGN_IN)
        {
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            try {
                // Google Sign In was successful, authenticate with Firebase
                GoogleSignInAccount account = task.getResult(ApiException.class);
                Log.d("haha", "firebaseAuthWithGoogle:" + account.getId());
                firebaseAuthWithGoogle(account.getIdToken());
            } catch (ApiException e) {
                // Google Sign In failed, update UI appropriately
                Log.w("haha", "Google sign in failed", e);
            }
        }
        else
        {
            //페이스북 로그인
            callbackManager.onActivityResult(requestCode,resultCode,data);
        }

        super.onActivityResult(requestCode,resultCode,data);
    }


//구글로그인 후 firebase에서 유저정보 가져오는 함수
 private void firebaseAuthWithGoogle(String idToken) {

        AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null);
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            // Sign in success, update UI with the signed-in user's information
                            Log.d("haha", "signInWithCredential:success");
                            FirebaseUser user = mAuth.getCurrentUser();
                            Log.d("haha", "google email : " + user.getEmail());
                        } else {
                            // If sign in fails, display a message to the user.
                            Log.w("haha", "signInWithCredential:failure", task.getException());
                        }
                    }
                });
    }