나는 이렇게 Access Token만 발급 받고 검증은 백엔드측에 넘겼다.
순서는 아래와 같다.
- 카카오 로그인/회원가입 요청한다.
- 카카오 측에서 이미 회원일 경우 로그인 처리, 회원이 아닐 경우 회원가입 처리 후 Access Token을 발급하여 전달한다.
- 받은 Access Token을 백엔드(서버)로 전달한다.
- 백엔드(서버)측이 전달받은 Access Token을 통해 다시 카카오를 통해서 검증을 하고 사용자 정보를 전달한다.
- 받은 정보를 jwt에 저장한다.
3~5번은 사람마다 다르게 작업하기 때문에 1~2번까지만 설명을 하겠다.
카카오 문서에 설정이 잘 나와있으니 보며 그대로 따라하면 된다.
https://developers.kakao.com/docs/latest/ko/kakaologin/android
1. gradle에 설정 추가
build.gradle.kts
implementation ("com.kakao.sdk:v2-user:2.19.0")
settings.gradle.kts
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' }
}
}
2. String.xml에 네이티브 키 추가
2-1. Kakao Developers에 내 애플리케이션 > 사용할 애플리케이션 > 앱 설정 - 요약 정보 > 앱 키 > 네이티브 키 복사
2-2. res > values > string.xml에 네이티브 키 추가
<resources>
<string name="app_name">앱 이름</string>
<string name="kakao_app_key">{여기에 네이티브 키}</string>
<string name="scheme_kakao_app_key">{여기에 kakao네이티브 키}</string>
</resources>
만약 네이티브 키가
wjtoiehg/ew=
라면
<resources>
<string name="app_name">앱 이름</string>
<string name="kakao_app_key">wjtoiehg/ew=</string>
<string name="scheme_kakao_app_key">kakaowjtoiehg/ew=</string>
</resources>
이렇게 넣으면 된다.
3. GlobalApplication.kt 추가
3-1. GlobalApplication.kt 추가
import android.app.Application
import android.util.Log
import com.kakao.sdk.common.KakaoSdk
import com.kakao.sdk.common.util.Utility
import com.umc.anddeul.R
class GlobalApplication: Application() {
override fun onCreate() {
super.onCreate()
var keyHash = Utility.getKeyHash(this)
Log.d("키 확인", keyHash)
KakaoSdk.init(this, getString(R.string.kakao_app_key))
}
}
3-2. AndroidManifest.xml에 추가
<application
android:name=".GlobalApplication"
4. 해시 키 저장
3번 실행 후 로그에 출력된 KeyHash를 내 애플리케이션 > 사용할 애플리케이션 > 앱 설정 - 플랫폼 > Android > 수정 > 키 해시 칸에 추가
5. AndroidManifest.xml에 액티비티(Activity) 설정
액티비티 명도 수정하지 않고 그대로 해야 한다.
<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="@string/scheme_kakao_app_key" />
</intent-filter>
</activity>
6. 카카오 로그인/회원가입으로 이동
6-1. 카카오톡으로 로그인 (카카오톡 설치 안되있을 시 카카오계정 로그인으로 이동함)
// 카카오계정으로 로그인 공통 callback 구성
// 카카오톡으로 로그인 할 수 없어 카카오계정으로 로그인할 경우 사용됨
val callback: (OAuthToken?, Throwable?) -> Unit = { token, error ->
if (error != null) {
Log.e(TAG, "카카오계정으로 로그인 실패", error)
} else if (token != null) {
Log.i(TAG, "카카오계정으로 로그인 성공 ${token.accessToken}")
}
}
// 카카오톡이 설치되어 있으면 카카오톡으로 로그인, 아니면 카카오계정으로 로그인
if (UserApiClient.instance.isKakaoTalkLoginAvailable(context)) {
UserApiClient.instance.loginWithKakaoTalk(context) { token, error ->
if (error != null) {
Log.e(TAG, "카카오톡으로 로그인 실패", error)
// 사용자가 카카오톡 설치 후 디바이스 권한 요청 화면에서 로그인을 취소한 경우,
// 의도적인 로그인 취소로 보고 카카오계정으로 로그인 시도 없이 로그인 취소로 처리 (예: 뒤로 가기)
if (error is ClientError && error.reason == ClientErrorCause.Cancelled) {
return@loginWithKakaoTalk
}
// 카카오톡에 연결된 카카오계정이 없는 경우, 카카오계정으로 로그인 시도
UserApiClient.instance.loginWithKakaoAccount(context, callback = callback)
} else if (token != null) {
Log.i(TAG, "카카오톡으로 로그인 성공 ${token.accessToken}")
//// 여기서 받은 토큰 백엔드로 전달하는 코드 추가해야 함
}
}
} else {
UserApiClient.instance.loginWithKakaoAccount(context, callback = callback)
}
6-2. 카카오계정으로 로그인
// 카카오계정으로 로그인
UserApiClient.instance.loginWithKakaoAccount(context) { token, error ->
if (error != null) {
Log.e(TAG, "로그인 실패", error)
}
else if (token != null) {
Log.i(TAG, "로그인 성공 ${token.accessToken}")
}
}
만약 기존 카카오계정이 아닌 다른 계정으로 로그인하고 싶을 때엔
prompts = listOf(Prompt.LOGIN)
를 추가하면 된다.
따라서
// 카카오계정으로 로그인
UserApiClient.instance.loginWithKakaoAccount(context, prompts = listOf(Prompt.LOGIN)) { token, error ->
if (error != null) {
Log.e(TAG, "로그인 실패", error)
}
else if (token != null) {
Log.i(TAG, "로그인 성공 ${token.accessToken}")
}
}
이렇게 된다.
'공부 > 안드로이드' 카테고리의 다른 글
[Android/Kotlin] 음성 녹화 (0) | 2024.02.21 |
---|---|
[Android/Kotlin] 음성 재생/일시정지 (0) | 2024.02.21 |
[Android/Kotlin] Custom Dialog (팝업) (0) | 2024.02.21 |
[Android/Kotlin] 주간 달력 만들기 (0) | 2024.02.21 |
[Android/Kotlin] fragment에서 fragment로 이동 (0) | 2024.02.21 |