본문 바로가기
Android/Android Core

[Android/Kotlin] 안드로이드 앱에서 카카오 SDK를 사용해 OAuth 로그인을 구현하는 방법

by quessr 2024. 11. 9.

 

이번 글에서는 카카오 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 로그인을 사용하려면 카카오 개발자 콘솔에서 애플리케이션을 설정해야 합니다.

  1. 카카오 개발자 콘솔에 로그인 후, 내 애플리케이션을 생성합니다.
  2. 앱 키 확인: JavaScript 키네이티브 앱 키를 기억해 둡니다.
  3. 플랫폼 설정: 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

 

반응형