Topic/Auth

카카오 로그인 - Android

flatlab 2024. 6. 4. 15:23

설정

카카오 개발자 콘솔에서 적용하고자 하는 프로젝트를 선택 후 왼쪽 사이드바에서 [앱 키] 메뉴를 클릭하여 [네이티브 앱 키]를 확인합니다.

[내 애플리케이션] > [카카오 로그인]에서 활성화 설정 항목을 ON으로 설정합니다.

 

키 해시 등록

키 해시(Key Hash)란 인증서(Certificate)의 인증서 지문 값(Certificate fingerprints)을 해시(hash)한 값으로, 악성 앱인지 판별하는 데 사용됩니다. 카카오 API를 호출하면 카카오 API 서버가 요청 헤더에 추가된 키 해시값과 카카오 플랫폼에 등록한 값이 일치하는지 확인합니다.

디버그, 릴리즈 키 해시 값 확인 후, [내 애플리케이션] - [플랫폼] - [Android]에 모두 등록하여야 정상적으로 로그인 프로세스가 진행됩니다.

해시 값을 추출하는 방법은 카카오 디벨로퍼 사이트의 키 해시 항목을 참고하시기 바랍니다.

 

권한 설정

카카오 로그인을 구현하고자 하는 앱의 AndroidManifest.xml 파일에 인터넷 권한을 설정합니다.

<uses-permission android:name="android.permission.INTERNET" />

 

카카오 로그인 SDK 설치

Gradle 설정

SDK 를 연동하기 위해 settings.gradle.kts에 Maven 레파지토리(Repository)를 설정합니다.

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        
        maven { url = java.net.URI("https://devrepo.kakao.com/nexus/content/groups/public/") }
    }
}

 

모듈 설정

build.gradle.kts(Module) 파일에 필요한 카카오 로그인 API 모듈을 설정합니다.

dependencies {
    implementation("com.kakao.sdk:v2-user:2.20.1") // 카카오 로그인 API 모듈
}

 

이후 카카오 로그인 SDK를 사용하기 위해 Application을 상속한 클래스를 사용하고 네이티브 앱 키를 초기화합니다.

import android.app.Application
import com.kakao.sdk.common.KakaoSdk

class YOUR_APPLICATION_CLASS_NAME : Application() {
    override fun onCreate() {
        super.onCreate()

        // Kakao SDK 초기화
        KakaoSdk.init(this, "{NATIVE_APP_KEY}")
    }
}


AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    
    <application
        android:name=".YOUR_APPLICATION_CLASS_NAME"
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Auth"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

 

로그인 구현하기

Redirect URI 설정

카카오 로그인 기능을 구현하기 위해서는 리다이렉션(Redirection)을 통해 코드를 받아야 합니다. 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" />

        <!-- Redirect URI: "kakao${NATIVE_APP_KEY}://oauth" -->
        <data android:host="oauth"
            android:scheme="kakao${NATIVE_APP_KEY}" />
    </intent-filter>
</activity>

 

주의할점은 Android 12(API 31) 이상을 타깃으로 하는 앱인 경우, exported 요소를 반드시 "true"로 선언해야 합니다.

 

Redirect URI 정보는 "kakao" + 위에서 확인한  [NATIVE_APP_KEY]입니다.

만일 [NATIVE_APP_KEY가 12345678이라면 스킴은 kakao12345678로 구성이 됩니다.

 

로그인 구현 방식

UserApi.shared.loginWithKakaoTalk

카카오톡으로 로그인 프로세스로 카카오톡에 연결된 카카오계정 및 인증 정보를 사용하여 사용자가 카카오계정 정보를 직접 입력하지 않아도 간편하게 로그인이 가능합니다.

UserApi.shared.loginWithKakaoAccount

카카오계정으로 로그인 프로세스로 기본 웹 브라우저를 통하여 로그인 사용자가 카카오계정 정보를 입력하여 카카오계정을 인증하도록 구성합니다.

...
import com.kakao.sdk.auth.AuthApiClient
import com.kakao.sdk.user.UserApiClient
...

class MainActivity : AppCompatActivity() {

    companion object {
    	private val TAG = javaClass.kotlin.simpleName
    }

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(savedInstanceState)

    	binding = ActivityMainBinding.inflate(layoutInflater)
    	setContentView(binding.root)

    	initView()
    }

    private fun initView() {
        binding.buttonKakaoLogin.setOnClickListener {
            if (UserApiClient.instance.isKakaoTalkLoginAvailable(this)) {
                // 카카오톡으로 로그인
                UserApiClient.instance.loginWithKakaoTalk(this) { token, error ->
                    if (error != null) {
                    	Log.e(TAG, "로그인 실패", error)
                    } else if (token != null) {
                    	Log.i(TAG, "로그인 성공 ${token.accessToken}")
                    }
                }
            } else {
                // 카카오계정으로 로그인
                UserApiClient.instance.loginWithKakaoAccount(this) { token, error ->
                    if (error != null) {
                    	Log.e(TAG, "로그인 실패", error)
                    } else if (token != null) {
                    	Log.i(TAG, "로그인 성공 ${token.accessToken}")
                    }
                }
            }
        }
    }
}

로그아웃

로그인 사용자의 액세스 토큰과 리프레시 토큰을 모두 만료시킵니다.

주의할점은 로그아웃 요청의 성공 여부와 관계없이 토큰을 삭제 처리합니다. 그리고 토큰이 없는 경우 로그아웃 프로세스를 진행할 경우 오류가 발생합니다. 로그아웃 프로세스 진행 전에 AuthApiClient의 hasToken 메서드를 사용하여 토큰을 확인하시길 바랍니다.

...
import com.kakao.sdk.auth.AuthApiClient
import com.kakao.sdk.user.UserApiClient
...

class MainActivity : AppCompatActivity() {

    companion object {
    	private val TAG = javaClass.kotlin.simpleName
    }

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(savedInstanceState)

    	binding = ActivityMainBinding.inflate(layoutInflater)
    	setContentView(binding.root)

    	initView()
    }

    private fun initView() {
    	binding.buttonKakaoLogout.setOnClickListener {
            if (AuthApiClient.instance.hasToken()) {
                UserApiClient.instance.logout { error ->
                    if (error != null) {
                    	Log.e(TAG, "로그아웃 실패. SDK에서 토큰 삭제됨", error)
                    } else {
                    	Log.i(TAG, "로그아웃 성공. SDK에서 토큰 삭제됨")
                    }
                }
            } else {
            	Log.e(TAG, "토큰 삭제 되어 로그아웃 프로세스 진행 불가")
            }
        }
    }
}

 

로그인 연결끊기

앱과 사용자 카카오계정의 연결 상태를 해제합니다. 연결이 끊어지면 기존의 토큰은 더 이상 사용할 수 없으므로, 연결 끊기 요청 성공 시 로그아웃 처리가 함께 이뤄져 토큰이 삭제됩니다.

주의할점은 로그아웃과 동일하게 토큰이 없는 경우 연결끊기 프로세스를 진행할 경우 오류가 발생합니다. 연결끊기 프로세스 진행 전에 AuthApiClient의 hasToken 메서드를 사용하여 토큰을 확인하시길 바랍니다.

...
import com.kakao.sdk.auth.AuthApiClient
import com.kakao.sdk.user.UserApiClient
...

class MainActivity : AppCompatActivity() {

    companion object {
    	private val TAG = javaClass.kotlin.simpleName
    }

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        initView()
    }

    private fun initView() {
        binding.buttonKakaoUnlink.setOnClickListener {
            if (AuthApiClient.instance.hasToken()) {
                UserApiClient.instance.unlink { error ->
                    if (error != null) {
                    	Log.e(TAG, "연결 끊기 실패", error)
                    } else {
                    	Log.i(TAG, "연결 끊기 성공. SDK에서 토큰 삭제 됨")
                    }
                }
            } else {
                Log.e(TAG, "토큰 삭제 되어 연결 끊기 프로세스 진행 불가")
            }
        }
    }
}

 

 

참고사이트

https://developers.kakao.com/docs/latest/ko/android/getting-started#before-you-begin

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

https://developers.kakao.com/docs/latest/ko/kakaologin/android

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

'Topic > Auth' 카테고리의 다른 글

애플 아이디로 로그인  (0) 2024.06.03
구글 아이디로 로그인 - iOS  (0) 2024.06.03
카카오 로그인 - iOS  (1) 2024.06.03