[Android] 기억에 남는 장소 저장 앱 개발기 - 2

송규빈·2022년 7월 17일
0

DayToGo 개발기

목록 보기
2/7

회원관리

회원가입과 로그인은 Firebase Authentication을 통한 이메일과 카카오 로그인을 통해서만 제공할 것이다.
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에서 토큰 삭제됨")
    }
}
profile
🚀 상상을 좋아하는 개발자

0개의 댓글