Firebase Auth Kotlin 으로 적용
Firebase Auth With Kotlin
서버 개발 기간 단축을 위해 Firebase 를 이용하기로 했다.
제일 먼저 회원관리를 위한 auth 를 적용했다.
!Firebase Auth 가이드 를 참조하면 매우 친절한 예제와 방법이 나와있다. 추가로 안드로이드 스튜디오에서도 바로 적용가능하다.
안드로이드 스튜디오 적용방법
1. menu -> tools -> Firebase 클릭
2. Authentication 확장 후 Email and password authentication 클릭
3. 이제 Firebase 계정과 연결해주자! Connect to Firebase 클릭!!!!
4. 프로젝트 정보 기입 후 적용하면 !!!! Firebase 프로젝트 생성 완료!!!! (빠름빠름빠름~)
5. 이제 소스상에서 Firebase 를 추가해주자. Accept Changes 클릭하면 자동 Build ~~
직접 문서보면서 추가하는 것보다는 훨씬 손쉽고 편하다.
문서보면서 최초 작성해보고 그 이후에는 스튜디오로 적용하는게 좋을거같다.
그리고 이제 초기 설정이 완료되었으면 코틀린을 이용해 auth 를 구현해보자!!!
아래 코드는 AAC 를 적용한 auth를 구현중인 코드이다
현재는 이메일 가입만 구현해놓았으며, 추후 기타 firebase 에서 지원하는 로그인 연동 방식을 구현할 예정이다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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