ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 카카오 로그인
    앱 만들기/앱 학습 자료들 정리 2023. 6. 3. 00:22

    구글 로그인에 이어서 카카오 로그인도 추가 시켜줄 예정이다. 

     

    먼저 해야 할 일은 카카오 개발자 사이트에서 앱 등록을 하는 것이다. 

     

    카카오 개발자 사이트 

    https://developers.kakao.com/

    1. 카카오 개발자 사이트 세팅

    a) '내 애플리케이션' 에서 애플리케이션 추가

    b) 플래폼에서 안드로이드 등록 : 일단 두번째 (마켓 URL) 는 비어놓고  세번째 (키 해시)는 Kakao SDK로 디버그, 릴리즈 키 해시 확인 (아래 코드부분에 추가)

     

     

     

    c) 동의 항목 설정 (내 애플리케이션>제품 설정>카카오 로그인>동의항목) 

    저는 닉네임과 카카오 계정 정보만 사용할 것이기 때문에 이 2가지만 설정

     

    2. 코드부분

    a) settings.gradle

    pluginManagement {
        repositories {
            google()
            mavenCentral()
            maven { url 'https://jitpack.io' }
            gradlePluginPortal()
        }
    }
    dependencyResolutionManagement {
        repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
        repositories {
            google()
            mavenCentral()
            maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' }
        }
    }
    rootProject.name = "Android_Study_App"
    include ':app'

    아랫 부분을 추가!

    maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' }

     

    b) build.gradle

    dependencies {
      implementation "com.kakao.sdk:v2-all:2.14.0" // 전체 모듈 설치, 2.11.0 버전부터 지원
      implementation "com.kakao.sdk:v2-user:2.14.0" // 카카오 로그인
      implementation "com.kakao.sdk:v2-talk:2.14.0" // 친구, 메시지(카카오톡)
      implementation "com.kakao.sdk:v2-story:2.14.0" // 카카오스토리
      implementation "com.kakao.sdk:v2-share:2.14.0" // 메시지(카카오톡 공유)
      implementation "com.kakao.sdk:v2-navi:2.14.0" // 카카오내비
      implementation "com.kakao.sdk:v2-friend:2.14.0" // 카카오톡 소셜 피커, 리소스 번들 파일 포함
    }

     

    모두든것 사용하려면 '~~~ all:2.14.0' 맨 위에꺼만 추가 하면 되는듯. 하지만 저는 로그인부분 할것이기 때문에  아랫것만 추가!

    implementation "com.kakao.sdk:v2-user:2.14.0" // 카카오 로그인

     

    위에서 릴리즈 키해시 얻어야 하는 부분이 있었는데 아래처럼 얻으면 된다고 한다. 저는 로그로 찍어서 체크했습니다.

    더보기

    Kakao SDK로 디버그, 릴리즈 키 해시 확인

    Kakao SDK를 통해서도 키 해시 확인이 가능합니다. Utility에서 제공하는 편의 기능 중 getKeyHash() 함수를 사용하여 키 해시 값을 문자열(String)로 구할 수 있습니다.

    import com.kakao.sdk.common.util.Utility
    
    var keyHash = Utility.getKeyHash(this)
    

    C) 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">
    
        <uses-permission android:name="android.permission.INTERNET" />
    
        <application
            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.Android_Study_App"
            android:usesCleartextTraffic="true"
            tools:targetApi="31">
    
         	... 생략 ...
    
            <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>
            
            
           ... 생략 ...
        </application>
    
    </manifest>
    • Internet permission 부분
    • 인가 코드를 받을 redirect activity 추가

    'NATIVE_APP_KEY'는 (카카오 개발자 사이트 > 내 애플리케이션 > 요약정보) 에서 찾을수 있습니다.

     

    d) activity_login.xml

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".LoginActivity">
    
    	... 생략 ...
        
        <ImageView
            android:id="@+id/kakaoLoginBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/googleLoginBtn"
            app:srcCompat="@drawable/kakao_login_medium_narrow" />
    
    	... 생략 ...
    
    </androidx.constraintlayout.widget.ConstraintLayout>

    카카오 버튼 이미지 다운 경로 : https://developers.kakao.com/tool/resource/login

    e) LoginActivity.kt

       override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = ActivityLoginBinding.inflate(layoutInflater)
            setContentView(binding.root)
            
            ... 생략 ...
    
            var keyHash = Utility.getKeyHash(this)
            Log.d("keyHash", keyHash)
    
            KakaoSdk.init(this, "2957032b6766b3e400416921fc09a7ea")
    
            binding.kakaoLoginBtn.setOnClickListener {
                // 카카오톡으로 로그인
                
                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(this)) {
                    UserApiClient.instance.loginWithKakaoTalk(this) { token, error ->
                        if (error != null) {
                            Log.e(TAG, "카카오톡으로 로그인 실패", error)
                            Toast.makeText(this, "카카오 로그인이 실패.", Toast.LENGTH_SHORT).show()
    
                            // 사용자가 카카오톡 설치 후 디바이스 권한 요청 화면에서 로그인을 취소한 경우,
                            // 의도적인 로그인 취소로 보고 카카오계정으로 로그인 시도 없이 로그인 취소로 처리 (예: 뒤로 가기)
                            if (error is ClientError && error.reason == ClientErrorCause.Cancelled) {
                                return@loginWithKakaoTalk
                            }
                            // 카카오톡에 연결된 카카오계정이 없는 경우, 카카오계정으로 로그인 시도
                            UserApiClient.instance.loginWithKakaoAccount(this, callback = callback)
                        } else if (token != null) {
                            Log.i(TAG, "카카오톡으로 로그인 성공 ${token.accessToken}")
                            Toast.makeText(this, "카카오 로그인이 되어있습니다1.", Toast.LENGTH_SHORT).show()
                        }
                    }
                } else {
                    UserApiClient.instance.loginWithKakaoAccount(this, callback = callback)
                    Toast.makeText(this, "카카오 로그인이 되어있습니다2.", Toast.LENGTH_SHORT).show()
    
                }
            }
            
            ... 생략 ...
    
        }

    카카오 로그인 관련 코드들 : 

    https://developers.kakao.com/docs/latest/ko/kakaologin/android#req-user-info

     

    Kakao Developers

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

    developers.kakao.com

     

    여러가지중 4가지만 가져왔습니다.

     

    카카오 로그인 구현 예제

    더보기
    // 로그인 조합 예제
    
    // 카카오계정으로 로그인 공통 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)
    }

    토큰 존재 여부 확인하기

    더보기
    if (AuthApiClient.instance.hasToken()) {
        UserApiClient.instance.accessTokenInfo { _, error ->
            if (error != null) {
                if (error is KakaoSdkError && error.isInvalidTokenError() == true) {
                    //로그인 필요
                }
                else {
                    //기타 에러
                }
            }
            else {
                //토큰 유효성 체크 성공(필요 시 토큰 갱신됨)
            }
        }
    }
    else {
        //로그인 필요
    }

    로그아웃

    더보기
    // 로그아웃
    UserApiClient.instance.logout { error ->
        if (error != null) {
            Log.e(TAG, "로그아웃 실패. SDK에서 토큰 삭제됨", error)
        }
        else {
            Log.i(TAG, "로그아웃 성공. SDK에서 토큰 삭제됨")
        }
    }

    사용자 정보 가져오기

    더보기
    // 사용자 정보 요청 (기본)
    UserApiClient.instance.me { user, error ->
        if (error != null) {
            Log.e(TAG, "사용자 정보 요청 실패", error)
        }
        else if (user != null) {
            Log.i(TAG, "사용자 정보 요청 성공" +
                    "\n회원번호: ${user.id}" +
                    "\n이메일: ${user.kakaoAccount?.email}" +
                    "\n닉네임: ${user.kakaoAccount?.profile?.nickname}" +
                    "\n프로필사진: ${user.kakaoAccount?.profile?.thumbnailImageUrl}")
        }
    }

     

    '앱 만들기 > 앱 학습 자료들 정리' 카테고리의 다른 글

    구글 로그인과 Firebase  (0) 2023.06.03
    프로젝트 README.md  (0) 2023.05.29
Designed by Tistory.