본문 바로가기
CODING/Android Studio

[안드로이드/인스타그램클론] # 3 구글 로그인 기능 추가

by 밍톨맹톨 2020. 8. 14.
728x90
728x90

[ 이전 글 ]에서는 로그인 화면에서 로그인을 하거나 가입을 하면 메인 페이지로 넘어갈 수 있게 만들어 보면서 코틀린 기본 문법을 정리했는데 이번에는 구글을 통해서 로그인하는 방법을 추가하는 것을 정리할 것이다.

 

🛎 구글 로그인과 이메일 로그인의 차이

🧸이메일 로그인

    - firebase -> 로그인 확인

 

🧸구글 로그인

    - 1️⃣ 구글 로그인 -> 2️⃣ firebase -> 3️⃣ 로그인 확인

 

‼️ 지금부터 이 순서대로 설명할 것 ‼️

 

일단 

 # 1 글에서 했던 거처럼 app -> open Module settings -> dependencies -> +버튼 -> Library Dependency로 창을 띄운 후 play-services-auth를 검색하면 com.google.android.gms가 나오는데 OK를 눌러주면 된다 그러고 나서 

 

activity_login.xml에 들어가서 구글 아이디 아이콘 부분 코드에 [ android:id="@+id/google_sign_in_button" ] 를 써준다

 

 

1️⃣ 구글 로그인하는 방법

loginActivity에 들어가서 googleSignInclient객체를 만들어준다 

    var googleSignInClient : GoogleSignInClient? = null
    var GOOGLE_LOGIN_CODE = 9001

그 후 gso : googleSigninOptional을 만든다

➡️ 사용자 ID와 프로필 정보를 요청하기 위해서

var gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build()
googleSignInClient = GoogleSignIn.getClient(this,gso)

gso를 인자로 전달해서 GoogleSignInClient 객체 생성 !

 

email_login_botton.setOnClickListener {
            signinAndSignup()
        }
google_sign_in_button.setOnClickListener {
            googleLogin()
        }

이메일로 로그인하는 것과 마찬가지로 그 밑에 구글로 구글 로그인 버튼을 눌렀을 때 googleLogin을 할 것이라는 표시를 해주고 

googleLogin 함수를 만들어 주면 된다..

 

[ googleLogin 함수 ]

  fun googleLogin(){
         var signInIntent = googleSignInClient?.signInIntent
         startActivityForResult(signInIntent,GOOGLE_LOGIN_CODE)
     }

gso를 인자로 받아 생성된 googleSignInClient를 signInIntent 메소드를 통해서 signInIntent를 만들고

그걸 startActivityForResult에 전달한다 ! 

 

🔱 여기서 잠깐🔱

startActivityForResult첫 번째 인자로 intent두 번째 인자로 결과를 요청할 때 요청 코드를 보낸다 

 

2️⃣ Firebase를 거치는 방법

 

🔱 여기서 잠깐🔱

바로 onActivitiyResult라는 메소드를 만들게 되는데 이것은 activity A 와 B가 있을 때 A -> B -> A 올 때 사용하는 메소드

 

     override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
         super.onActivityResult(requestCode, resultCode, data)
         if(requestCode ==GOOGLE_LOGIN_CODE){
             var result = Auth.GoogleSignInApi.getSignInResultFromIntent(data)
             if(result!!.isSuccess){
                 var account = result.signInAccount
                 // Second step
                 firebaseAuthWithGoogle(account)
             }
         }
     }

사용자가 signIn에 성공하면 onActivityResult가 실행된다

requestCode는  아까 사용한 GOOGLE_LOGIN_CODE

 

    1. 구글 로그인 코드 = requestCode 라면

    2.result에 구글에 로그인했을 때 구글에서 넘겨주는 결괏값을 받아와서 저장

    3. result가 성공하면 firebaseWithGoogle에 결과 아이디를 넘겨준다 !

 

❓ 아직 궁금증을 해결하지 못한 게 있는데 원래 강의에서 본 코드는 
if (result.isSussess)인데 나는 왜 !!. 를 붙여야 하는지 잘 모르겠다

🦔!!. 의 뜻은 ? 와 반대로 null이 아님을 말해주는 것이다

firebaseWithGoogle ] 코드

 fun firebaseAuthWithGoogle(account: GoogleSignInAccount?){
         var credential = GoogleAuthProvider.getCredential(account?.idToken,null)
         auth?.signInWithCredential(credential)
             ?.addOnCompleteListener {
                     task ->
                 if(task.isSuccessful){
                     //Login
                     moveMainPage(task.result?.user)
                 } else{
                     //show the error message
                     Toast.makeText(this,task.exception?.message,Toast.LENGTH_LONG).show()
                 }
             }
     }

    🔱 account에서 id토큰을 가져와서 firebase 사용자 인증 정보로 교환해야 하는데 signInwithCredential로 할 수 있음

 

그 아래 코드는 signInAndSignup코드에서 가져왔다.( 같은 기능을 해야 하기 때문에 ) 

👩🏻‍💻‼️ 아 그리고 이전 글에서 큰 실수를 한 것이 있었는데 원래 moveMainPage 함수에서 유저가 존재하면 메인으로 넘어가야 하는데 그냥 앱이 튕겨 버렸는데 그 이유는

Intent 안을 비우고 썼기 때문이었다 !! 

아무튼 잘 고쳐져서 이제는 잘 넘어간다 
  fun moveMainPage(user:FirebaseUser?){
         if (user != null){ // 유저가 존재할
             startActivity(Intent(this,MainActivity::class.java))
         }
     }

 

동작 화면

이미 구글로 로그인을 해놓은 상태였기 때문에 그냥 main 화면으로 넘어가지만 원래는 구글 로그인하라고 창이 뜬다 ! 

 

오늘은 여기까지 👩🏻‍💻‼️

728x90

댓글