물에 살고싶은 개발자

[카카오연동] 로그인 연동하기 정리 본문

Android

[카카오연동] 로그인 연동하기 정리

돼지사랑 2017. 11. 8. 16:10


카카오톡 연동하기 정리


1. 카톡 디벨로퍼 사이트에서 앱 등록

https://developers.kakao.com/ 로 가서 오른쪽위에 로그인을 통해 로그인을 하고나면

아래 사진처럼 왼쪽에 앱 만들기가 보인다




그 후 네이티앱키 뭐 어쩌고 뜨는데 왼쪽에 보면 설정에 일반이 있다.

그걸 클릭하면 아래 화면이 나온다.



여기서 플랫폼 추가를 해주고 패키지 입력하면 URL도 알아서 뜬다.

현재 개발중인 프로젝트의 패키지명을 입력해주고 플랫폼을 추가해보자.




등록된 플랫폼 아래에 보면 키 해시가 있는데 이제 이 키 해시를 얻어서 등록하면 끝이다.


키해시를 얻는 방법은 기본적으로 두가지가 있다.

카카오 디벨로퍼에서 알려주는 콘솔창에 


keytool -exportcert -alias androiddebugkey -keystore <debug_keystore_path> -storepass android -keypass android | openssl sha1 -binary | openssl base64

이런식의 코드를 입력해 뽑는 방법과 자바 코드로 뽑는방법 두개가 있는데, 

콘솔창에다 할라면 키스토어 찾아서 패스 입력하고 어쩌고 귀찮다. 그냥 코드 복붙하고 실행한번 시키면 로그로 나오니까 그거 쓰자.


키 해시 얻는 코드

//카카오 키해시 얻기
try {
PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.e("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}

대충 위 코드를 onCreate() 어딘가에 떄려넣고 한번 실행시키면 해시코드가 로그에 뽝 찍힌다. 그럼 카톡 디벨로퍼로 가서 키 해시 등록을 해주자


그 후에 사용자관리를 가서 사용한다고 하면 된다.


긴 설명 필요없다고 봄. 수집목적 알아서 요령껏 작성하고 아래로 내려가 저장 누르면 카톡디벨로퍼에서 할일은 끝이다.

(아 위에서 네이티브 앱 키 복사해두자)


2.안드로이드 스튜디오에서 밑작업하기


일단 가져가 쓰려면 뭔가 gradle에 등록해야 한다. 

그러므로 build.gradle(Project)에 가서 아래 코드를 추가해준다. 

allprojects {
repositories {
jcenter()
mavenCentral()
maven { url 'http://devrepo.kakao.com:8088/nexus/content/groups/public/' }
}
}


그다음 gradle.properties에 가서 


KAKAO_SDK_GROUP=com.kakao.sdk
KAKAO_SDK_VERSION=1.1.7

위 두줄을 써넣어주자


그리고 gradle(app)에 가서 


//카카오톡 로그인
compile group: project.KAKAO_SDK_GROUP, name: 'usermgmt', version: project.KAKAO_SDK_VERSION

dependencies에 위 한줄 추가해준다.

(참고: 위 코드는 로그인만이고 그 외에 카카오연동하려면 더 추가해야할수도있다. 카카오 디벨로퍼에 나와있음)


그리고 이제 매니패스트로 가서 필요한 내용들을 추가해주자


<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".GlobalApplication"
<!--카카오 연동-->
<meta-data
android:name="com.kakao.sdk.AppKey"
android:value="@string/kakao_app_key" />

이렇게 세가지 추가하면 된다.

일단은 빨간글씨가 뜰텐데 메타데이터에 벨류는 string.xml에 아까 카카오 디벨로퍼에 등록했던 앱의 네이티브 코드 등록해주면 된다.

코딩하기 전의 밑작업은 다 끝난다.


3.필요한 클래스들 추가 


위에 매니패스트에서 뻘겋게 됐던놈은 아래 클래스 추가해주면 없어진다.

public class GlobalApplication extends Application {
private static volatile GlobalApplication obj = null;
private static volatile Activity currentActivity = null;

@Override
public void onCreate() {
super.onCreate();
obj = this;
KakaoSDK.init(new KakaoSDKAdapter());
}

public static GlobalApplication getGlobalApplicationContext() {
return obj;
}

public static Activity getCurrentActivity() {
return currentActivity;
}

// Activity가 올라올때마다 Activity의 onCreate에서 호출해줘야한다.
public static void setCurrentActivity(Activity currentActivity) {
GlobalApplication.currentActivity = currentActivity;
}
}


그리고 카카오SDK 클래스도 추가해주자.

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_ACCOUNT};
}

@Override
public boolean isUsingWebviewTimer() {
return false;
}


@Override
public ApprovalType getApprovalType() {
return ApprovalType.INDIVIDUAL;
}

@Override
public boolean isSaveFormData() {
return true;
}
};
}

@Override
public IApplicationConfig getApplicationConfig() {
return new IApplicationConfig() {
@Override
public Activity getTopActivity() {
return GlobalApplication.getCurrentActivity();
}

@Override
public Context getApplicationContext() {
return GlobalApplication.getGlobalApplicationContext();
}
};
}
}


그리고 마지막으로 세션콜백 클래스를 추가해주는데, 이녀석은 따로 클래스를 만들던

로그인 액티비티에 이너클래스로 만들던 만드는사람의 자유다. 근데 난 액티비티도 세션에서 컨트롤하려고 이너클래스로 함ㅇㅇ

private class SessionCallback implements ISessionCallback {

@Override
public void onSessionOpened() {

UserManagement.requestMe(new MeResponseCallback() {

@Override
public void onFailure(ErrorResult errorResult) {
String message = "failed to get user info. msg=" + errorResult;

ErrorCode result = ErrorCode.valueOf(errorResult.getErrorCode());
Log.e(TAG, "onFailure: " + message);
if (result == ErrorCode.CLIENT_ERROR_CODE) {
//에러로 인한 로그인 실패
// finish();
} else {
//redirectMainActivity();
}
}

@Override
public void onSessionClosed(ErrorResult errorResult) {
}

@Override
public void onNotSignedUp() {
}

@Override
public void onSuccess(UserProfile userProfile) {
//로그인에 성공하면 로그인한 사용자의 일련번호, 닉네임, 이미지url등을 리턴합니다.
//사용자 ID는 보안상의 문제로 제공하지 않고 일련번호는 제공합니다.
Log.e("UserProfile", userProfile.toString());
Log.e("UserProfile", userProfile.getId() + "");

Toast.makeText(LoginActivity.this, "로그인에 성공하셧습니다.\n" + userProfile.getNickname() + "님 환영합니다.", Toast.LENGTH_SHORT).show();
}
});

}

@Override
public void onSessionOpenFailed(KakaoException exception) {
// 세션 연결이 실패했을때
// 어쩔때 실패되는지는 테스트를 안해보았음 ㅜㅜ
Log.e(TAG, "세션연결 실패->\n" + exception);
}
}

코드보면 대충 감이 잡히겠지만 onSuccess()가 로그인성공하면 호출되는 메서드다.

상황에 맞게 잘 커스텀해서 쓰자.


그리고 마지막으로 본인이 사용하는 로그인 액티비티에서 콜백을 추가해주면 끝.

SessionCallback callback;
//카카오 로그인
callback = new SessionCallback();
Session.getCurrentSession().addCallback(callback);


이 3줄이면 기능은 끝난다.


마지막으로 레이아웃 xml에 카카오 버튼을 추가해주자

<com.kakao.usermgmt.LoginButton
android:id="@+id/kakaoLoinBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>



여기까지 하면 로그인 연동은 끝.





코드보면 대충 감이 잡히겠지만, 토스트에 보면 유저의 닉네임을 가져온다. 비슷한 방식으로 유저프로필에서 이것저것 정보를 가져올수있는데, 이는 카카오 디벨로퍼 가서 확인해보자 


끝.

Comments