스마트웹앱콘텐츠전문가/안드로이드

구글 로그인 연동(with 파이어베이스)

9D4U 2024. 8. 28. 11:12
728x90
반응형

구글 로그인 연동을 하려면

사전에 파이어베이스에 

프로젝트 생성 및 설정이 

되어 있어야 합니다.

 

 

2024.08.30 - [스마트웹앱콘텐츠전문가/안드로이드] - 인증서 지문 획득

 

인증서 지문 획득

외부 연동 시,  안드로이드 플랫폼 입력란에 인증서 지문을 입력해야 되는 경우가 있습니다.  예시) 파이어베이스 콘솔     인증서 지문을 획득하는 방법은 먼저,해당 어플(프로젝트)에

9d4u.tistory.com

 

 

 

해당 포스팅에서는

사전 과정을 마친 이후에

진행을 합니다.

 

 

 

 

 

 

○ 안드로이드 환경 : SDK(안드로이드 API 21 이상), JDK(JDK 11이상), Gradle 빌드

 

 

 

 

 

1. 환경 설정

 

1-1. 파이어베이스 프로젝트에서 google-services.json 다운로드 받아

       해당 프로젝트 루트 디렉터리에 추가.

 

 

 

1-2. 파이어베이스(Firebase) SDK 추가 

 

프로젝트 수준의 build.gradle 파일에 플러그인을 종속 항목으로 추가

plugins {
  // ...

  // Add the dependency for the Google services Gradle plugin
  id 'com.google.gms.google-services' version '4.4.2' apply false

}

 

 

모듈(앱 수준) build.gradle 파일에서 google-services 플러그인과 앱에서 사용할 Firebase SDK를 모두 추가

plugins {
  id 'com.android.application'

  // Add the Google services Gradle plugin
  id 'com.google.gms.google-services'

  ...
}

dependencies {
  // Import the Firebase BoM
  implementation platform('com.google.firebase:firebase-bom:33.2.0')


  // TODO: Add the dependencies for Firebase products you want to use
  // When using the BoM, don't specify versions in Firebase dependencies
  // https://firebase.google.com/docs/android/setup#available-libraries
  
  // Add the dependency for the Firebase Authentication library
	// When using the BoM, you don't specify versions in Firebase library dependencies
	implementation("com.google.firebase:firebase-auth:16.0.4")

	// Also add the dependency for the Google Play services library and specify its version	
	implementation("com.google.android.gms:play-services-auth:20.1.0")
	

}

 

 

gradle sync 또는 빌드를 해주어 오류가 나는 지 확인해봅시다.

 

참고) 파이어베이스 SDK가 google-services.json 구성 값에 액세스할 수 있도록 하려면 구글 서비스 gradle 플러그인 필요.

 

 

 

2. 로그인 로직 : 해당 로직을 통해 로그인을 진행할 수 있습니다.

 

파이어베이스를 사용한 구글 로그인을 진행해보았습니다.

※로그인 후, 사용자 정보를 가져오는 것도 포함

 

 

 

2-1. 레이아웃 파일에 Google 로그인 버튼 생성

 

예시) 커스텀하지 않은 구글 로그인 버튼 생성함.

 

<com.google.android.gms.common.SignInButton
        android:id="@+id/googleBtn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_margin="20dp"
        android:layout_marginStart="10dp"
        android:layout_marginEnd="10dp"
        />

 

 

 

 

2-2. 액티비티 파일에 로그인 버튼에 대한 로직 추가 : 

 

private String RC_SIGN_IN = "9001";
private GoogleSignInAccount gsa;
private GoogleSignInClient mGoogleSignInClient;

~

SignInButton g_login_button = (SignInButton)findViewById(R.id.googleBtn);

~
mGoogleSignInClient = GoogleSignIn.getClient(AuthActivity.this, gso);
~

//버튼 클릭 리스너
g_login_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Log.d("G_LOGIN_BTN", "구글 로그인 버튼 클릭 ");

                // 기존에 로그인 했던 계정을 확인한다.
                gsa = GoogleSignIn.getLastSignedInAccount(AuthActivity.this);

                if(gsa != null){
                    // 로그인 되있는 경우, 사용자 정보 확인
                    Log.i("G_LOGIN", gsa.getId());
                    Log.i("G_LOGIN", String.valueOf(gsa.getAccount()));
                    Log.i("G_LOGIN", gsa.getEmail());
                    Log.i("G_LOGIN", gsa.getDisplayName());
                    Log.i("G_LOGIN", String.valueOf(gsa));
                    
                }else{
                    // 로그인 진행
                    Log.i("G_LOGIN", "로그인 진행");
                }
                                

                Intent intent = mGoogleSignInClient.getSignInIntent(); //구글로그인 페이지로 가는 인텐트 객체

                startActivityForResult(intent, Integer.parseInt(RC_SIGN_IN)); //Google Sign In flow 시작

                //finish();
            }
        });
        

~

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    
    // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);    
    if (requestCode == Integer.parseInt(RC_SIGN_IN)) {
        Log.d("G_LOGIN_RESULT_ON_ACTI", requestCode + "/" + resultCode + "/" + data);
        // The Task returned from this call is always completed, no need to attach a listener.
        Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); 
        handleSignInResult(task);
    }
    
}

 

 

○ GoogleSignInAccount 

○ GoogleSignInClient 

 

반응형

 

 

 

※ onActivityResult 의 로직을 유의깊게 봐야 함.

- 로그인을 하고 난 뒤에 onActivityResult가 호출되며, GoogleSignInAccount 객체를 얻음.

 

 

 

3.  사용자 정보 가져오기 : 로그인한 사용자의 프로필 정보를 가져올 수 있습니다.

//사용자 정보 가져오기
private void handleSignInResult(Task<GoogleSignInAccount> task){
    try {
        Log.d("G_LOGIN_handleSignInResult 진입", String.valueOf(task.isSuccessful()) );

        GoogleSignInAccount acnt = task.getResult(ApiException.class);

        Log.d("G_LOGIN_handleSignInResult", acnt.getId());

        if(acnt != null){
            //사용자 정보 존재
            
            firebaseAuthWithGoogle(acnt.getIdToken());

            String personName = acnt.getDisplayName();
            String personGivenName = acnt.getGivenName();
            String personFamilyName = acnt.getFamilyName();
            String personEmail = acnt.getEmail();
            String personId = acnt.getId();
            Uri personPhoto = acnt.getPhotoUrl();

            Log.d("G_LOGIN_USER", "handleSignInResult:personName "+personName);
            Log.d("G_LOGIN_USER", "handleSignInResult:personGivenName "+personGivenName);
            Log.d("G_LOGIN_USER", "handleSignInResult:personEmail "+personEmail);
            Log.d("G_LOGIN_USER", "handleSignInResult:personId "+personId);
            Log.d("G_LOGIN_USER", "handleSignInResult:personFamilyName "+personFamilyName);
            Log.d("G_LOGIN_USER", "handleSignInResult:personPhoto "+personPhoto);
                        
        }
    }catch (ApiException e){
        // The ApiException status code indicates the detailed failure reason.
        // Please refer to the GoogleSignInStatusCodes class reference for more information.
        Log.e("G_LOGIN_EXCEPT", "signInResult:failed :" + e.getStatusCode());
        Log.e("G_LOGIN_EXCEPT", "signInResult:failed :" + e.getMessage());
        Log.e("G_LOGIN_EXCEPT", "signInResult:failed :" + e.getStatus());
    }
    finish();
}

 

 

 

 

 

 

4. 파이어베이스 활용 : 토큰을 가지고 파이어베이스를 통하여 사용자 정보를 조회할 수 있습니다.

private FirebaseAuth mAuth;

~

private void firebaseAuthWithGoogle(String token){

    Log.d("G_LOGIN_firebaseAuthWithGoogle", token);

    AuthCredential credential = GoogleAuthProvider.getCredential(token, null);        

    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(AuthActivity.this, task -> {                                

                if(task.isSuccessful()){
                    // Sign in success, update UI with the signed-in user's information
                    Log.d("G_LOGIN_FirebaseAuth_Secc", "signInWithCredential:success");
                    FirebaseUser user = mAuth.getCurrentUser();

                    Log.d("G_LOGIN_Fire_USER", "handleSignInResult:uid "+user.getUid());
                    Log.d("G_LOGIN_Fire_USER", "handleSignInResult:phone "+ user.getPhoneNumber());
                    Log.d("G_LOGIN_Fire_USER", "handleSignInResult:personEmail "+user.getEmail());
                    Log.d("G_LOGIN_Fire_USER", "handleSignInResult:personName "+user.getDisplayName());
                    Log.d("G_LOGIN_Fire_USER", "handleSignInResult:photourl "+user.getPhotoUrl());
                    Log.d("G_LOGIN_Fire_USER", "handleSignInResult:providerId "+user.getProviderId());
                                        

                } else{
                    // If sign in fails, display a message to the user.
                    Log.w("G_LOGIN_FirebaseAuth_Exce", "signInWithCredential:failure", task.getException());

                }
            });

}

 

 

 

5. 구현동작 확인.

 

 

구글 로그인 버튼 클릭.

 

 

 

구글 로그인 화면 진입

(여러개의 구글 아이디가 등록되어 있는 경우, 다음과 같이
구글 아이디 1,2,3을 선택하라는 화면이 노출됩니다.)

 

 

 

 

 

 

 

※구글 로그인 연동은 파이어베이스 없이 구글 로그인 연동이 가능합니다만,

   파이어베이스를 거쳐서 연동을 진행하게 되면, 설정 부분에서 

   파이어베이스가 진행을 해주므로, 보다 간단하게 진행할 수 있습니다.

 

 

 

 

 

2024.08.27 - [스마트웹앱콘텐츠전문가/안드로이드] - 페이스북 로그인 연동

 

페이스북 로그인 연동

페이스북 로그인 연동을 하기 위해서는 사전에 페이스북 개발자 센터에서 애플리케이션 등록을(https://developers.facebook.com/?locale=ko_KR) 먼저 해주어야 합니다. (사전 등록 요약) 키 해시, 패키지

9d4u.tistory.com

2024.08.27 - [스마트웹앱콘텐츠전문가/안드로이드] - 카카오 로그인 연동

 

카카오 로그인 연동

카카오 로그인 연동을 하기 위해서는 사전에 카카오 개발자 센터에서 애플리케이션 등록을 먼저 해주어야 합니다. (사전 등록 요약) 패키지명, 마켓URL, 키해시     해당 포스팅은 애플리케

9d4u.tistory.com

2024.08.27 - [스마트웹앱콘텐츠전문가/안드로이드] - 네이버 로그인 연동(네아로)

 

네이버 로그인 연동(네아로)

네이버 로그인 연동을 하기 위해서는 사전에 네이버 개발자 센터에서 애플리케이션 등록을 먼저 해주어야 합니다. (사전 등록 요약) 다운로드URL, 안드로이드 앱 패키지 이름 입력      해

9d4u.tistory.com

 

 

 

728x90