오늘 해볼 것은 파이어베이스와 구글 클라우드 플랫폼을 이용한 구글 소셜로그인 구현입니다.
총 3단계로 진행할 예정
- 파이어 베이스 프로젝트 생성
- 구글 클라우드 플랫폼 프로젝트 생성
- 액티비티에서 소셜 로그인 구현
진행과정은 파이어베이스 문서의 Google 로그인을 참고하고 있습니다. 문서를 펼치고 준비가 됬다면 시작합니다.
프로젝트 만드는 법은 아래 게시글에 나와있습니다.
Firebase 시작하기
Firebase Firebase는 고품질 앱을 빠르게 개발하고 비즈니스를 성장시키는 데 도움이 되는 Google의 모바일 플랫폼입니다. firebase.google.com 파이어베이스에 개인 프로젝트를 추가하는 방법에 대해 다뤄
huzit.tistory.com
구글 클라우드 플랫폼 프로젝트 생성
파이어베이스의 기본UI로 소셜 로그인을 구현해도 되지만, 이번엔 구글 클라우드 플랫폼의 OAuth를 이용해서 소셜 로그인을 만들생각입니다.
기존에 있는 것을 쓰면 되지 왜 구글 클라우드 플랫폼을 썼는지는 묻지말아줬으면... 다 만들고 나서 네비를 보니까 있더라구요.
프로젝트 이름 설정해주고 만들면 끝입니다.
액티비티에서 소셜 로그인 구현
이제 본편입니다. 파이어 베이스 문서에 작성된 내용을 기반으로 진행합니다.
사전준비
첫 번째로 해야할 것은 앱 수준 build.gradle에 의존성을 추가해주는 것입니다.
dependencies {
// Import the BoM for the Firebase platform
implementation platform('com.google.firebase:firebase-bom:29.2.1')
// Declare 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-ktx'
// Also declare the dependency for the Google Play services library and specify its version
implementation 'com.google.android.gms:play-services-auth:20.1.0'
}
의존성 추가 이후 앞의 과정을 순서대로 따라왔다면 SHA-1 디지털 지문이 정상적으로 지정되있을 것입니다.
파이어베이스 콘설에서 구글 로그인을 쓸 수 있도록 설정해줘야 합니다.
파이어베이스 인증
로그인 액티비티의 onCreate단에 아래 코드를 작성해줌니다.
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.web_client_id)) //OAuth 2.0 클라이언트 ID
.requestEmail()
.build()
googleSignInClient = GoogleSignIn.getClient(this, gso)
구글 클라우드 플랫폼에서 클라이언트ID를 requestIdToken()에 전달해야 합니다. OAuth클라이언트 아이디를 확인하는 방법은
우선 구글 클라우드 플랫폼에서 API 및 서비스 -> 사용자 인증 정보 로 들어가면 파이어베이스가 자동으로 만들어준 클라이언트 ID가 있습니다. 그중 웹 애플리케이션 유형의 ID를 넣어주면 됩니다.
미리 두 프로젝트를 만들어둔 상태로 진행했다면 구글이 자체적으로 연동할 것인지 물어볼 것 입니다. 연동 한다고 하면 자동생성 될 것입니다. 처음 만들 때 클릭하고 넘겨버려서 사진이 따로 없습니다
순식간에 넘어가버려서 언제 연동된건지 기억이 안나요..
그 후, 로그인 작업을 위해 코드를 작성해줍니다.
//로그인 결과창 콜백
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
//GoogleSignInApi.getSignInIntent(...)로부터 반환된 Intent 실행
if (requestCode == RC_SIGN_IN) {
val task = GoogleSignIn.getSignedInAccountFromIntent(data)
try {
//성공적으로 구글로그인되면 파이어베이스로 인증을 증명
val account = task.getResult(ApiException::class.java)!!
Log.d(TAG, "firebaseAuthWithGoogle:" + account.id)
firebaseAuthWithGoogle(account.idToken!!)
} catch (e: ApiException) {
// 구글 로그인 실패하면 적절한 UI 업데이트
Log.w(TAG, "Google sign in failed", e)
}
}
}
//[Start 로그인]
private fun signIn() {
val signInIntent = googleSignInClient.signInIntent
startActivityForResult(signInIntent, RC_SIGN_IN)
}//[End 로그인]
클래스 단에서 FirebaseAuth객체 공유를 위한 인스턴스를 lateinit으로 선언해주고 onCreate()에서 생성해줍니다.
class GoogleSignInActivity : AppCompatActivity() {
//start declear
private lateinit var auth: FirebaseAuth
//end
...
override fun onCreate(savedInstanceState: Bundle?) {
...
//[Start 인증초기화]
//Firebase Auth 선언
auth = Firebase.auth
//[End 인증초기화]
}
}
활동을 초기화 할 때 사용자가 현재 로그인 되어있는지 확인합니다.
override fun onStart() {
super.onStart()
//사용자가 현재 로그인 되어있는지 체크
val currentUser = auth.currentUser
updateUI(currentUser)
}
사용자가 정상적으로 로그인하면 GoogleSignInAccount객체에서 ID토큰을 가져와 파이어베이스 사용자 인정 정보로 교환하고 해당 정보를 이용해 파이어베이스에 인증합니다.
private fun firebaseAuthWithGoogle(idToken: String) {
//id토큰으로 자격증명을 가져옴
val credential = GoogleAuthProvider.getCredential(idToken, null)
//자격증명으로 로그인
auth.signInWithCredential(credential)
.addOnCompleteListener(this) { task ->
if(task.isSuccessful){
//로그인이 성공하면 로그인한 유저의 정보로 updateUI()를 호출
Log.d(TAG, "signInWithCredential:success")
val user = auth.currentUser
updateUI(user)
} else{
//로그인 실패하면 유저에게 메시지 표시
Log.w(TAG, "signInWithCreditial:failure", task.exception)
updateUI(null)
}
}
}
signInWithCredential()의 호출이 성공하면 getCurrentUser()로 사용자의 계정 데이터를 가져올 수 있습니다.
이렇게 하면 사용자가 처음으로 로그인하면 신규 사용자 계정이 생성되고, 사용자가 로그인할 때 사용한 인증정보에 연결됩니다.
이 신규 계정을 파이어베이스 프로젝트에 저장되며 프로젝트 내의 모든 앱에서 사용자 식별에 사용가능합니다.
사용자의 기본 프로필정보를 이용하려면 사용자관리를 참고하면 됩니다.
마지막으로 제일 중요한 사용자를 로그아웃 시키려면 signOut()을 호출하면 됩니다.
Firebase.auth.signOut()
22.07.27 추가
로그아웃시 signOut()메서드를 호출해도 안돼는 경우 로그인 로직을 구현한 액티비티에서 signOut()를 해주면 됩니다.
//구글 로그아웃
private fun checkSignOut(){
if(intent.getBooleanExtra("isSignOut", false))
googleSignInClient.signOut()
}
제 경우 intent를 이용해서 로그아웃을 검사해서 googleSignInClient.signOut()메서드로 구현했습니다.
안되는 이유에 대해선 개인적인 생각으로 파이어 베이스는 GCP의 OAuth를 쓰고 있기 때문인거같습니다.
공식문서의 변경된 로그인로직은 새 게시글로 다시 정리할 예정입니다.
'안드로이드 > Firebase' 카테고리의 다른 글
Firebase Crashlytics 시작하기 (0) | 2023.04.14 |
---|---|
Firebase 시작하기 (0) | 2023.04.14 |
[FCM] Retrofit2로 API통신하기 (0) | 2022.11.16 |
[FCM] FirebaseCloudMessaging API 만들기 (1) | 2022.11.12 |
[FCM]Firebase Cloud Messaging 수신하기 (0) | 2022.11.11 |