프로그램/Android

안드로이드 SNS 카카오톡 로그인

잡식성초보 2018. 11. 15. 08:00

안드로이드 SNS 로그인 인증 Kakao 관련 입니다.


보통 SNS로그인을 고객사가 요청하면 국내에서는 필수중의 필수라고  할 수 있죠.


이번에도 샘플에 대하여 간단한 정리를 해놓겠습니다.


카카오 역시 API를 사용하려면 카카오 Developer 사이트를 방문해야 겠지요?(링크)


그 후 우측상단에서 어플리케이션에 들어가셔서 페이스북과 기타 API 사이트들과 다르지 않게


어플리케이션을 생성합니다. 조금 까다로운 부분이 있다면 역시나 키 해쉬를 적는부분입니다.


그부분은 이전글 페이스북 관련을 참조하시면 될거같습니다.



카카오 관련 로그인을 하기 위해서 일단 AndroidManifest.xml에서 키값을 넣어 줍니다.


<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>

<meta-data
android:name="com.kakao.sdk.AppKey"
android:value="키값을 넣어준다" />



AndroidManifest를 셋팅하셨다면 첫번째로 해야할건 KaKaoAdapter를 선언하고 


Application단에서 init선언을 해주셔야 합니다.


첫번째 KaKaoAdapter입니다.


필요에 맞게 사용하기 위해서는 AuthType을 필요에 맞는 값으로 변경하여 주시면 됩니다.


public class KaKaoSDKAdapter extends KakaoAdapter {

@Override
public ISessionConfig getSessionConfig() {
return new ISessionConfig() {
/** AuthType을 클릭하면 로그인하고 싶은 타입을 볼수있다.**/
@Override
public AuthType[] getAuthTypes() {
return new AuthType[]{AuthType.KAKAO_LOGIN_ALL};
}

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

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

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

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

@Override
public IPushConfig getPushConfig() {
return super.getPushConfig();
}

@Override
public IApplicationConfig getApplicationConfig() {
return new IApplicationConfig() {
@Override
public Context getApplicationContext() {
return SNSApplication.getInstance().getApplicationContext();
}
};
}
}


KaKaoAdapter를 셋팅하셨다면 다음에는 Application단에서 init을 해줍니다.


public class SNSApplication extends Application {

private static SNSApplication instance;

public static SNSApplication getInstance() {
if (instance != null) {
return instance;
} else {
instance = new SNSApplication();
return instance;
}
}

@Override
public void onCreate() {
super.onCreate();

instance = this;
KakaoSDK.init(new KaKaoSDKAdapter());
}

@Override
public void onTerminate() {
super.onTerminate();
instance = null;
}
}


여기까지 완성되었다면 이제 KaKao로그인을 위해 사용할 Activity에서 버튼을 만들어 주시면 되겠습니다.


카카오 또한 페이스북 처럼 자신들만의 LoginButton이 따로 있습니다. 사용할 xml에 아래를 넣어주시면 되겠습니다.


<com.kakao.usermgmt.LoginButton
android:id="@+id/com_kakao_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"/>



그럼 이제 본격적인 Activity 내 소스 들입니다. 주석을 잘 보시길 바랍니다.


타 인증 로그인시 중요하게 여겨지는 토큰만료시 갱신 부분은 checkAndImplicitOpen으로  갱신 할수 있습니다.


그리고 requestMe라는 함수를 이용하여 사용자 정보를 가져오는데 List에 원하는 정보를 넣어야지 


통신 성공시 데이터를 받아올수 있습니다. 필요한 정보에 대한것은 카카오 사용자 관리 페이지에서


요청해놓은 데이터들만 받아올수 있습니다. (페이지 링크)

public class MainActivity extends Activity {

private String TAG = "MainActivity";


private SessionCallback callback;


@Override
protected void onDestroy() {
super.onDestroy();
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
kakaoData();
}
/** 카카오톡 **/
private void kakaoData(){
findViewById(R.id.kakaoLogout).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onClickLogout();
}
});

callback = new SessionCallback();
Session.getCurrentSession().addCallback(callback);

/** 토큰 만료시 갱신을 시켜준다**/
if(Session.getCurrentSession().isOpenable()){
Session.getCurrentSession().checkAndImplicitOpen();
}

Log.e(TAG, "토큰큰 : " + Session.getCurrentSession().getTokenInfo().getAccessToken());
Log.e(TAG, "토큰큰 리프레쉬토큰 : " + Session.getCurrentSession().getTokenInfo().getRefreshToken());
Log.e(TAG, "토큰큰 파이어데이트 : " + Session.getCurrentSession().getTokenInfo().getRemainingExpireTime());
}


private class SessionCallback implements ISessionCallback {

@Override
public void onSessionOpened() {
Log.e(TAG, "카카오 로그인 성공 ");
requestMe();
}

@Override
public void onSessionOpenFailed(KakaoException exception) {
if(exception != null) {
Log.e(TAG, "exception : " + exception);
}
}
}

/** 사용자에 대한 정보를 가져온다 **/
private void requestMe() {

List<String> keys = new ArrayList<>();
keys.add("properties.nickname");
keys.add("properties.profile_image");
keys.add("kakao_account.email");

UserManagement.getInstance().me(keys, new MeV2ResponseCallback() {
@Override
public void onFailure(ErrorResult errorResult) {
super.onFailure(errorResult);
Log.e(TAG, "requestMe onFailure message : " + errorResult.getErrorMessage());
}

@Override
public void onFailureForUiThread(ErrorResult errorResult) {
super.onFailureForUiThread(errorResult);
Log.e(TAG, "requestMe onFailureForUiThread message : " + errorResult.getErrorMessage());
}

@Override
public void onSessionClosed(ErrorResult errorResult) {
Log.e(TAG, "requestMe onSessionClosed message : " + errorResult.getErrorMessage());
}

@Override
public void onSuccess(MeV2Response result) {
Log.e(TAG, "requestMe onSuccess message : " + result.getKakaoAccount().getEmail() + " " + result.getId() + " " + result.getNickname());
}

});
}

/** 로그아웃시 **/
private void onClickLogout() {

UserManagement.getInstance().requestUnlink(new UnLinkResponseCallback() {
@Override
public void onSessionClosed(ErrorResult errorResult) {
Log.e(TAG, "카카오 로그아웃 onSessionClosed");
}

@Override
public void onNotSignedUp() {
Log.e(TAG, "카카오 로그아웃 onNotSignedUp");
}

@Override
public void onSuccess(Long result) {
Log.e(TAG, "카카오 로그아웃 onSuccess");
}
});
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (Session.getCurrentSession().handleActivityResult(requestCode, resultCode, data)) {
return;
}

super.onActivityResult(requestCode, resultCode, data);
}
}


반응형