이전 강의에서 email로 로그인할 때는 이메일로 요청하게 되면 파이어베이스 서버에서 바로 응답하는 2단계로 이루어진 구조였다. (email login in firebase-> response of login)
하지만 소셜로그인의 경우 예로 구글 로그인의 경우 google login-> firebase-> response of login 3단계의 구조를 거친다.
구글로그인의 경우 로그인에 성공하면 구글로부터 IdToken을 전달받는다. IdToken으로 Firebase 사용자 인증 정보를 교환 받고 이 정보를 사용해 Firebase에 인증한다.
먼저 Firebase Console의 설정페이지에서 SHA-1을 지정한다.
SHA-1을 알아내는 간단한 방법은 Gradle->Execute Gradle Task에서 signing Report라고 입력하면 하단에서 다음과 같은 정보들을 얻을 수 있다.
Authentication-> Sign-in method 에서 Google 사용설정 활성화를 시켜준다. 프로젝트 지원 이메일은 Firebase에 로그인 되어있는 이메일로 하였다.
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'
}
로그인 활동의 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)
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)
}
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