이전에는 서버를 사용하여 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를 구현합니다. 카카오 로그인 설정을 담은 ISessionConfig는 KakaoAdapter에 기본 설정되어 있으며, 설정 변경이 필요할 때 상속해서 사용합니다.(출처 : 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을 이용하실 수 있습니다.