Kakao Developers에서 제공하는 Kakao Login API를 안드로이드 앱에 연결시켜보자
외부 api에 접근하기 위해선 AndroidManifest.xml의 manifest 안에 인터넷 권한을 추가해줘야 한다.
<manifest
...
<uses-permission android:name="android.permission.INTERNET"/>
//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"
}
초반 설정은 [여기를 클릭]를 참고하여 네이티브 앱 키 등록까지 완료하자.
이후 '내 애플리케이션 > 제품 설정 > 카카오 로그인' 설정에서 활성화 설정을 켜주고, '동의 항목 설정'에서 사용자로부터 필요한 정보들을 설정해준다.
//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()
}
}
//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")
}
}
}
UserApiClient.instance.logout { error ->
if (error != null) {
Log.d("카카오","카카오 로그아웃 실패")
}else {
Log.d("카카오","카카오 로그아웃 성공!")
}
}
UserApiClient.instance.unlink { error ->
if (error != null) {
Log.d("카카오로그인","회원 탈퇴 실패")
}else {
Log.d("카카오로그인","회원 탈퇴 성공")
}
}
참고:
https://kdjun97.github.io/kotlin/kotlin-kakao-login/
https://developers.kakao.com/