새로 만들려는 앱에 로그인을 구현하려고 생각하다
요즘 외국 사이트 등에서 구글 로그인을 사용하는 곳도 많고 해서
앱에 구글 로그인으로 사용하기로 마음먹었습니다.
안드로이드에서 파이어 베이스 구글 로그인 연동하기 설명입니다.
안드로이드 스튜디오 + 파이어 베이스 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() //로그인 선택되게
}
|
이 부분을 추가하면 로그인 할때 마다
다시 구글 계정을 묻게 됩니다.
앱 실행 후 로그인 후에 , 로그 아웃하고
다시 실행하면, 위와 같이 로그인 구글 메일을 선택할 수 있는 화면이 뜹니다.
* 잘 되다가 가끔 에뮬레이터에서 로그인이 안 되는 경우가 있는데
이때는 실제 기기에서 테스트 해보세요
'프로그램잉_기타 > 안드로이드 스튜디오' 카테고리의 다른 글
안드로이드 스튜디오 패키지 이름 일괄 바꾸기 (0) | 2022.06.27 |
---|---|
안드로이드 스튜디오 CPP 파일들이 보이지 안을때 (0) | 2022.03.02 |
안드로이드 스튜디오 파이어 베이스 SHA 지문 등록하기 (0) | 2021.12.10 |
안드로이드 스튜디오 c++ 에서 log 출력하기 (0) | 2021.11.30 |
안드로이드 스튜디오, 코틀린 읽은 비트맵 사이즈가 원본하고 다를때 (0) | 2021.11.23 |