본문 바로가기
Mobile Programming/Android

[Kotlin] 구글 로그인 이용하기 (2020.08)

by 푸고배 2020. 8. 24.

 

카카오 로그인에 이어 구글 로그인을 구현해보고자 한다.

카카오 로그인 이용하기는 아래 링크로 이동 

 

[Kotlin] 카카오 로그인 이용하기 (2020.08)

기존에 이용하던 kakao 로그인 api가 좀 바뀌었다. 원래는 버튼 ui도 sdk로 지원했던 것 같은데.. 못찾는 건지 그냥 제공하는 ui 이미지를 사용했다. 연동 방법은 좀 더 간편해진 것 같다. 1. Kakao develop

doqtqu.tistory.com

 

1. Google Console에 App 추가

 

구글 Firebase 콘솔로 이동하여 프로젝트 추가를 한다.

프로젝트 이름을 지정하고, 에널리틱스와 같은 설정을 마친 후 콘솔의 프로젝트 개요에서 안드로이드 아이콘을 클릭하여 앱을 추가해준다. 

 

 

 

Android 패키지 이름에는 AndroidManifest.xml의 <manifest package=" ">안의 Android 패키지 이름을 작성한다.

앱 닉네임은 말 그대로 앱을 구분할 수 있는 닉네임을 입력하면 된다.

디버그 서명 인증서 SHA-1은 Google 로그인 과정에서는 선택사항이 아닌 필수사항이다.

SHA-1는 Android Studio의 terminal에서 구할 예정이므로 지금은 생략하고 넘어간다.

아니면 아래와 같은 오류가 발생할 수도..

 

com.google.samples.quickstart.signin W/SignInActivity: signInResult:failed code=10

 

 

앱 등록과정을 따라 구성 파일을 다운로드 후 프로젝트 구조 밑에 등록하고, Firebase SDK를 추가한다.

앱을 실행하여 설치 확인 과정은 시간이 조금 걸리는데 안하고 넘어가도 된다.

 

2. Android 프로젝트에 Firebase 추가

 

Firebase 공식 문서를 참고하여, 로그인을 구현한다.

Google Login 버튼이 있는 Activity나 Fragment에서 구현해주면된다.

 

https://firebase.google.com/docs/auth/android/google-signin?hl=ko

 

전체 소스코드는 아래와 같다.

private lateinit var loginViewModel: LoginViewModel
private var googleSignInClient: GoogleSignInClient? = null
private lateinit var auth: FirebaseAuth
private val RC_SIGN_IN = 0116
private val String TAG = "GOOGLE_LOGIN"

// override onCreateView(Activity)or onCreate(Fragment)
	// Initialize Firebase Auth
	val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
    		.requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build()
            
	// Fragment 이용 시
	val root = inflater.inflate(R.layout.fragment_login, container, false)     
	// Activity 이용 시 root.context 대신 this이용
    
	auth = FirebaseAuth.getInstance()
	googleSignInClient = GoogleSignIn.getClient(root.context,gso)
    
	val google_login = root.findViewById<SignInButton>(R.id.google_login)
	google_login.setOnClickListener { // google login button
	val signInIntent = googleSignInClient?.signInIntent
	startActivityForResult(signInIntent, RC_SIGN_IN)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
	super.onActivityResult(requestCode, resultCode, data)
	// 구글 로그인
	if (requestCode == RC_SIGN_IN) {
    	val task = GoogleSignIn.getSignedInAccountFromIntent(data)
    	try {
        	// Google Sign In was successful, authenticate with Firebase
            val account = task.getResult(ApiException::class.java)!!
            Log.d(TAG, "firebaseAuthWithGoogle:" + account.id)
            firebaseAuthWithGoogle(account)
      	} catch (e: ApiException) {
        	// Google Sign In failed, update UI appropriately
            Log.w(TAG, "Google sign in failed", e)
            // ...
      	}
    }
}
private fun firebaseAuthWithGoogle(acct: GoogleSignInAccount) {
	val credential = GoogleAuthProvider.getCredential(acct.idToken, null)
	auth!!.signInWithCredential(credential)
		  .addOnCompleteListener(activity!!) { task ->
          if (task.isSuccessful) {
          	Log.d(TAG, "signInWithCredential:success")
            val user = auth.currentUser
          } else {
          	Log.w(TAG, "signInWithCredential:failure", task.exception)
          }
       }
}

GoogleSignInOptions.build를 통해 객체를 초기화해준다. requestIdToken은 다운받았던 json 파일에 있던 정보가, requestEmail은 로그인 시 이메일을 요구한다는 뜻이다.

나는 Fragment를 사용했기 때문에 root(google button을 가지는 view)에서 SignInButton을 찾았고 Activity라면 this, 또는 생략해도 무관하다.

google_login(자신이 설정한 버튼 이름)에 onClickListener를 이용해 클릭 시 login 화면으로 넘어가도록 구현하였다.

Intent를 이용하며, 뒤의 RC_SIGN_IN은 Intent를 구분하고자 넣는 id로 임의의 숫자를 넣어줘도 상관이 없다. 

(onActivityResult에서 resultCode가 되므로 그것만 일치 시켜주면 OK)

onActivityResult에서는 Google 버튼을 눌렀을 시 이동하는 인텐트인 경우 GoogleSignIn.getSignedInAccountFromIntent를 이용해 task를 생성한다.

firebaseAuthWithGoogle 함수에서는 사용자가 정상적으로 로그인할 시 GoogleSignInAccount 객체의 토큰을 가져와 Firebase 사용자 인증 정보로 교환하고 해당 정보를 사용해 Firebase에 인증한다.

 

3. Google Console 프로젝트에 디버그 서명 인증서 SHA-1 추가

 

실행시키기 전에 Android Studio의 Terminal 창에 아래와 같이 입력하여 SHA-1를 얻는다.

 

C:\user....\project_name > keytool -list -v -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore

 

C:\user....\project_name > password : android

 

얻은 SHA-1 키를 Google Console 프로젝트 앱의 디지털 지문 추가를 통해 등록해준다.

실행하면 정상적으로 접근이 가능하다.

 

반응형

댓글