회원가입과 로그인은 Firebase Authentication을 통한 이메일과 카카오 로그인을 통해서만 제공할 것이다.
Firebase Authentication은 처음이기에 동작 원리부터 예제까지 숙지해 볼 예정이다.
이메일과 비밀번호로 이루어진 회원가입을 하기 위해서는 우선 FirebaseAuth 객체의 공유 인스턴스를 가져와야 한다.
val auth = Firebase.auth
그 후 입력받은 이메일 주소와 비밀번호를 전달하면 된다.
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")
val user = auth.currentUser
} else {
// 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()
}
}
btnSignIn.setOnClickListener {
auth.signInWithEmailAndPassword(email,password).addOnCompleteListener {
task->
if (task.isSuccessful){
tv.text = "로그인 성공"
}else{
tv.text = task.exception.toString()
}
}
}
로그인도 회원가입과 동일한 로직으로 작동되는, signInWithEmailAndPassword 메서드를 사용하면 된다.
공식 문서를 참고하자
카카오 로그인 구현 방법은 두가지로 나뉜다.
사용자 앱에 설치된 카카오 앱을 이용한 '카카오톡으로 로그인' 방법과 기본 웹 브라우저를 통한 카카오 계정 정보를 입력으로 하는 '카카오 계정으로 로그인' 방법이 있다.
공식문서에는 '카카오톡으로 로그인' 방법을 권장한다고 나와있다. 하지만, 극히 드물겠지만 카카오톡을 설치하지 않은 사용자들도 있을 수 있기 때문에 예외 처리는 해줘야할 것 같다.
카카오톡으로 로그인 할 때는 loginWithKaKaoTalk()메서드를 사용하면 된다.
해당 API가 성공적으로 동작하면 Android SDK는 카카오톡 앱을 실행하여 사용자를 인증한다.
UserApiClient.instance.loginWithKakaoTalk(context) { token, error ->
if (error != null) {
Log.e(TAG, "로그인 실패", error)
}
else if (token != null) {
Log.i(TAG, "로그인 성공 ${token.accessToken}")
}
}
카카오 계정으로 로그인 할 때는 loginWithKakaoAccount()를 호출하면 된다.
호출 시 Android SDK가 웹 브라우저를 실행하고 카카오 로그인 화면을 띄운다.
UserApiClient.instance.loginWithKakaoAccount(context) { token, error ->
if (error != null) {
Log.e(TAG, "로그인 실패", error)
}
else if (token != null) {
Log.i(TAG, "로그인 성공 ${token.accessToken}")
}
}
사용자가 로그인 했는지의 여부를 판단하기 위해서는 hasToken()을 통해 토큰의 존재 여부로 판단한다.
하지만 주의할 점은 hasToken()의 결과가 true라고 해도 현재 사용자가 로그인 상태임을 보장하지는 않는다.
if (AuthApiClient.instance.hasToken()) {
UserApiClient.instance.accessTokenInfo { _, error ->
if (error != null) {
if (error is KakaoSdkError && error.isInvalidTokenError() == true) {
//로그인 필요
}
else {
//기타 에러
}
}
else {
//토큰 유효성 체크 성공(필요 시 토큰 갱신됨)
}
}
}
else {
//로그인 필요
}
로그인하고 동의 처리를 한 사용자에게 회원 정보를 가져오기 위해서는 UserApiClient의 me()를 호출하면 된다.
UserApiClient.instance.me { user, error ->
if (error != null) {
Log.e(TAG, "사용자 정보 요청 실패", error)
}
else if (user != null) {
Log.i(TAG, "사용자 정보 요청 성공" +
"\n회원번호: ${user.id}" +
"\n이메일: ${user.kakaoAccount?.email}" +
"\n닉네임: ${user.kakaoAccount?.profile?.nickname}" +
"\n프로필사진: ${user.kakaoAccount?.profile?.thumbnailImageUrl}")
}
}
로그아웃은 사용자 액세스 토큰과 리프레시 토큰을 모두 만료시켜 더 이상 해당 사용자 정보롤 카카오 API를 호출할 수 없도록 하는 구조이다.
UserApiClient의 logout을 호출하여 로그아웃을 요청할 수 있다.
UserApiClient.instance.logout { error ->
if (error != null) {
Log.e(TAG, "로그아웃 실패. SDK에서 토큰 삭제됨", error)
}
else {
Log.i(TAG, "로그아웃 성공. SDK에서 토큰 삭제됨")
}
}