한 걸음 두 걸음
Android / 안드로이드 ] kakao auth login 구현하기(kakao OAuth) 본문
반응형
1. kakao developers 가입합니다.
[https://developers.kakao.com/](https://developers.kakao.com/)
2. 내 애플리케이션 생성으로 들어갑니다.
[https://developers.kakao.com/apps/new](https://developers.kakao.com/apps/new)
3. 앱을 만들어줍니다.
4. 사용자관리로 들어갑니다.
사용자 관리에서 사용자관리를 활성화시키고, 개인정보 보호항목 및 접근권한 관리항목을 조정합니다.
5. 이제 안드로이드 프로젝트로 가서 gradle에 사용하고자 하는 SDK를 추가해줍니다.(Gradle환경)
5.1 Project단위의 Gradle에 추가시켜줍니다.
subprojects {
repositories {
mavenCentral()
maven { url 'http://devrepo.kakao.com:8088/nexus/content/groups/public/' }
}
}
5.2 module단위의 Gradle에 추가시켜줍니다.
저는 현재 Login모듈만 추가시키는 중이므로 아래 한 줄만 가져오도록 하겠습니다.
implementation group: 'com.kakao.sdk', name: 'usermgmt', version: '1.14.0'
https://developers.kakao.com/docs/android/getting-started#%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%9D%B4%EC%9A%A9
(이에 대한 문서는 위의 링크에 있습니다.)
6. value-string파일에 네이티브앱키를 등록시켜줍니다.
<resources>
<string name="app_name">내앱</string>
<string name="kakao_app_key">네이티브앱키</string>
</resources>
7. Manifest.xml파일에 다음과 같이 추가해줍니다.
<!-- 1 -->
<uses-permission android:name="android.permission.INTERNET" />
<application>
<!-- 2 -->
<activity
...
android:name=".SampleLoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 3 -->
<meta-data
android:name="com.kakao.sdk.AppKey"
android:value="@string/kakao_app_key" />
<!-- 4 -->
<activity
android:name="com.kakao.auth.authorization.authcode.KakaoWebViewActivity"
android:launchMode="singleTop"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
...
</application
8. 카카오 API 콜을 수행하려면 앱별 키 해시를 등록
키 해시를 구하는 방법은
Activity에서 다음의 함수를 호출하여 확인하실 수 있습니다.
저같은 경우는 MainActivity에서 호출하여 로그로 확인해주었습니다.(아래코드)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("MyHashKey", getKeyHash(getApplicationContext()));
}
public static String getKeyHash(final Context context) {
PackageInfo packageInfo = getPackageInfo(context, PackageManager.GET_SIGNATURES);
if (packageInfo == null)
return null;
for (Signature signature : packageInfo.signatures) {
try {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
return Base64.encodeToString(md.digest(), Base64.NO_WRAP);
} catch (NoSuchAlgorithmException e) {
Log.w("임시체크태그", "Unable to get MessageDigest. signature=" + signature, e);
}
}
return null;
}
}
9. 자잘하게 할게 많네요..
10. 이제 진짜로 코딩을 해봅시다.
일단 코드 통째로 올려드림!
로그인 할 때 필요한 3개
구성 1. activity_main.xml
2. MainActivity.java
3. GlobalActivity.java
로그인 성공 후 볼 간단한 화면
- SuccessActivity.java
- activity_success.xml
1. activity.main
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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=".MainActivity">
<com.kakao.usermgmt.LoginButton
android:id="@+id/com_kakao_login"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_marginBottom="30dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:layout_marginTop="350dp"
android:layout_weight="1" />
</FrameLayout>
- MainActivity.java
package com.onsemiro.hanpinetree.kakaologinmodule;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.kakao.auth.ISessionCallback;
import com.kakao.auth.KakaoSDK;
import com.kakao.auth.Session;
import com.kakao.util.exception.KakaoException;
import com.kakao.util.helper.log.Logger;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import static com.kakao.util.helper.Utility.getPackageInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.widget.Toast;
import com.kakao.auth.ISessionCallback;
import com.kakao.auth.KakaoSDK;
import com.kakao.auth.Session;
import com.kakao.util.exception.KakaoException;
import com.kakao.util.helper.log.Logger;
public class MainActivity extends Activity {
private SessionCallback callback;
/\*\* \* 로그인 버튼을 클릭 했을시 access token을 요청하도록 설정한다.
\* \* @param savedInstanceState 기존 session 정보가 저장된 객체
\*/
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\_main);
callback = new SessionCallback();
Session.getCurrentSession().addCallback(callback);
Session.getCurrentSession().checkAndImplicitOpen();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (Session.getCurrentSession().handleActivityResult(requestCode, resultCode, data)) {
Intent intent = new Intent(this, SuccessActivity.class);
startActivity(intent);
finish();
return;
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onDestroy() {
super.onDestroy();
Session.getCurrentSession().removeCallback(callback);
}
private class SessionCallback implements ISessionCallback {
@Override
public void onSessionOpened() {
redirectSignupActivity();
}
@Override
public void onSessionOpenFailed(KakaoException exception) {
if(exception != null) {
Logger.e(exception);
}
}
}
protected void redirectSignupActivity() {
final Intent intent = new Intent(this, SuccessActivity.class);
startActivity(intent);
finish();
}
}
- GlobalActivity.java
package com.onsemiro.hanpinetree.kakaologinmodule;
import android.app.Application;
import android.content.Context;
import com.kakao.auth.ApprovalType;
import com.kakao.auth.AuthType;
import com.kakao.auth.IApplicationConfig;
import com.kakao.auth.ISessionConfig;
import com.kakao.auth.KakaoAdapter;
import com.kakao.auth.KakaoSDK;
public class GlobalApplication extends Application {
private static volatile GlobalApplication instance = null;
public static GlobalApplication getGlobalApplicationContext() {
if(instance == null)
throw new IllegalStateException("this application does not inherit com.kakao.GlobalApplication");
return instance;
}
public static class KakaoSDKAdapter extends KakaoAdapter {
/**
* Session Config에 대해서는 default값들이 존재한다.
* 필요한 상황에서만 override해서 사용하면 됨.
* @return Session의 설정값.
*/
@Override
public ISessionConfig getSessionConfig() {
return new ISessionConfig() {
@Override
public AuthType[] getAuthTypes() {
return new AuthType[] {AuthType.KAKAO_LOGIN_ALL};
}
@Override
public boolean isUsingWebviewTimer() {
return false;
}
@Override
public boolean isSecureMode() {
return false;
}
@Override
public ApprovalType getApprovalType() {
return ApprovalType.INDIVIDUAL;
}
@Override
public boolean isSaveFormData() {
return true;
}
};
}
@Override
public IApplicationConfig getApplicationConfig() {
return new IApplicationConfig() {
@Override
public Context getApplicationContext() {
return GlobalApplication.getGlobalApplicationContext();
}
};
}
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
KakaoSDK.init(new KakaoSDKAdapter());
}
}
4. SuccessActivity.java랑 xml은 안드려도 되겠죠? 아무거나 보고싶은 창으로 만드세용 : ) ㅎㅎ
깃허브로 보고싶다면?
https://github.com/losnah/ModuleAsset.git
- kakako developers login API
https://developers.kakao.com/docs/android/user-management
참고
https://developers.kakao.com/apps/342442
반응형
'FrontEnd > Android' 카테고리의 다른 글
로그의 종류 (0) | 2019.09.11 |
---|---|
Android / 안드로이드 ] Proguard 프로가드 (0) | 2019.09.07 |
android / 안드로이드 ] 네이버지도 api #02 좌표 설정하기 / naverMap 객체 (3) | 2019.08.08 |
android / 안드로이드 ] 네이버지도 api #01 적용시키기 (2) | 2019.08.08 |
Android apk 6.0 에서 실행안됨 / 죽는 현상 (0) | 2019.08.06 |