** 안드로이드 스튜디오 버전 Bumblebee (Arctic Fox 이후 버전) 버전을 기준으로 작성되었습니다.
Kakao SDK 설정하기1 - 프로젝트 설정
- settings.gradle 파일에 카카오 SDK 라이브러리를 추가한다.
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
//kakao SDK 설정 (카카오 로그인)
maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' }
}
}
- build.gradle(Module단) 에 모듈 설정
dependencies {
implementation "com.kakao.sdk:v2-user:2.8.6" // 카카오 로그인
...
}
- AndroidManifest.xml에 인터넷 사용 권한 설정. 카카오 로그인을 하려면 인터넷을 사용해야 하겠지
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.패키지명">
<!-- 인터넷 사용 권한 설정-->
<uses-permission android:name="android.permission.INTERNET" />
<application
...
- build.gradle(Module단) 에 Java 8 사용 설정. 아래처럼 설정되어있는지 확인하고 아니라면 설정해준다.
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
그 외 프로가드 규칙 설정은 필요 시 선택적으로 한다.
Kakao SDK 설정하기2 - kakao developers 어플리케이션 등록
- 네이티브 앱 키 : kakao developers 에 어플리케이션을 추가하고 네이티브 앱 키를 받아온다.
네이티브 앱 키를 사용해 SDK를 초기화할 것이다.
- 초기화 : 새 파일을 하나 만들어서 Application 클래스를 상속받는 클래스를 하나 만든다. 그 클래스에서 Android SDK를 초기화한다. 내용은 아래와 같이 작성한다.
Application Class는 컴포넌트 사이에 멤버변수를 공유할 수 있도록 해주는 클래스이다.
NATIVE_APP_KEY 자리에 네이티브 앱 키를 넣는다.
//클래스명은 자율적으로
class 어쩌구Application : Application() {
override fun onCreate() {
super.onCreate()
// ...다른 초기화 코드들...
// Kakao SDK 초기화
KakaoSdk.init(this, "{NATIVE_APP_KEY}")
}
}
이 클래스를 초기화에 사용하도록
AndroidManifest.xml 파일에 application의 android:name내용에 클래스 위치를 추가한다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.패키지명">
<!-- 인터넷 사용 권한 설정-->
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".클래스경로"
...
Kakao SDK 설정하기3 - kakao developers 어플리케이션에 플랫폼 등록(디버그 키)
kakao developers 어플리케이션에 플랫폼을 등록하기 위해서는 디버그 키의 해시값이 필요하다.
- openSSL 또는 카카오 SDK를 이용해서 디버그 키 해시값을 구한다.
해시 키 구하는 방법이 두 가지인데,
1. openSSL 활용
2. 카카오 SDK 활용
1번이 더 보안상 안전하고 여러가지 이유로 권장되는 방법이라 하는데
내 기준에서 좀더 복잡했고 결론적으로 작동이 안됐다.. 뭔가 잘못한 것 같다.
그래서 2번으로 구한 해시 키 값을 사용했다.
1번 openSSL 활용하는 방법
openSSL을 설치하고 환경변수 설정 등 관련 세팅을 해준 뒤 터미널을 통해 구한다.
openSSL 과 관련된 설정은 아래 글이나 다른 자료를 참고하기 바란다.
https://dev-donghwan.tistory.com/3
위 글대로 openSSL 을 설정하고
터미널창에서
keytool -exportcert -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore -storepass android -keypass android | openssl sha1 -binary | openssl base64
이 명령어를 실행하면 키 해시 값이 나온다.
Warning 메세지가 같이 뜰 수도 있는데 당황해서 놓치지 말고 앞뒤로 해시값이 떴는지 잘 읽어보자
2번 카카오 SDK활용하는 방법 (카카오 SDK사용에 대한 설정은 다 되어있어야 함)
아무 액티비티에서 다음 코드를 실행시킨다.
import com.kakao.sdk.common.util.Utility
var keyHash = Utility.getKeyHash(this)
Log.e(TAG, "해시 키 값 : ${keyHash}")
그리고 Run해서 로그에 나온 해시키 값을 확인한다.
- 디버기 키 해시 값을 kakao developers에 만들어 둔 애플리케이션의 플랫폼>Android 에 등록해둔다.
여러 명이 하나의 프로젝트를 개발하는 경우 모든 사람들이 각자의 디버그 키 해시 값을 구해서 다 등록해줘야 한다. 내 것만 하면 내 애뮬레이터에서만 실행된다.
그리고 참고로 배포 시에는 디버그 키가 아닌 릴리즈 키 해시 값을 등록해야 한다.
같이 적어야 하는 패키지명은
AndroidManifest.xml의 package= 속성에서 확인한다.
- 애플리케이션의 카카오로그인 항목을 활성화해준다.
- Redirect URI 설정하기
없다면 임의로라도 꼭 써넣어 줘야 한다고 함.
나도 존재하지 않는 주소 임의로 넣었다.
프로젝트에 카카오로그인 화면 설정하고 구현하기
- AndroidManifest.xml 에 아래 코드 추가
<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>
scheme항목의 ${NATIVE_APP_KEY} 자리에는 네이티브 앱 키가 들어간다. 그냥 네이티브 키 앞에 kakao붙여서 넣어줘도 된다.
- 카카오 로그인 구현하기
대충 아래같은 버튼을 하나 만들고
<Button
android:id="@+id/btnKakaoLogin"
android:layout_width="300dp"
android:layout_height="70dp"
android:text="카카오 로그인하기"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
**우리가 흔히 생각하는 노란 카카오 로그인 버튼은 카카오에서 디자인을 제공해준다. 적용하는 방법은 다음 글 참고
해당 액티비티 코틀린 파일로 가서 아래처럼 버튼에 기능을 만든다.
import android.content.ContentValues.TAG
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.example.kakaologintestapp.databinding.ActivityMainBinding
import com.kakao.sdk.user.UserApiClient
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
binding.btnKakaoLogin.setOnClickListener{
if (UserApiClient.instance.isKakaoTalkLoginAvailable(this)) {
// 카카오계정으로 로그인
UserApiClient.instance.loginWithKakaoAccount(this) { token, error ->
if (error != null) {
Log.e(TAG, "로그인 실패", error)
}
else if (token != null) {
Log.i(TAG, "로그인 성공 ${token.accessToken}")
}
}
} else {
Log.e("로그", "카카오 로그인이 불가합니다.")
}
}
구현 끝
잘 작동한다.
그렇다면 이 사용자의 정보를 내 서버에 저장하려면?
더 찾아보자.
ERROR
1. 네이티브앱 키 오타
2. 카카오 로그인 실패 AuthError(statusCode=401, reason=Misconfigured, response=AuthErrorResponse(error=misconfigured, errorDescription=invalid android_key_hash or ios_bundle_id or web_site_url))
디버그 해시 키 값 때문인가
네이티브 앱 키랑 디버그 해시 키 값을 아무리 확인해도 해결하지 못했다
대신 디버그 키 해시값을 다른 방법으로 구해보자
openSSL 말고 카카오 SDK로 구한 해시키 값을 사용한다.
-> 된다 ..^^