이번 글에서는 카카오 SDK를 사용해 안드로이드 앱에 OAuth 로그인을 구현하는 과정을 기록 해 두고자 합니다.
1. 카카오 SDK 설치
먼저, 카카오 SDK를 프로젝트에 추가해야 합니다.
Gradle 설정
1. 프로젝트 수준 build.gradle 파일에 Maven 저장소 추가.
allprojects {
repositories {
google()
mavenCentral()
maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' }
}
}
2.앱 수준 build.gradle 파일에 카카오 SDK 종속성 추가.
dependencies {
implementation "com.kakao.sdk:v2-user:2.10.0" // 최신 버전 확인 후 추가
}
2. 카카오 개발자 콘솔에서 애플리케이션 설정하기
카카오 OAuth 로그인을 사용하려면 카카오 개발자 콘솔에서 애플리케이션을 설정해야 합니다.
- 카카오 개발자 콘솔에 로그인 후, 내 애플리케이션을 생성합니다.
- 앱 키 확인: JavaScript 키와 네이티브 앱 키를 기억해 둡니다.
- 플랫폼 설정: Android를 선택하고, 패키지 이름과 키 해시를 입력합니다.
- 키 해시는 앱의 인증을 위해 사용되며, 로컬 개발용 키 해시와 출시용 키 해시를 각각 등록해야 합니다.
- 키 해시 입력 경로: 내 애플리케이션> 앱 설정> 플랫폼
키 해시 생성 방법
Android Studio의 Logcat에서 다음 명령을 실행해 키 해시를 확인합니다.
디버그 키 해시(Mac):
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android | openssl sha1 -binary | openssl base64
릴리즈 키 해시(Mac):
keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64
키 해시 입력 경로
- 경로: 내 애플리케이션 > 앱 설정 > 플랫폼 > 키 해시
3. AndroidManifest.xml 설정
카카오 SDK가 OAuth 인증 후 앱으로 돌아올 수 있도록 AndroidManifest.xml에 설정을 추가해야 합니다.
AndroidManifest.xml 설정
<application
...>
<!-- 카카오 인증을 위한 AuthCodeHandlerActivity 설정 -->
<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{YOUR_NATIVE_APP_KEY}" /> <!-- YOUR_NATIVE_APP_KEY 부분을 네이티브 앱 키로 변경 -->
</intent-filter>
</activity>
</application>
위 코드에서 {YOUR_NATIVE_APP_KEY}를 카카오 개발자 콘솔에서 발급받은 네이티브 앱 키로 변경합니다. 이 설정은 카카오톡 앱이 설치되지 않은 경우 웹 브라우저를 통한 OAuth 인증 리다이렉트에도 필요합니다.
4. Application 초기화 설정
앱 전역에서 카카오 SDK를 초기화하려면 Application 클래스를 생성하고 초기화 코드를 추가해야 합니다.
Application 클래스
class GlobalApplication: Application() {
override fun onCreate() {
super.onCreate()
// 카카오 SDK 초기화
KakaoSdk.init(this, BuildConfig.KAKAO_NATIVE_APP_KEY)
// (선택) 카카오 지도 SDK 초기화
KakaoMapSdk.init(this, BuildConfig.KAKAO_NATIVE_APP_KEY)
}
}
- KakaoSdk.init: 네이티브 앱 키를 사용해 SDK를 초기화합니다.
- KakaoMapSdk.init: 카카오 지도 SDK를 사용하려는 경우, 동일한 네이티브 앱 키를 사용해 초기화합니다.
5. 카카오 로그인 구현하기
1. 로그인 버튼 UI 추가
로그인 버튼을 위한 UI를 XML 레이아웃 파일에 추가합니다.
<!-- activity_sign_in.xml -->
<Button
android:id="@+id/kakao_login_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="카카오 로그인" />
2. 로그인 로직 구현
Activity 또는 Fragment에서 카카오 로그인 로직을 구현합니다.
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.kakao.sdk.auth.model.OAuthToken
import com.kakao.sdk.user.UserApiClient
class SignInActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sign_in)
// 로그인 버튼 설정
val kakaoLoginButton: Button = findViewById(R.id.kakao_login_button)
kakaoLoginButton.setOnClickListener {
kakaoLogin()
}
}
// 카카오 로그인 함수
private fun kakaoLogin() {
val callback: (OAuthToken?, Throwable?) -> Unit = { token, error ->
if (error != null) {
Toast.makeText(this, "로그인 실패: ${error.message}", Toast.LENGTH_SHORT).show()
} else if (token != null) {
Toast.makeText(this, "로그인 성공", Toast.LENGTH_SHORT).show()
fetchKakaoUserInfo()
}
}
// 카카오톡 설치 여부 확인 후 로그인 실행
if (UserApiClient.instance.isKakaoTalkLoginAvailable(this)) {
UserApiClient.instance.loginWithKakaoTalk(this, callback = callback)
} else {
UserApiClient.instance.loginWithKakaoAccount(this, callback = callback)
}
}
// 사용자 정보 가져오기
private fun fetchKakaoUserInfo() {
UserApiClient.instance.me { user, error ->
if (error != null) {
Toast.makeText(this, "사용자 정보 요청 실패: ${error.message}", Toast.LENGTH_SHORT).show()
} else if (user != null) {
Toast.makeText(this, "사용자 정보 요청 성공: ${user.kakaoAccount?.profile?.nickname}", Toast.LENGTH_SHORT).show()
// 사용자 정보를 활용하여 추가 로직 구현 가능
}
}
}
}
코드 설명
- kakaoLogin(): 카카오톡 앱을 통해 로그인할 수 있는지 확인하고, 카카오톡이 설치되지 않은 경우에는 카카오 계정으로 로그인합니다.
- callback: 로그인 성공 여부를 확인한 후, 로그인에 성공하면 fetchKakaoUserInfo를 호출해 사용자 정보를 요청합니다.
- fetchKakaoUserInfo(): UserApiClient.instance.me() 메서드를 호출하면 현재 로그인한 사용자의 정보를 가져올 수 있습니다. 이 메서드를 통해 카카오 계정의 프로필 정보 (예: 닉네임, 이메일 등)를 받아올 수 있으며, 사용자 정보를 활용한 추가 로직을 구현할 수 있습니다.
5. 로그아웃 및 토큰 관리
카카오 로그아웃을 위해 UserApiClient.instance.logout을 사용합니다. 로그아웃 시에는 앱에 저장된 로그인 정보를 지우고, 사용자를 로그인 화면으로 다시 보낼 수 있습니다.
private fun kakaoLogout() {
UserApiClient.instance.logout { error ->
if (error != null) {
Toast.makeText(this, "로그아웃 실패: ${error.message}", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this, "로그아웃 성공", Toast.LENGTH_SHORT).show()
}
}
}
참고: https://developers.kakao.com/docs/latest/ko/android/getting-started
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
'Android > Android Core' 카테고리의 다른 글
[Android/Kotlin] Kakao Map V2: 특정 좌표를 모두 화면에 표시하기 (0) | 2024.12.02 |
---|---|
[Android/Kotlin] API Key 숨기기: buildConfigField 활용법 (2) | 2024.12.02 |
[Android/Kotlin] EncryptedSharedPreferences 사용하기: 보안 강화된 데이터 저장 방법 (0) | 2024.11.08 |
[Android/Kotlin] CameraX에서 발생한 'Use case binding failed' 오류를 조건부 바인딩으로 해결하기 (1) | 2024.11.01 |
[Android/Kotlin] activityResultLauncher로 비동기 데이터 교환 및 파일 업로드 결과 처리하기 (2) | 2024.11.01 |