[Android/Kotlin] KaKao Login API 활용 (카카오 로그인)

SoyoungLee·2022년 7월 22일
1

안드로이드/코틀린

목록 보기
35/68
post-thumbnail
post-custom-banner

💌 [안드로이드/코틀린] KaKao Login API 활용 (카카오 로그인)

https://developers.kakao.com/docs/latest/ko/getting-started/sdk-android

📌 요구 사양

  • Android Studio 3.6.1 이상
  • API 21: Android 5.0(Lollipop) 이상
  • Java 8 이상

📌 Gradle 설정

💜 build.gradle에 추가 : Android Studio Artic Fox(최신) 외 버전

allprojects {    
    repositories {        
        google()        
        jcenter()        
        maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/'}    
    }
}

💜 settings.gradle에 추가 : Android Studio Artic Fox(최신) 버전

dependencyResolutionManagement {    
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)    
        repositories {        
            google()        
            mavenCentral()        
            maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' }    
    }
}

📌 필요한 모듈 설정

💜 build.gradle(Module) 에 추가

dependencies {
  implementation "com.kakao.sdk:v2-user:2.11.0" // 카카오 로그인
}

💜 AndroidManifest.xml 에 추가

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.sample">
 
    <!-- 인터넷 사용 권한 설정-->
    <uses-permission android:name="android.permission.INTERNET" />

    <application
    android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
    ...

📌 플랫폼 등록

링크 를 클릭하여 안드로이드 프로젝트를 추가해준다


내 애플리케이션 > 플랫폼 > Android 플랫폼 등록


등록하기 위한 키 해시가 필요하다.

📌 카카오 로그인 활성화

내 애플리케이션 > 카카오 로그인 > 활성화 설정 > ON

+ 안해주면 카카오 관리자 설정 이슈 (KOE004) 오류가 난다..

📌 키 해시 등록

💜 OpenSSL 터미널을 이용

디버그 키 해시 생성

// Mac
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android | openssl sha1 -binary | openssl base64

// Windows
keytool -exportcert -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore -storepass android -keypass android | openssl sha1 -binary | openssl base64

릴리즈 키 해시 생성

// Mac
keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64

// Windows
keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | PATH_TO_OPENSSL_LIBRARY\bin\openssl base64

💜Kakao SDK를 이용

키 해시 생성

import com.kakao.sdk.common.util.Utility
import android.util.Log

var keyHash = Utility.getKeyHash(this)
Log.d("Hash", keyHash)

생성된 키 해시를 등록 완료하면 된다.

📌 Kakao SDK 초기화

  • Application 상속받은 GlobalApplication 클래스를 생성하여 KaKao SDK 초기화를 해준다.
    내 애플리케이션 > 앱 설정 > 요약 정보 에서 네이티브 앱 키를 확인하여 넣어준다.
import android.app.Application
import com.kakao.sdk.common.KakaoSdk

class GlobalApplication : Application() {
    override fun onCreate() {
        super.onCreate()

        // KaKao SDK  초기화
        KakaoSdk.init(this, BuildConfig.NATIVE_APP_KEY)
    }
}

📌 AndroidManifest.xml 에 추가

  • GlobalApplication 클래스가 실행될 수 있게 추가

<application
    <!-- android:name 설정 -->
    android:name=".GlobalApplication"
    ...
>

Redirect URI 설정

  • 로그인 구현을 위해 리다이렉션(Redirection)을 통해 인가 코드를 받아야한다.
  • AndroidManifest.xml에 액티비티(Activity) 설정.
  • Android 12(API 31) 이상을 타깃으로 하는 앱이면, exported 요소를 반드시 "true"로 선언
  • 네이티브 앱 키가 "123456789"라면 "kakao123456789"를 입력
<activity 
    android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        
        <!-- Redirect URI: "kakao${NATIVE_APP_KEY}://oauth" -->
        <data android:host="oauth"
                android:scheme="kakao${NATIVE_APP_KEY}" />
    </intent-filter>
</activity>

📌 카카오 로그인 구현

  • 카카오 로그인은 카카오톡 설치 시 카카오톡으로 연결 로그인 (loginWithKakaoTalk) ,
    카카오계정으로 로그인 (loginWithKakaoAccount) 두가지가 있다.
// 카카오 로그인
btnKakao.setOnClickListener{

	// 카카오계정으로 로그인 공통 callback 구성
	// 카카오톡으로 로그인 할 수 없어 카카오계정으로 로그인할 경우 사용됨

	val callback: (OAuthToken?, Throwable?) -> Unit = { token, error ->
		if (error != null) {
			Log.e("LOGIN", "카카오계정으로 로그인 실패", error)
		} else if (token != null) {
			Log.i("LOGIN", "카카오계정으로 로그인 성공 ${token.accessToken}")
		}
	}

	// 카카오톡이 설치되어 있으면 카카오톡으로 로그인, 아니면 카카오계정으로 로그인
	if (UserApiClient.instance.isKakaoTalkLoginAvailable(context)) {
		UserApiClient.instance.loginWithKakaoTalk(context) { token, error ->
			if (error != null) {
				Log.e("LOGIN", "카카오톡으로 로그인 실패", error)

				// 사용자가 카카오톡 설치 후 디바이스 권한 요청 화면에서 로그인을 취소한 경우,
				// 의도적인 로그인 취소로 보고 카카오계정으로 로그인 시도 없이 로그인 취소로 처리 (예: 뒤로 가기)
				if (error is ClientError && error.reason == ClientErrorCause.Cancelled) {
    					return@loginWithKakaoTalk
				}

				// 카카오톡에 연결된 카카오계정이 없는 경우, 카카오계정으로 로그인 시도
				UserApiClient.instance.loginWithKakaoAccount(context, callback = callback)
		} else if (token != null) {
				Log.i("LOGIN", "카카오톡으로 로그인 성공 ${token.accessToken}")
				val intent = Intent(mContext, MainActivity::class.java)
				startActivity(intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
				finish()
			}
		}
	} else {
		UserApiClient.instance.loginWithKakaoAccount(context, callback = callback)
	}
}

📌 로그아웃 구현

fun kakaoLogout() {
        // 로그아웃
        UserApiClient.instance.logout { error ->
            if (error != null) {
                Log.e("Hello", "로그아웃 실패. SDK에서 토큰 삭제됨", error)
            } else {
                Log.i("Hello", "로그아웃 성공. SDK에서 토큰 삭제됨")
                Utils.Toast(mContext, "로그아웃 성공. SDK에서 토큰 삭제됨")
            }
        }
    }

📌 토큰까지 삭제하는 로그인 연결 끊기

fun kakaoUnlink() {
        // 연결 끊기
        UserApiClient.instance.unlink { error ->
            if (error != null) {
                Log.e("Hello", "연결 끊기 실패", error)
            } else {
                Log.i("Hello", "연결 끊기 성공. SDK에서 토큰 삭제 됨")
                Utils.Toast(mContext, "연결 끊기 성공. SDK에서 토큰 삭제 됨")
            }
        }
        finish()
    }
profile
Android Developer..+ iOS 슬쩍 🌱 ✏️끄적끄적,,개인 기록용 👩🏻‍💻
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 9월 19일

안녕하세요 질문이 있습니다. 로그인 구현하는 부분에서 UserApiClient.instance.isKakaoTalkLoginAvailable(context) 중 context는 어떤것을 의미하는지 궁금합니다. 동일하게 소스를 작성했는데 context가 선언이되어있지 않아 오류가 생기네요..
답변 해주시면 감사하겠습니다.

답글 달기