티스토리 뷰

반응형

사진 출처 : 카카오 플랫폼 API 소개 글

 

회원가입이 귀찮은 회원을 위해 간편로그인을 쉽게 발견할 수 있습니다.

대표적인 간편로그인 중 하나인 카카오 로그인을 알아보겠습니다.

이번 포스트는 카카오 로그인에 대해서 소개하겠습니다.

앱 생성하고 키 발급 절차는 카카오 디벨로퍼 사이트에 자세히 설명이 되어 있어 생략하겠습니다.

 

가이드 순서

1. 카카오 디벨로퍼의 앱 생성 (생략)

2. Application.java에 KakaoSDKAdapter 설정

3. 로그인 화면의 기능 정의

 

Application.java에 KakaoSDKAdapter 설정

KakaoSDK를 사용하기 위해선 SDK와 Application을 연결해 주어야하며, 이때 사용하는 객체는 KakaoAdapter 입니다.

KakaoAdapter을 통해 SDK에 필요한 정보인 IApplicationConfig와 ISeesionConfig를 전달해줘야합니다.

 

IApplicationConfig

Application이 가지고 있는 정보를 얻기 위한 interface.

 

ISessionConfig

로그인을 위해서는 Session을 생성해야합니다. Session 생성하기 위해 필요한 옵션을 얻기 위한 abstract class.

 

AuthType

Kakao SDK 로그인을 하는 방식에 대한 Enum class

 

UserProfile

MeResponseCallback을 통해 성공시 onSuccess의 param으로 UserProfile 정보를 넘겨줍니다.

 

(app) Build.gradle

dependencies {
	// 카카오로그인 api
	// 카카오 로그인 sdk를 사용하기 위해 필요.
	implementation 'com.kakao.sdk:usermgmt:1.17.0'
}

 

Application.java


public class LoginHelperApplication extends android.app.Application {
    public static Context mContext;

    /** 카카오 로그인 어댑터
     *
     * 로그인을 위해 Session을 생성하기 위해 필요한 옵션을 얻기위한 abstract class.
     * 기본 설정은 KakaoAdapter에 정의되어있으며, 설정 변경이 필요한 경우 상속해서 사용할 수 있다.
     * */
    private static class KakaoSDKAdapter extends KakaoAdapter {
        @Override
        public ISessionConfig getSessionConfig() {
            return new ISessionConfig() {
                @Override
                public AuthType[] getAuthTypes() {
                    return new AuthType[]{AuthType.KAKAO_TALK_ONLY};
                }

                @Override
                public boolean isUsingWebviewTimer() {
                    return false;
                }

                @Override
                public boolean isSecureMode() {
                    return false;
                }

                @Nullable
                @Override
                public ApprovalType getApprovalType() {
                    return ApprovalType.INDIVIDUAL;
                }

                @Override
                public boolean isSaveFormData() {
                    return false;
                }
            };
        }

        @Override
        public IApplicationConfig getApplicationConfig() {
            return new IApplicationConfig() {
                @Override
                public Context getApplicationContext() {
                    return NewClassApplication.getLoginHelperContext();
                }
            };
        }
    }

    private static Context getLoginHelperContext() {
        return mContext;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = this;

        KakaoSDK.init(new KakaoSDKAdapter());
    }
}

 

로그인 화면 정의

로그인 화면에서 Kakao SDK을 활용한 카카오 로그인 구현 시 Session을 통하여 구성되어 있습니다.

ISessionCallback, SessionStatusCallback, UserManagement 을 확인하시면 소스 이해하는데 도움이 되실 것입니다.

 

LoginActivity.kt

class LoginActivity : AppCompatActivity() {
    companion object {
        private val TAG = LoginActivity::class.java!!.getSimpleName()
        private val RC_RIGN_IN = 300
    }

private lateinit var kakaoCallback: SessionStatusCallback
    
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        //카카오
        kakaoCallback = SessionStatusCallback()
        Session.getCurrentSession().addCallback(kakaoCallback)
        Session.getCurrentSession().checkAndImplicitOpen()
            
        initOnClickListener()
}

private fun initOnClickListener(){
    // 카카오 로그인
    btnKakaoLogin.setOnClickListener {
        LoginUtils.kakaoLogOut(object: LogoutResponseCallback(){
            override fun onCompleteLogout() {
                LogUtils.d(TAG, "success kakao logout")
            }
        })

            Handler().postDelayed({
            Session.getCurrentSession().open(AuthType.KAKAO_TALK, this)
        },100)
    }
}

/**
* 카카오 로그인 UserProfile 호출
*/
private fun kakaoRequestMe(){
    UserManagement.getInstance().me(object: MeV2ResponseCallback(){
        override fun onSessionClosed(errorResult: ErrorResult?) {
            LogUtils.d("onSessionClosed", "failed to update profile. msg = $errorResult")
        }

        override fun onSuccess(result: MeV2Response?) {
            LogUtils.d("onSessionClosed", "success to update profile. msg = $result")
                successLogin()
        }
    })
}

/**
 * 카카오 로그인 콜백
 * MeResponseCallback을 통해 성공시 onSuccess의 Param으로 UserProfile 정보를 넘겨준다.
*/
inner class SessionStatusCallback : ISessionCallback{
    override fun onSessionOpenFailed(exception: KakaoException?) {
        LogUtils.d(TAG, "SessionStatusCallback.onSessionOpenFailed exception:" + exception);
    }

    override fun onSessionOpened() {
        LogUtils.d(TAG, "SessionStatusCallback.onSessionOpened")
            //사용자정보 가져오기
            kakaoRequestMe()
    }
}

/**
  * 로그인 성공 시 호출
  * */
fun successLogin(){
    startActivity(Intent(this, MainActivity::class.java))
        finish()
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    //카카오로그인 세션
    if (Session.getCurrentSession().handleActivityResult(requestCode, resultCode, data)){
        return
    }

    super.onActivityResult(requestCode, resultCode, data)
}

override fun onDestroy() {
    super.onDestroy()
        Session.getCurrentSession().removeCallback(kakaoCallback)
}

 

activity_login.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/layout_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".login.LoginActivity">

    <Button
            android:id="@+id/btnKakaoLogin"
            android:layout_width="match_parent"
            android:layout_height="@dimen/_45sdp"
            android:text="카카오 로그인하기"
            android:textStyle="bold"
            android:textSize="@dimen/_13sdp"
            android:background="@color/kakao_yellow"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent"
            android:layout_marginBottom="50dp"/>
</android.support.constraint.ConstraintLayout>

 

strings.xml

<resources>
	...
    <string name="kakao_app_key" translatable="false"></string>
    ...
</resources>

카카오 디벨로퍼에서 애플리케이션 생성 시 발급 받은 android key을 입력 합니다.

 

번외, 키 해시 등록하기

키 해시를 등록한 앱만 SDK를 활용하여 로그인 할 수 있게 제공할 수 있습니다.

키 해시는 디버그, 릴리즈로 나눠지게 됩니다.

 

디버그 키 해시

keytool -exportcert -alias androiddebugkey -keystore <debug_keystore_path> -storepass android -keypass android | openssl sha1 -binary | openssl base64
  • [Debug keystore Path]

    OS X와 리눅스 ~/.android/debug.keystore

    Windows Vista와 Windows 7

    예: C:\Users<user>.android\debug.keystore

    Windows XP

    예 : C:\Documents and Settings<user>.android\debug.keystore

  • keytool : $JAVA_HOME/bin 아래에 존재합니다.

  • openssl : Windows의 경우는 다운받아 설치합니다.

 

앱 내 자바소스로 구현하기

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;
}

 

릴리즈 키 해시

앱 배포를 위해 릴리즈 빌드로 APK 생성 시 .jks 확장자를 가진 릴리즈용 키스토어로 키 해시를 구해야합니다.

keytool -exportcert -alias <release_key_alias> -keystore <release_keystore_path> | openssl sha1 -binary | openssl base64

 

만약 키 해쉬를 등록하지 않은 환경에서 SDK를 사용한 경우 다음과 같은 에러를 발생하게 됩니다.

{"msg":"appkey does not match to registered app info (ios bundle id, android key hash, web domain url).","code":-401}

자세한 내용은 키해시 등록 페이지에서 확인할 수 있습니다.

 

마무리

카카오 로그인에 대해서 알아봤습니다. 간단하면서 설정해야 할 부분이 많았습니다.

카카오 로그인에 대한 상세한 설명은 카카오 디벨로퍼 사이트의 사용자 관리 를 참고하시면 이해하시는데 도움이 될 것입니다.

반응형
댓글