[Clone] 인스타그램 클론 프로젝트(2) - 구글 계정 로그인

minnie·2022년 3월 3일
0

클론프로젝트

목록 보기
3/8
post-thumbnail

이전 강의에서 email로 로그인할 때는 이메일로 요청하게 되면 파이어베이스 서버에서 바로 응답하는 2단계로 이루어진 구조였다. (email login in firebase-> response of login)

하지만 소셜로그인의 경우 예로 구글 로그인의 경우 google login-> firebase-> response of login 3단계의 구조를 거친다.

구글로그인의 경우 로그인에 성공하면 구글로부터 IdToken을 전달받는다. IdToken으로 Firebase 사용자 인증 정보를 교환 받고 이 정보를 사용해 Firebase에 인증한다.

1. Firebase Console에 SHA-1 지정

먼저 Firebase Console의 설정페이지에서 SHA-1을 지정한다.

SHA-1을 알아내는 간단한 방법은 Gradle->Execute Gradle Task에서 signing Report라고 입력하면 하단에서 다음과 같은 정보들을 얻을 수 있다.

2. Firebase Console Google 활성화

Authentication-> Sign-in method 에서 Google 사용설정 활성화를 시켜준다. 프로젝트 지원 이메일은 Firebase에 로그인 되어있는 이메일로 하였다.

3. 구글로그인에 필요한 라이브러리 추가

build.gradle에 구글 로그인에 필요한 라이브러리들을 추가한다.

plugins {
    id 'com.google.gms.google-services'
}

dependencies {
    implementation platform('com.google.firebase:firebase-bom:29.1.0')

	implementation 'com.google.firebase:firebase-auth-ktx:21.0.1'
	implementation 'com.google.android.gms:play-services-auth:20.1.0'
}

4. GoogleSignInClient 개체 구성

로그인 활동의 onCreate 메서드에서 앱에 필요한 사용자 데이터를 요청하도록 구글 로그인을 구성한다. 예를 들어 사용자 ID 및 기본 프로필 정보를 요청하도록 구글 로그인을 구성하려면 DEFAULT_SIGH_IN 매개변수를 사용하여 GoogleSignInOptions 개체를 만든다. 사용자의 이메일 주소도 요청하려면 requestEmail 옵션을 사용하여 GoogleSignInOptions 개체를 만들면 된다.
구글 로그인을 앱에 통합하고 GoogleSignInOptions을 구성할 때 requestIdToken을 호출한다.

그리고 나서 지정한 GoogleSignInOptions을 사용하여 GoogleSignInClient 개체를 만든다.

val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
		.requestIdToken(BuildConfig.web_client_id)
        .requestEmail()
        .build()
        
var googleSignInClient:GoogleSignInClient? = null
    
googleSignInClient = GoogleSignIn.getClient(this,gso)

5. 구글 로그인 화면으로 이동

startActivityForResult()가 deprecated 되면서 registerForActivityResult()를 사용했다.

로그인에 성공하게 되면 구글에서는 로그인한 사용자의 정보를 얻을 때 필요한 IdToken을 전달한다.

lateinit var getResult : ActivityResultLauncher<Intent>

getResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
                result:ActivityResult->
	if(result.resultCode == RESULT_OK) {
		val task = GoogleSignIn.getSignedInAccountFromIntent(result.data)
        try {
        	val account = task.getResult(ApiException::class.java)
            firebaseAuthWithGoogle(account.idToken)
            Log.d("GoogleLogin", "firebaseAuthWithGoogle: " + account.id)
        } catch (e: ApiException) {
            Log.d("GoogleLogin", "Google sign in failed: " + e.message)
        }
    }
}

        
binding.googleSignInButton.setOnClickListener {
	val signInIntent = googleSignInClient?.signInIntent // 구글 로그인 화면 Intent
	getResult.launch(signInIntent)
}

6. IdToken을 활용해 Firebase 인증하기

IdToken으로 Firebase 사용자 인증 정보로 교환을 한 후 교환된 정보를 이용해 Firebase에 인증할 수 있다.

위에서 result코드가 RESULT_OK일 때 firebaseAuthWithGoogle(account.idToken)에 대한 코드이다. 아래에서 account 변수는 위에서 얻은 IdToken을 말한다.
Firebase 사용자 인증 정보(credential)을 사용해 Firebase에 인증한다.

val credential = GoogleAuthProvider.getCredential(account,null)
	auth?.signInWithCredential(credential) 
        ?.addOnCompleteListener { task ->
			if (task.isSuccessful) {
                //아이디 패스워드 맞았을 때
                moveMainPage(task.result?.user)
            } else {
                //로그인 실패 틀렸을 때
                Toast.makeText(this,task.exception?.message, Toast.LENGTH_LONG).show()
           }
	}

참고
https://developers.google.com/identity/sign-in/android/sign-in?authuser=0

https://velog.io/@galaxy/Firebase-Authentication%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-Google-Login

https://hanyeop.tistory.com/160

profile
Android Developer

0개의 댓글