[Android] 카카오 로그인 api 연동

제철맞은생선·2023년 2월 16일
1

ANDROID

목록 보기
12/12
post-thumbnail

Kakao Developers에서 제공하는 Kakao Login API를 안드로이드 앱에 연결시켜보자


1. 인터넷 권한 설정

외부 api에 접근하기 위해선 AndroidManifest.xml의 manifest 안에 인터넷 권한을 추가해줘야 한다.

<manifest 
	...
   	<uses-permission android:name="android.permission.INTERNET"/>

2. gradle 설정

//build.gradle(Project)
all projects {
	repositories {
    	maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/'}
    }
}

//build.gradle(module)
dependencies {
    implementation "com.kakao.sdk:v2-user:2.12.1"
}

3. Kakao Developers 설정

초반 설정은 [여기를 클릭]를 참고하여 네이티브 앱 키 등록까지 완료하자.
이후 '내 애플리케이션 > 제품 설정 > 카카오 로그인' 설정에서 활성화 설정을 켜주고, '동의 항목 설정'에서 사용자로부터 필요한 정보들을 설정해준다.


4. 로그인 코드

1. 로그인 확인 (accessTokenInfo)

//MainActivity.kt
UserApiClient.instance.accessTokenInfo { token, error ->
	if (error != null) {
    	Log.e("TAG", "로그인 실패", error)
        startActivity(Intent(this, LoginActivity::class.java))
        finish()
    } else if (token != null) {
    	Log.i("TAG", "로그인 성공 $token")
        startActivity(Intent(this, MainActivity::class.java))
        finish()
    }
}
  • 이미 로그인이 완료된 상태인지 확인

2. 로그인 요청

//LoginActivity
lateinit var kakaoCallback: (OAuthToken?, Throwable?) -> Unit

fun kakaoLogin(){
	setKakaoCallback()
    if (UserApiClient.instance.isKakaoTalkLoginAvailable(this)) {
    	UserApiClient.instance.loginWithKakaoTalk(this) { token, error ->
        if (error != null) {
        	Log.e("TAG", "카카오톡으로 로그인 실패", error)
            if (error is ClientError && error.reason == ClientErrorCause.Cancelled) {
            	return@loginWithKakaoTalk
            }
			UserApiClient.instance.loginWithKakaoAccount(this, callback = kakaoCallback)
        } else if (token != null) {
        	Log.i("TAG", "카카오톡으로 로그인 성공 ${token.accessToken}")
            startActivity(Intent(this, RegisterLogin::class.java))
            finish()
        }
    } else {
    	UserApiClient.instance.loginWithKakaoAccount(this, callback = kakaoCallback)
    }
}

fun setKakaoCallback() {
        kakaoCallback = { token, error ->
            if (error != null) {
                when {
                    error.toString() == AuthErrorCause.AccessDenied.toString() -> {
                        Log.d("[카카오로그인]", "접근이 거부 됨(동의 취소)")
                    }
                    error.toString() == AuthErrorCause.InvalidClient.toString() -> {
                        Log.d("[카카오로그인]", "유효하지 않은 앱")
                    }
                    error.toString() == AuthErrorCause.InvalidGrant.toString() -> {
                        Log.d("[카카오로그인]", "인증 수단이 유효하지 않아 인증할 수 없는 상태")
                    }
                    error.toString() == AuthErrorCause.InvalidRequest.toString() -> {
                        Log.d("[카카오로그인]", "요청 파라미터 오류")
                    }
                    error.toString() == AuthErrorCause.InvalidScope.toString() -> {
                        Log.d("[카카오로그인]", "유효하지 않은 scope ID")
                    }
                    error.toString() == AuthErrorCause.Misconfigured.toString() -> {
                        Log.d("[카카오로그인]", "설정이 올바르지 않음(android key hash)")
                    }
                    error.toString() == AuthErrorCause.ServerError.toString() -> {
                        Log.d("[카카오로그인]", "서버 내부 에러")
                    }
                    error.toString() == AuthErrorCause.Unauthorized.toString() -> {
                        Log.d("[카카오로그인]", "앱이 요청 권한이 없음")
                    }
                    else -> { // Unknown
                        Log.d("[카카오로그인]", "기타 에러")
                    }
                }
            } else if (token != null) {
                Log.d("[카카오로그인]", "로그인에 성공하였습니다.\n${token.accessToken}")
                // tokenInfo , error _로 rename
                UserApiClient.instance.accessTokenInfo { _, _ ->
                    UserApiClient.instance.me { user, _ ->
                        binding.nickname.text = "닉네임: ${user?.kakaoAccount?.profile?.nickname}"
                    }
                }
                startActivity(Intent(this, RegisterLogin::class.java))
                finish()
            } else {
                Log.d("카카오로그인", "토큰==null error==null")
            }
        }
    }
  • isKakaoTalkAvailable()을 통해 카카오톡이 설치되어 있는지 확인
    • 있으면 카카오톡으로 로그인 : loginWithKakaoTalk()
    • 없으면 카카오계정으로 로그인 : loginWithKakaoAccount
  • setKakaoCallback은 카카오 팝업

5. 로그아웃

UserApiClient.instance.logout { error ->
	if (error != null) {
		Log.d("카카오","카카오 로그아웃 실패")
	}else {
		Log.d("카카오","카카오 로그아웃 성공!")
	}
}

6. 회원 탈퇴

UserApiClient.instance.unlink { error ->
	if (error != null) {
		Log.d("카카오로그인","회원 탈퇴 실패")
	}else {
		Log.d("카카오로그인","회원 탈퇴 성공")
	}
}

참고:
https://kdjun97.github.io/kotlin/kotlin-kakao-login/
https://developers.kakao.com/

0개의 댓글