Android

Android에서 Kakao Login SDK 사용하기

나무는tree 2020. 4. 13. 13:41

이전에는 서버를 사용하여 KakaoLogin을 사용했는데, 고학년이 되고 Kakao Developer를 다시 찾아보니 Client만을 사용해서도 사용하는 방법이 있었습니다. 오늘은 그것의 사용법에 대해 정리해보겠습니다.

 

자세한 내용은 https://developers.kakao.com/ 이곳을 찾아보시면 알 수 있을 것입니다.

 


Project단위 Gradle에 다음과 같이 삽입합니다.

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

 

그리고나서, App단위 Gradle의 Dependency에 다음을 삽입해줍니다.

// 카카오 로그인
    implementation group: 'com.kakao.sdk', name: 'usermgmt', version: '1.27.0'

 

마지막으로, Manifest에 삽입해줍니다.

<application>

    ...

    <meta-data
        android:name="com.kakao.sdk.AppKey"
        android:value="{NATIVE_APP_KEY}" /> //네이티브 앱 키 설정
</application>

 

여기서의 NATIVE_APP_KEY는 https://developers.kakao.com/ 이곳에서 내 애플리케이션을 생성해야 받을 수 있습니다.

 

이제 KakaoLoginSDK를 사용하기 위한 Class를 만들어보겠습니다.

class KakaoSDKAdapter : KakaoAdapter() {
    override fun getSessionConfig(): ISessionConfig {
        return object : ISessionConfig {
            override fun getAuthTypes(): Array<AuthType> {
                return arrayOf(AuthType.KAKAO_LOGIN_ALL)
            }

            override fun isUsingWebviewTimer(): Boolean {
                return false
            }

            override fun getApprovalType(): ApprovalType? {
                return ApprovalType.INDIVIDUAL
            }

            override fun isSaveFormData(): Boolean {
                return true
            }

            override fun isSecureMode(): Boolean {
                return true
            }
        }
    }

    override fun getApplicationConfig(): IApplicationConfig {
        return IApplicationConfig {
            GlobalApplication.instance
        }
    }
}

이 Adapter를 객체로 생성하여 init을 해주어야합니다.

 KakaoSDK.init(KakaoSDKAdapter())

 

 

로그인 세션(Session)을 생성할 때 필요한 옵션을 얻는 추상 클래스(abstract class)인 ISessionConfig를 구현합니다. 카카오 로그인 설정을 담은 ISessionConfigKakaoAdapter에 기본 설정되어 있으며, 설정 변경이 필요할 때 상속해서 사용합니다.(출처 : https://developers.kakao.com/docs/latest/ko/getting-started/sdk-android-v1#import)

 

이처럼 로그인 세션을 생성할 때 필요한 ISessionConfig를 상속받는 Class를 만들어봅시다.

onSuccess 메소드를 통해 로그인한 유저의 Kakao 정보를 받아 사용하실 수 있습니다.

package com.example.mnt_android.service.repository

import android.app.Application
import android.util.Log
import com.example.mnt_android.service.model.KakaoUser
import com.example.mnt_android.view.ui.LoginActivity
import com.kakao.auth.ApiResponseCallback
import com.kakao.auth.AuthService
import com.kakao.auth.ISessionCallback
import com.kakao.auth.Session
import com.kakao.auth.network.response.AccessTokenInfoResponse
import com.kakao.network.ErrorResult
import com.kakao.usermgmt.UserManagement
import com.kakao.usermgmt.callback.MeV2ResponseCallback
import com.kakao.usermgmt.response.MeV2Response
import com.kakao.util.exception.KakaoException

class SessionCallback(application : Application) : ISessionCallback {

    val TAG = "SessionCallback"



    override fun onSessionOpenFailed(exception: KakaoException?) {

    }

        override fun onSessionOpened() {
        UserManagement.getInstance().me(object : MeV2ResponseCallback() {


            override fun onFailure(errorResult: ErrorResult?) {
                Log.e(TAG,"Fail")
            }

            override fun onSessionClosed(errorResult: ErrorResult?) {
                Log.d(TAG,"closed")
            }

            override fun onSuccess(result: MeV2Response?) {

				Log.d(TAG,"Success")

            }

        })


    }




}

 

 

가장 중요한 단계입니다. 이렇게 준비해놓고 로그인 버튼을 눌렀는데 로그인이 안된다구요?

 

카카오 디벨로퍼 사이트 내의 '플랫폼' 메뉴가 있습니다. 클릭하셔서 들어가시면 Android/iOS/Web 으로 나뉩니다.

저희는 Android 개발자이므로 Android 항목을 봅시다.

패키지명, 마켓URL, 키 해시를 적을 수 있습니다. 

패키지명은 자신의 프로젝트의 패키지명을 적습니다, ex) com.xxx.xxx

키 해시가 중요합니다. 런칭을 하지 않은 App들은 키 해시가 등록되어있어야지만 로그인이 가능합니다.

키 해시 값은 XXXXXXX= 로 되어있으며 도출된 값을 복붙하여 추가해주시면 됩니다.

키 해시값을 얻을 수 있는 Java코드입니다. Kotlin을 사용하시는 개발자 분들은 Kotlin으로 변경하셔서 사용하면 되겠습니다.

 

public static String getKeyHash(final Context context) {
    PackageInfo packageInfo = getPackageInfo(context, PackageManager.GET_SIGNATURES);
    if (packageInfo == null)
        return null;

    for (Signature signature : packageInfo.signatures) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            return Base64.encodeToString(md.digest(), Base64.NO_WRAP);
        } catch (NoSuchAlgorithmException e) {
            Log.w(TAG, "Unable to get MessageDigest. signature=" + signature, e);
        }
    }
    return null;
}

 

 

이렇게 모든 준비가 끝났습니다.

 

- - -

 

SDK가 제공해주는 KakaoLogin 버튼을 사용하면 간단히 로그인 할 수 있습니다.

저는 디자이너 분들과 함께 작업을 했기 때문에 커스텀 버튼을 사용해야했기에... Custom Button에 DataBinding을 통해 onclick 함수를 적어주었습니다.

(Data Binding 에 대해 정리한 내용 : https://wlgusdn700.tistory.com/9)

(Data Binding 을 사용해본 예제 : https://wlgusdn700.tistory.com/13)

android:onClick="@{()->loginActivity.login()}"

 

login() 메소드에서는

ISessionCallback 객체를 생성하고, 그 객체의 파라미터로 application Context를 넘겨줍니다.

그리고 Session을 통해 로그인 방법 등을 설정하실 수 있습니다.

저의 코드는 이렇습니다.

fun login()
    {
        //눌러서 로그인
       val callback = SessionCallback(application)
        Session.getCurrentSession().addCallback(callback)
        Session.getCurrentSession().checkAndImplicitOpen()
        Session.getCurrentSession().open(AuthType.KAKAO_LOGIN_ALL,this@LoginActivity)
        loginViewModel.kuser = callback.user
    }

 

이 단계들을 모두 적용하여 따라하면 KakaoLogin을 이용하실 수 있습니다.