Firebase Auth Kotlin 으로 적용

Firebase Auth With Kotlin

서버 개발 기간 단축을 위해 Firebase 를 이용하기로 했다.

제일 먼저 회원관리를 위한 auth 를 적용했다.

!Firebase Auth 가이드 를 참조하면 매우 친절한 예제와 방법이 나와있다. 추가로 안드로이드 스튜디오에서도 바로 적용가능하다.

안드로이드 스튜디오 적용방법

1. menu -> tools -> Firebase 클릭

firebase-auth1

2. Authentication 확장 후 Email and password authentication 클릭

firebase-auth2

3. 이제 Firebase 계정과 연결해주자! Connect to Firebase 클릭!!!!

firebase-auth3

4. 프로젝트 정보 기입 후 적용하면 !!!! Firebase 프로젝트 생성 완료!!!! (빠름빠름빠름~)

firebase-auth4

5. 이제 소스상에서 Firebase 를 추가해주자. Accept Changes 클릭하면 자동 Build ~~



직접 문서보면서 추가하는 것보다는 훨씬 손쉽고 편하다.
문서보면서 최초 작성해보고 그 이후에는 스튜디오로 적용하는게 좋을거같다.

그리고 이제 초기 설정이 완료되었으면 코틀린을 이용해 auth 를 구현해보자!!!

아래 코드는 AAC 를 적용한 auth를 구현중인 코드이다
현재는 이메일 가입만 구현해놓았으며, 추후 기타 firebase 에서 지원하는 로그인 연동 방식을 구현할 예정이다.

const val MIN_PASSWORD_LENGTH = 8 // 최소 비밀번호 길이
const val TAG = "LoginViewModel"
class LoginViewModel(lifecycleOwner: LifecycleOwner, private val loginActions: LoginActions) : ViewModel(), LifecycleObserver, LoginFragment.LoginFragmentActions {
val loginData = MutableLiveData<LoginViewData>() // view data
private val fbAuthListener: FirebaseAuth.AuthStateListener //로그인 상태 리스너
private val fbAuth = FirebaseAuth.getInstance() // firebase auth 객체
init {
// login view data 초기화
loginData.value = LoginViewData("", "", "", null, false, false, null)
// auth listener 초기화
fbAuthListener = FirebaseAuth.AuthStateListener { firebaseAuth ->
val user = firebaseAuth.currentUser
if (user != null) {
// User is signed in
LogUtil.d(TAG, "onAuthStateChanged:signed_in:" + user.uid)
} else {
// User is signed out
LogUtil.d(TAG, "onAuthStateChanged:signed_out")
}
}
// lifecycle observer 등록
lifecycleOwner.lifecycle.addObserver(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun registerAuthListener() {
// auth 상태 정보 listener 등록
fbAuth.addAuthStateListener(fbAuthListener)
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun unregisterAuthListener() {
// auth 상태 정보 listener
fbAuth.removeAuthStateListener(fbAuthListener)
}
/**
* 이메일 확인
*/
override fun onEmailChanged(email: String) {
if (Validator.isEmailValid(email)) {
loginData.value!!.email = email
} else {
loginData.value!!.email = ""
}
}
/**
* 패스워드 확인
*/
override fun onPasswordChanged(password: String) {
if (password.length >= MIN_PASSWORD_LENGTH) {
loginData.value!!.password = password
} else {
loginData.value!!.password = ""
}
}
/**
* 이메일 로그인 시도
*/
override fun onClickEmailLogin() {
// 입력 정보 확인
val error = checkError()
if (error != null) {
loginData.value = loginData.value!!.copy(error = error, isSuccessLogin = false)
return
}
// 에러 초기화
loginData.value!!.error = null
// loading 시작 : show progressbar
loginData.value = loginData.value!!.copy(isLoading = true)
// firebase auth 이메일 로그인
fbAuth.signInWithEmailAndPassword(loginData.value!!.email, loginData.value!!.password)
.addOnCompleteListener({ task ->
// login response 처리
if (task.isSuccessful) {
loginActions.successLogin()
} else {
checkExistEmail()
}
})
}
/**
* 기존 가입 여부 확인
*/
private fun checkExistEmail() {
fbAuth.fetchProvidersForEmail(loginData.value!!.email)
.addOnCompleteListener({ task ->
// 이메일 존재
if (task.isSuccessful) {
///////// getProviders().size() will return size 1. if email ID is available.
loginData.value = loginData.value!!.copy(isAlreadyExist = task.result.providers!!.size == 1)
} else {
loginData.value = loginData.value!!.copy(isLoading = false,
isSuccessLogin = false,
error = ERROR.SERVER_ERROR
.apply {
errorMsg = task.exception?.message!!
})
loginData.value!!.error = null
}
})
}
/**
* 이메일로 가입하기
*/
fun signUpEmail() {
fbAuth.createUserWithEmailAndPassword(loginData.value!!.email, loginData.value!!.password)
.addOnCompleteListener({ task ->
//회원가입 완료
if (task.isSuccessful) {
loginActions.successLogin()
} else {
loginData.value = loginData.value!!.copy(isLoading = false,
isSuccessLogin = false,
error = ERROR.SERVER_ERROR
.apply {
errorMsg = task.exception?.message!!
})
loginData.value!!.error = null
}
})
}
/**
* 입력값 에러 확인
*/
private fun checkError(): ERROR? {
when {
TextUtils.isEmpty(loginData.value!!.email) -> return ERROR.INVALID_EMAIL
TextUtils.isEmpty(loginData.value!!.password) -> return ERROR.INVALID_PASSWORD
}
return null
}
override fun onClickFacebookLogin() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
class ViewModelFactory(private val lifecycleOwner: LifecycleOwner, private val loginActions: LoginActions) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return LoginViewModel(lifecycleOwner, loginActions) as T
}
}
}

Comments