개발일지

Android in A..Z - OAuth (Kakao) 본문

Android (안드로이드)/OAuth

Android in A..Z - OAuth (Kakao)

강태종 2021. 5. 5. 01:36

 


1. 프로젝트 등록

developers.kakao.com/console/app

 

카카오계정 로그인

여기를 눌러 링크를 확인하세요.

accounts.kakao.com


2. Gradle 설정

build.gradle(Project)

allprojects {
    repositories {
        google()
        jcenter()

        // Kakao
        maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' }
    }
}

 

build.gradle(Module)

dependency

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

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

3. KeyHash 얻기

keyHash를 얻고 Log로 출력하여 복사한다.

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

var keyHash = Utility.getKeyHash(this)

4. 앱 등록하기

플랫폼에 들어가서 3번에서 얻은 KeyHash를 통해 Android 플랫폼을 등록한다.


5. 카카오 로그인 ON으로 설정하기

제품설정 -> 카카오 로그인에서 활성화 설정을 ON으로 바꾼다.


6. 동의항목 설정하기

제품설정 -> 카카오 로그인 -> 동의항목에서 얻고싶은 정보를 체크한다.


7. Key 등록하기

네이티브 앱 키를 string.xml에 등록하여 8번과 9번에서 사용한다.


8. Redirect URI 설정하기

AndroidManifest.xml에 등록한다. 예를 들어 네이티브 앱 키가 '123456789'라면 'kakao123456789'를 입력합니다.

<activity android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity">
    <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>

9. Application설정하기

Application을 상속받는 Class를 만들고 onCreate에 KakaoSdk를 초기화하는 코드를 작성한다. 그리고 AndroidManifest.xml에서 Application을 설정한다.

class MainApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        KakaoSdk.init(this, getString(R.string.kakao_api_key))
    }
}
    <application
        android:name=".MainApplication"

10. 로그인 코드

로그인을 진행할 때 디바이스에 카카오톡이 설치된 상태면 카카오톡으로 로그인할 수 있고 설치되지 않은 상태면 브라우저로 로그인할 수 있다.

  • isKaKAoTalkLoginAvailable : 카카오톡으로 로그인이 가능한지
  • loginWithKakaoTalk : 카카오톡으로 로그인
  • loginWithKakaoAccount : 카카오톡 계정으로 로그인 (브라우저 기반)
val callback: (OAuthToken?, Throwable?) -> Unit = callback@{ token, error ->
    if (error != null) {
        Log.e("PASS", "로그인 실패", error)
    } else if (token != null) {
        Log.d("PASS", token.toString())
    }
}

if (UserApiClient.instance.isKakaoTalkLoginAvailable(this)) {
    UserApiClient.instance.loginWithKakaoTalk(this, callback = callback)
} else {
    UserApiClient.instance.loginWithKakaoAccount(this, callback = callback)
}

11. 추가 정보 가져오기

Login을 하여 token을 캐쉬에 저장하고 loginWithNewScopes로 필요 정보를 담은 Scope를 통해 추가 정보를 가져온다. 이때 가져온 정보는 me를 통해 확인할 수 있다.

val callback: (OAuthToken?, Throwable?) -> Unit = callback@{ _, error1 ->
    if (error1 != null) {
        Log.e("PASS", "로그인 실패", error1)
        return@callback
    }

    val scopes = listOf("account_email", "birthday", "gender")
    UserApiClient.instance.loginWithNewScopes(requireContext(), scopes) { _, error2 ->
        if (error2 != null) {
            Log.e("PASS", "사용자 추가 정보 획득 로그인 실패", error2)
            return@loginWithNewScopes
        }

        UserApiClient.instance.me { user, error3 ->
            if (error3 != null) {
                Log.e("PASS", "사용자 추가 정보 획득 실패", error3)
                return@me
            }

            with(viewModel) {
                email = user?.kakaoAccount?.email
                gender = user?.kakaoAccount?.gender?.name
                birth = null
                name = user?.kakaoAccount?.profile?.nickname
                type = "Kakao"
            }

            findNavController().navigate(LoginFragmentDirections.actionLoginFragmentToProfileFragment())
        }
    }
}

if (UserApiClient.instance.isKakaoTalkLoginAvailable(requireContext())) {
    UserApiClient.instance.loginWithKakaoTalk(requireContext(), callback = callback)
} else {
    UserApiClient.instance.loginWithKakaoAccount(requireContext(), callback = callback)
}

12. 로그아웃

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

Git (예제코드)

github.com/KangTaeJong98/Example/tree/main/Android/OAuth

 

KangTaeJong98/Example

My Example Code. Contribute to KangTaeJong98/Example development by creating an account on GitHub.

github.com


developers.kakao.com/docs/latest/ko/kakaologin/android

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

developers.kakao.com/docs/latest/ko/getting-started/sdk-android#select-module

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

'Android (안드로이드) > OAuth' 카테고리의 다른 글

Android in A..Z - OAuth (Naver)  (0) 2021.05.07
Android in A..Z - OAuth (People)  (0) 2021.05.04
Android in A..Z - OAuth (Google)  (2) 2021.05.04
Comments