firebase 문서 → 인증 → 안드로이드 → 비밀번호 인증 문서에서 시작
회원가입만 했던 부분에서 이제는 로그인 완료를 구현해보고자 합니다.
이메일 주소와 비밀번호로 사용자 로그인 처리하기 부분에 signInWithEmailAndPassword
를 가져와서 createAccount 밑에 private fun loginUser를 생성합니다.
private fun loginUser(email: String, password: String) {
auth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this) { task ->
if (task.isSuccessful) {
// Sign in success, update UI with the signed-in user's information
Log.d(TAG, "이메일 로그인 완료")
val user = auth.currentUser
updateUI(user)
} else {
// If sign in fails, display a message to the user.
Log.w(TAG, "signInWithEmail:failure", task.exception)
Toast.makeText(baseContext, "로그인 실패",
Toast.LENGTH_SHORT).show()
updateUI(null)
}
}
}
createAccount의 else부분에 loginUser를 호출합니다.
private fun createAccount(email: String, password: String) { //6월27일 추가
// [START create_user_with_email]
auth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this) { task ->
if (task.isSuccessful) {
// Sign in success, update UI with the signed-in user's information
Log.d(TAG, "createUserWithEmail:success")
Toast.makeText(baseContext, "회원가입 성공",
Toast.LENGTH_SHORT).show()
//val user = auth.currentUser
//updateUI(user)
} else {
loginUser(email, password)
// If sign in fails, display a message to the user.
/*Log.w(TAG, "createUserWithEmail:failure", task.exception)
Toast.makeText(baseContext, "Authentication failed.",
Toast.LENGTH_SHORT).show()*/
//updateUI(null)
}
}
// [END create_user_with_email]
}
일단 실패인 경우는 두고 사용자가 입력한 이메일과 비밀번호가 존재할 경우를 else로 판단하여 loginUser에 사용하였습니다.
다음으로 AuthStateListener를 통해 로그인 성공이면 다음 단계를 호출하는 역할을 합니다. 그러나 이 리스너는 현재 공식문서에서 사라지고 FirebaseUser객체와 updateUI 호출로 바뀌었으나 일단 리스너를 사용하여 진행하였습니다.
전역변수로
private lateinit var mAuthListener : FirebaseAuth.AuthStateListener
를 선언하고
mAuthListener = FirebaseAuth.AuthStateListener() {
override fun onAuthStateChanged(@NonNull firebaseAuth: FirebaseAuth) {
val user: FirebaseUser? = firebaseAuth.currentUser
if (user != null) run {
val intent = Intent(this, HomeActivity::class.java) //원하는 클래스로 데이터 받기
startActivity(intent)
finish()
} else {
}
}
}
를 통해 3가지(일반이메일, 페이스북, 구글)로그인에 대해 통합하여 처리하도록 onCreate에 넣어 사용하려했지만 자바는 코틀린과 달리 인터페이스의 익명 클래스 구현이 있습니다(클래스가 아니라 인터페이스라고 가정합니다). 그러나 코틀린은 없기 때문에 여기서 Modifier 'override' is not applicable to 'local function’ 오류가 발생하였는데 아직 해결하지 못하였습니다..
일단 남겨두고 로그인 성공 시 나올 액티비티를 하나 생성하겠습니다.
new에 가서 Navigation Drawer Activity를 만들어 HomeActivity로 이름을 만들어 주었습니다.
그리고 res→layout→menu 에 activity_main_drawer.xml에서 item 태그를 통해 로그아웃 버튼을 생성해줍니다.
그 후 HomeActivity에서 navigationView와 view를 연동하기 위해 nav_header_home.xml의 헤더 텍스트 부분을 유저이름과 유저이메일로 교체하기 위해 id를 생성합니다.
HomeActivity에서 전역변수로 선언한 후
private lateinit var nameTextView : TextView
private lateinit var emailTextView : TextView
val view : View = navView.getHeaderView(0)
nameTextView = TextView(view.findViewById(R.id.header_name_text))
emailTextView = TextView(view.findViewById(R.id.user_email))
nameTextView.text = auth.currentUser!!.displayName
emailTextView.text = auth.currentUser!!.email
위 코드를 작성하여 유저이름과 유저이메일을 사용합니다.
이제 MainActivity에서 로그인 성공 시 intent를 통해 HomeActivity를 불러오도록 합니다.
그게 바로 위에서 사용했던 코드입니다.
mAuthListener = FirebaseAuth.AuthStateListener(){
override fun onAuthStateChanged(@NonNull firebaseAuth: FirebaseAuth) {
val user: FirebaseUser? = firebaseAuth.currentUser
if (user != null)run{
val intent = Intent(this, HomeActivity::class.java) //원하는 클래스로 데이터 받기
startActivity(intent)
finish()
}else {
}
}
}
그 후 리스너를 액티비티에 연결하도록 onStart와 onStop을 생성합니다.