2019. 9. 8. 21:38 ㆍ개발 이야기/android
안녕하세요!
오늘은 안드로이드 로그인 관련해서 포스팅할건데요!
많은 개발자분들이 사용하고 계신
SNS 연동관련해서 하나씩 정리해보도록 하겠습니다.
프로젝트 내에서 사용하는 로그인 프로세스는 총 4개에요!
파이어베이스, 페이스북, 카카오톡, 네이버
이렇게 총 4개의 로그인 프로세스가 있는데요
이 중 오늘은 카카오톡을 이용한 로그인 방법을 정리해보도록 하겠습니다.
먼저 저는 각 로그인별로 클래스를 만들었는데요
이런식으로 분리하여 작성을 했습니다 .
그리고 로그인 액티비티에서
요런식으로 생성을 해주고!
이렇게 엑티비티 result를 가져오는 콜백도 필요한 애들만 (카카오, 페이스북) 정리를 해줬습니다.
그리고 만들어준 버튼에다가 이렇게 poerformClick();을 해주게되면
로그인 시도한 효과가 나타난다는 사실!
그럼 이제
소스코드를 분석해보도록 하겠습니다.
public class KakaoAuth extends AppCompatActivity implements IAuth {
private SessionCallback callback;
private static Context mContext;
private static APIInterface apiInterface;
private static RedirectActivity redirect;
@Override
public void Login(Context context) {
mContext = context;
redirect = RedirectActivity.getInstance();
callback = new SessionCallback();
Session kakaoSession = Session.getCurrentSession();
kakaoSession.addCallback(callback);
/** 토큰 만료시 갱신을 시켜준다**/
kakaoSession.checkAndImplicitOpen();
}
@Override
protected void onDestroy() {
super.onDestroy();
Session.getCurrentSession().removeCallback(callback);
}
카카오톡 인증의 첫부분인데요!
먼저 콜백을 만들어주고
카카오 세션을 콜백으로 던저주게됩니다!
kakaoSession.checkAndImplicitOpen(); 함수를 사용하게되면
토큰 만료시에 갱신을 시켜주게되는데요! 이부분에 조금 이상한 부분이 있었습니다.
세션을 얻게되면 바로 onSessoinOpened가 호출되는데요!
최초 로그인 시에 엄청나게 여러번 이부분이 호출되는 것을 확인할 수있었습니다.
그리고 만약 로그인이 되어있어서 세션이 있어도 바로 콜백이 호출되게 됩니다!
private class SessionCallback extends AppCompatActivity implements ISessionCallback {
@Override
public void onSessionOpened() {
if (Util.kakaoLogin == 0) {
Dlog.Companion.d("카카오 세션 오픈~~");
Request(mContext);
Util.kakaoLogin = 1;
}
}
@Override
public void onSessionOpenFailed(KakaoException exception) {
if (exception != null) {
Dlog.Companion.d("카카오 세션 오픈 실패" + exception);
}
}
}
저는 세션이 얻어지면 Request라는 함수를 만들어서 서버에서 등록하거나,
제가 사용하는 jwt 토큰을 다시 발급받는 등의 행위를 했는데요
아주 여러번 날아가는 문제 때문에 kakaoLoin 이라는 스테틱 변수를 만들어서 1일때만
날아 가도록 하여 버그를 수정했습니다 ..
다음은 카카오 api를 이용하기 위해 필요한 해쉬값 가져오는 함수입니다
참고만 해주세요
public static String getKeyHash(final Context context) {
Dlog.Companion.d("카카오톡 개발자 해시키 가져오는 함수");
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 android.util.Base64.encodeToString(md.digest(), android.util.Base64.NO_WRAP);
} catch (NoSuchAlgorithmException e) {
Log.w("112", "Unable to get MessageDigest. signature=" + signature, e);
}
}
return null;
}
다음은 로그인을 완료한 후에 로그인한 정보를 얻을 수 있는 함수입니다!
이 부분을 이용해서 서버쪽에 필요한 정보를 전달해줍니다!
public static 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) {
String message = "failed to get user info. msg=" + errorResult;
Dlog.Companion.d(message);
}
@Override
public void onSessionClosed(ErrorResult errorResult) {
Dlog.Companion.d("세션 닫힌 경우");
}
@Override
public void onSuccess(MeV2Response response) {
Dlog.Companion.d("카카오톡 정보 가져오기~~~");
Dlog.Companion.d("user id : " + response.getId());
Dlog.Companion.d("email: " + response.getKakaoAccount().getEmail());
Dlog.Companion.d("getNickname: " + response.getNickname());
Dlog.Companion.d("getAgeRange: " + response.getKakaoAccount().getAgeRange());
Dlog.Companion.d("getPhoneNumber: " + response.getKakaoAccount().getPhoneNumber());
Dlog.Companion.d("getDisplayId: " + response.getKakaoAccount().getDisplayId());
AccessToken accessToken;
accessToken = Session.getCurrentSession().getTokenInfo();
Dlog.Companion.d("액세스 토큰 : " + accessToken.getAccessToken());
Dlog.Companion.d("리프레쉬 토큰 : " + accessToken.getRefreshToken());
}
});
}
다음은 서버와 함께 카카오 developer 사이트와 연결을 끊어주는 함수입니다
연결 끊는것이 성공하면 서버쪽에 등록된 정보도 disabled 되도록 리퀘스트를 날리고
로그아웃하는 로직을 구현했습니다!
// unlink만 사용하는 경우 static으로 사용
public static void unlink(Context context) {
Util.kakaoLogin = 0;
UserManagement.getInstance().requestUnlink(new UnLinkResponseCallback() {
@Override
public void onFailure(ErrorResult errorResult) {
Dlog.Companion.d("카카오 연결해제 실패");
Dlog.Companion.d(errorResult.toString());
RedirectActivity.getInstance().signOut(context);
}
@Override
public void onSessionClosed(ErrorResult errorResult) {
Dlog.Companion.d("카카오 세션이 없는 경우");
// redirect.redirectLoginActivity(mContext);
RedirectActivity.getInstance().signOut(context);
}
@Override
public void onNotSignedUp() {
// 발생하지 않음 -> 카카오에서 처리
Dlog.Companion.d("발생하지 않음 -> 카카오에서 처리");
}
@Override
public void onSuccess(Long result) {
Dlog.Companion.d("카카오 연결해제 성공");
requestModule.deleteAccount(context);
}
});
}
다음은 단순 로그아웃하는 로직입니다!
public static void signOut(final Context context) {
Dlog.Companion.d("카카오톡 로그아웃 : 카카오는 토큰으로 확인");
Util.kakaoLogin = 0;
if (Session.getCurrentSession().getTokenInfo().getAccessToken() == null) {
Dlog.Companion.d("카카오 토큰 없음");
} else {
Dlog.Companion.d("카카오 토큰 있음");
UserManagement.getInstance().requestLogout(new LogoutResponseCallback() {
@Override
public void onCompleteLogout() {
Dlog.Companion.d("카카오톡 로그아웃");
RedirectActivity.getInstance().signOutAfterLoginActivity(context);
}
});
}
}
로그아웃을 완료하게되면 로그인 페이지로 리다이렉트를 하게되구요!
이런식으로 카카오톡을 이용한 회원가입, 탈퇴, 로그아웃을
구현하였는데요!
가입정보를 가져오는 requestMe 와 같은 부분을 이용해서
서버의 DB에 필요한 사용자 정보를 저장해
회원관리를 하도록 했습니다.
많은 분들이 단순하게 로그인 로직만 가지고 하는 개발을 하는 경우를 보았는데요!
서버에서도 2차인증이 꼭필요하고 이를 확인하는 로직을 꼭 추가해주셔야 합니다!
다음에는 네이버 SNS 연동 로직을 가져오도록 하겠습니다!
'개발 이야기 > android' 카테고리의 다른 글
#안드로이드 Third party 로그인 연동 3(파이어베이스 연동) (0) | 2019.09.15 |
---|---|
#안드로이드 Third party 로그인 연동 2(네이버 연동) (0) | 2019.09.12 |
안드로이드 네트워크 연결상태 확인 (0) | 2019.08.27 |
android ssl pinning(HPKP -HTTP Public Key Pinning) 적용 방법 (0) | 2019.08.20 |
안드로이드 FFMPEG 64bit 지원 (7) | 2019.08.01 |