반응형

새로 만들려는 앱에 로그인을 구현하려고 생각하다

요즘 외국 사이트 등에서 구글 로그인을 사용하는 곳도 많고 해서

앱에 구글 로그인으로 사용하기로 마음먹었습니다.

 

안드로이드에서 파이어 베이스 구글 로그인 연동하기 설명입니다.

 

안드로이드 스튜디오 + 파이어 베이스 firebase 설정, 연결하기
https://dxkor2.tistory.com/318

 

안드로이드 스튜디오 파이어 베이스 SHA 지문 등록하기

https://dxkor2.tistory.com/326


구글 콘솔에서 이미 만들어진 프로젝트 선택->Authentication->시작->Sign-in method->Google 선택

https://console.firebase.google.com/


사용 설정->프로젝트 지원 이메일  입력(본인 이메일)->저장


그러면 위와 같이 설정됩니다.


dependencies {
 
  
    implementation 'com.google.firebase:firebase-auth-ktx'
    implementation 'com.google.android.gms:play-services-auth:20.0.0'
 
 
 

안드로이드 스튜디오 그리들에 다음을 추가해 줍니다.

 

    implementation platform('com.google.firebase:firebase-bom:29.0.1')
    implementation 'com.google.firebase:firebase-analytics'
 

상위 두줄은 이미 파이어 베이스 프로젝트 생성 시 이미 추가했을 것입니다.

 

그리들에서 만일 위와 같은 색으로 표시된다면

해당 코드 줄에서 ALT+SHIFT+ENTER 입력해 최신 버전으로 바꾸어 줍니다.


dependencies {
 
    implementation platform('com.google.firebase:firebase-bom:29.0.1')
    implementation 'com.google.firebase:firebase-analytics'
 
    implementation 'com.google.firebase:firebase-auth-ktx'
    implementation 'com.google.android.gms:play-services-auth:20.2.0'
 
 
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.6.0'
    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.2'
 
    implementation 'androidx.constraintlayout:constraintlayout:2.1.2'
 
    implementation 'com.google.firebase:firebase-firestore-ktx:24.2.2'
}
 
 
 

2022년 8월

안드로이드 스튜디오 버전 422 

제가 성공한 빌드 그리드 부분 입니다.


activity_main_xml 에 구글 Sign in 버튼을 추가해 줍니다.

        <com.google.android.gms.common.SignInButton
            android:id="@+id/sign_in_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />


//이 코드 위에 작성 합니다.
</androidx.constraintlayout.widget.ConstraintLayout>
 

 

코드를 실행 해 보면 위와 같은 버튼이 생깁니다.


주요 코딩 부분

//----------------------------------------------------------------------------
//구글 로그인에 필요한 변수 설정
  private val RC_SIGN_IN = 9001
 
  private var googleSignInClient: GoogleSignInClient?=null
 
  lateinit var auth: FirebaseAuth // 객체의 공유 인스턴스
//----------------------------------------------------------------------------
 
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
  
    //-----------------------------------------------------------------------
 
    auth = Firebase.auth
 
    //-----------------------------------------------------------------------
    //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 이부분
    //values.xml 의  default_web_client_id ="false">....</string> 
    // .... 여기 값을 읽어 복사 
    //ctrl+ shift + F 로  default_web_client_id 전체 검색 하면 찾기 쉽습니다.
*파이어 베이스 연결 후 최소 한번 실행 성공 해야 검색 됩니다.

 
    val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
      .requestIdToken("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 이부분")
      .requestEmail()
      .build()
  
    //-----------------------------------------------------------------------
    val signInGoogleBtn: SignInButton = findViewById(R.id.sign_in_button) //구글 sign in 버튼 객체
    
    signInGoogleBtn.setOnClickListener { //구글 로그인 버튼 이벤트 처리
    
      //로그인 처리
      googleSignInClient = GoogleSignIn.getClient(this, gso)
      val signInIntent = googleSignInClient!!.signInIntent
      startActivityForResult(signInIntent, RC_SIGN_IN)
 
    }
  } //create
 
 
 
이렇게 입력

 


구글에 인증하는 부분 

 //--------------------------------------------------------------------------------------
  override fun onDestroy() {
    super.onDestroy()
    firebaseAuthSignOut()
  }// onDestory() 밑부분에 추가 해줍니다.(onCreate 외부)
 
  // 구글에 인증 하는 부분입니다
  //--------------------------------------------------------------------------------------
  //객체에서 ID 토큰을 가져 옮
  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 { //로그인 성공시
        val account = task.getResult(ApiException::class.java)!!
        firebaseAuthWithGoogle(account.idToken!!)
      } catch (e: ApiException) {//로그인 실패
      }
    }
  }
 
 
 

구굴 로그인 버튼을 클릭하면 이 부분을 호출 합니다.


위와 같이 override fun onDestroy() {..} 밑에 이어서 작성 (onCreate 외부)

 

  private fun firebaseAuthWithGoogle(idToken: String) {
    val credential = GoogleAuthProvider.getCredential(idToken, null)
    auth.signInWithCredential(credential)
      .addOnCompleteListener(this) { task ->
        if (task.isSuccessful) { //성공
          val user = auth.currentUser
         user?.let {
            val name = user.displayName
            val email = user.email
            val displayName = user.displayName
            val photoUrl = user.photoUrl
            val emailVerified = user.isEmailVerified
            val uid = user.uid
            Log.d("xxxx name",name.toString())
            Log.d("xxxx email",email.toString())
            Log.d("xxxx displayName",email.toString())

          }
          
        } else { //실패
          Log.d("xxxx ","signInWithCredential:failure", task.exception)
        }
      }
  }
 
 

 구글에 인증 성공한 경우 호출하게 해서 파이어 베이스에도 연결해 줍니다.

 

파이어 베이스에 로그인 한 계정의 이메일 정보등을 받아올수도 있습니다.


구글 공식 설명 부분을 참고하세요

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

 

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


로그 아웃 시키기

 

위에서 와  같이 override fun onDestroy() {..} 밑에 이어서 작성 (onCreate 외부)

 private fun firebaseAuthSignOut(){ //로그 아웃 시키기
    Firebase.auth.signOut()
  }
 
 
 

만일 로그인 하지 않은 상태에서 호출하면

오류가 발생할수 있으므로 판별 처리해 줘야 합니다.


실행 해 보기

빌드 후 Sign in 버튼을 클릭합니다.

 

만일 에뮬에서 실행하고 아직 구글 이메일이 등록되지 않았다면 위와 같은 화면이 나옵니다.

이메일을 등록해줍니다.


Sing in 버튼을 클릭해서 구글 이메일 인증이 완료된 후

파이어 콘솔 프로젝트에 가보면 이메일 인증이 되어 있습니다.

https://console.firebase.google.com/


위와 같이 로그아웃 시키면 처음 성공했던 구글 계정으로 계속 로그인 하게 됩니다.

로그인 계정 선택하게 하는 방법

 

로그인 때  계정 선택하게 하기

  private fun firebaseAuthSignOut(){ //로그 아웃 시키기
    Firebase.auth.signOut()
    googleSignInClient!!.signOut()  //로그인 선택되게
  }
 
 
 

이 부분을  추가하면 로그인 할때 마다

다시 구글 계정을 묻게 됩니다.


앱 실행 후 로그인 후에 , 로그 아웃하고

다시 실행하면, 위와 같이 로그인 구글 메일을 선택할 수 있는 화면이 뜹니다.

 

* 잘 되다가 가끔 에뮬레이터에서 로그인이 안 되는 경우가 있는데

이때는 실제 기기에서 테스트 해보세요

반응형

+ Recent posts