안녕하세요 이번에는 카카오 SDK를 이용해 로그인을 구현해보고자 합니다.
일단 먼저 Kakao Developers에 접속합니다.
시작하기를 눌러 로그인을 합니다.
로그인을 하고 나면
애플리케이션 추가하기가 보일건데 눌러줍니다.
일단 개발용으로 사용할 것이기 때문에 내가 원하는 앱 이름, 사업자명을 적어주세요.
저는 둘 다 Jdroid를 적어 주었습니다.
이제 내 애플리케이션이 생겼습니다.
왼쪽 메뉴에 앱 설정 -> 플랫폼을 눌러줍니다. 저희는 안드로이드니까 Android 플랫폼 등록을 눌러줍니다.
패키지명을 적어 주어야 하는데 Android Studio에서 생성한 내 프로젝트의 패키지명을 적어주면 됩니다. 패키지명이 잘 못 입력되거나 상이할 경우 제대로 동작되지 않습니다.
그리고 마켓 URL은 없음, 키 해쉬는 일단 비워두고 저장합니다.
다음은 로그인 시 가져올 정보를 설정해 주겠습니다.
제품 설정 -> 카카오 로그인 -> 동의 항목으로 들어갑니다.
예제에서는 닉네임, 이메일, 연령대 3가지만 사용하겠습니다. 각 항목의 설정 버튼을 눌러 활성화 해줍니다.
이제 Android Studio에서 필요한 설정을 해주겠습니다.
먼저 Gradle Scripts -> Build.gradle(Module: app)으로 들어갑니다.
dependencies {
...
// Kakao Login
implementation 'com.kakao.sdk:v2-user:2.10.0'
}
kakao sdk를 추가해주겠습니다.
다음 Gradle Scripts -> settings.gradle로 들어갑니다.
dependencyResolutionManagement {
...
maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/'}
}
}
kakao sdk repository를 추가해준 후 Sync Now를 눌러주세요
Sync가 완료되었다면 이제 AndroidManifest로 들어가주세요
<application
...>
...
<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" />
<data android:host="oauth"
android:scheme="kakao네이티브 앱 키" />
</intent-filter>
</activity>
</application>
AndroidManifest에 넣어줍니다.
네이티브 앱 키는 Kakao Developers에 적혀있는 네이티브 앱 키를 적어주시면 됩니다.
만약에 네이티브 앱 키가 abcdefg라면 kakaoabcdefg로 적어주시면 됩니다!
이제 아까 등록할 때 비워뒀던 해쉬 키를 받아와서 적어줄건데요 방법은 여러가지가 있지만 KakaoSdk에서 편하게 받아올 수 있기 때문에 KakaoSdk를 통해 받아 오겠습니다.
MainActivity로 이동합니다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
Log.d(TAG, "keyhash : ${Utility.getKeyHash(this)}")
}
이거 한 줄만 적어주고 앱을 실행하여주고 로그를 확인합니다.
혹시 모르실 분들을 위해 로그는 AndroidStudio 하단에 Logcat에서 보실 수 있습니다.
Logcat에서 TAG를 적어주시면 쉽게 찾으실 수 있습니다.
아까처럼 플랫폼에서 Android부분을 보시면 수정버튼이 있습니다. 수정을 눌러준 후 방금 획득한 Keyhash값을 입력하고 저장해줍니다.
이제 로그인을 구현해보겠습니다.
카카오 로그인은 카카오톡을 통해 로그인, 카카오 이메일을 통해 로그인 두 가지 방법이 있는데, 카카오톡이 있으면 카카오톡 로그인, 없으면 카카오 이메일 로그인방식으로 구현하겠습니다.
KakaoSdk.init(this, NATIVE_APP_KEY)
NATIVE_APP_KEY부분은 아까 사용하였던 네이티브 앱 키를 넣어주면 됩니다.
그리고나서
// 이메일 로그인 콜백
private val mCallback: (OAuthToken?, Throwable?) -> Unit = { token, error ->
if (error != null) {
Log.e(TAG, "로그인 실패 $error")
} else if (token != null) {
Log.e(TAG, "로그인 성공 ${token.accessToken}")
}
}
// 카카오톡 설치 확인
if (UserApiClient.instance.isKakaoTalkLoginAvailable(this)) {
// 카카오톡 로그인
UserApiClient.instance.loginWithKakaoTalk(this) { token, error ->
// 로그인 실패 부분
if (error != null) {
Log.e(TAG, "로그인 실패 $error")
// 사용자가 취소
if (error is ClientError && error.reason == ClientErrorCause.Cancelled ) {
return@loginWithKakaoTalk
}
// 다른 오류
else {
UserApiClient.instance.loginWithKakaoAccount(this, callback = mCallback) // 카카오 이메일 로그인
}
}
// 로그인 성공 부분
else if (token != null) {
Log.e(TAG, "로그인 성공 ${token.accessToken}")
}
}
} else {
UserApiClient.instance.loginWithKakaoAccount(this, callback = mCallback) // 카카오 이메일 로그인
}
카카오톡 설치를 확인하고 설치되어 있으면 카카오톡 로그인, 설치가 안되어 있다면 카카오 이메일 로그인으로 넘어가게 됩니다.
여기서 로그인이 실패하게 된다면 if문을 타고 사용자가 취소했을 때는 그대로 return하여 login이 취소되고, 사용자가 취소한게 아니라면 이메일 로그인으로 넘어가게 됩니다.
mCallback은 이메일 로그인의 callback인데, 두 군데에서 로그인이 사용되기 때문에 따로 callback을 변수로 만들어 코드를 간결하게 만들었습니다.
로그인이 성공한다면 accessToken, refreshToken 등이 발급이 되게됩니다.
if (AuthApiClient.instance.hasToken()) {
UserApiClient.instance.accessTokenInfo { _, error ->
if (error != null) {
if (error is KakaoSdkError && error.isInvalidTokenError() == true) {
//로그인 필요
}
else {
//기타 에러
}
}
else {
//토큰 유효성 체크 성공(필요 시 토큰 갱신됨)
}
}
}
else {
//로그인 필요
}
Token이 만료되어 갱신이 필요하거나 로그인이 필요한 상태 등은 위의 방법으로 체크가 가능합니다.
로그인 필요 부분은 로그인 로직으로 넘어가면 되고, 로그인이 된 상태라면 내가 원하는 동작을 할 수 있겠죠?
그러면 사용자의 닉네임, 이메일, 연령대를 가져와 보도록 하겠습니다.
UserApiClient.instance.me { user, error ->
if (error != null) {
Log.e(TAG, "사용자 정보 요청 실패 $error")
} else if (user != null) {
Log.e(TAG, "사용자 정보 요청 성공 : $user")
binding.txtNickName.text = user.kakaoAccount?.profile?.nickname
binding.txtAge.text = user.kakaoAccount?.ageRange.toString()
binding.txtEmail.text = user.kakaoAccount?.email
}
}
저는 3개의 TextView를 만들어 각각에 닉네임, 이메일, 연령대를 가져와 설정해 주었습니다.
제가 간단하게 만든 예제를 보여드리면서 마무리하겠습니다.
글에 문제가 있거나 궁금하신 점 있으시면 댓글이나, 방명록 남겨주세요!
'Android > Libraries' 카테고리의 다른 글
[Android] 안드로이드 Permission(권한) 예제 - 연락처/주소록 만들기 (권한 획득, 연락처 불러오기) (0) | 2022.07.24 |
---|---|
[Android] Parcelable 생성 Parcelize로 편하게 생성하기(with Serializable) (0) | 2022.07.24 |
[Android] 안드로이드 Permission(권한) 종류 및 권한 획득 예제(지문인증 / 생체 인증) (0) | 2022.07.11 |
[Android] 안드로이드12 대응 SplashScreen(스플래시 스크린) 만들기 (1) | 2022.07.09 |
[Android] Glide를 사용하여 ImageView에 사진 불러오기 (0) | 2022.07.03 |