일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- techEmpower
- 자바
- kakao
- C lanuage
- 개발자
- NGINX
- 한글
- H2O
- 안드로이드
- php
- C
- caddy
- 컴퓨터과학총론
- unity
- Portfolio
- 구글
- 번역
- error
- centOS7
- server
- 해석
- 프래그먼트
- MySQL
- javascript
- ubuntu
- java
- mariadb
- it
- android
- 개발
- Today
- Total
개발모음집
KaKaoLogin API로 로그인하기 본문
참고블로그를 참고하여 로그인 기능을 구현하고자 한다.
소스를 쓰고 로그인했는데 에러가 뜬다.
1.
AUTHORIZATION_FAILED : redirectURL=null, NOT_CONFIG_USER_MANAGEMENT : {"error":"NOT_CONFIG_USER_MANAGEMENT","error_description":"To use Kakao account login, user management has to be configured."}
검색해본 결과 키값에 대한 문제라고 하는데
나는 방금 발급받은 키이다. 뭐가 문제일까?
라 생각하며 카카오개발자센터에 들어가봤다.
로그인은 회원의 개인정보를 요청하는 것이기에 키를 발급받고 나서 절차를 더 밟아야한다.
내 애플리케이션페이지에서 내 앱을 선택하고 설정에 사용자관리에 들어가서 사용 탭을 ON으로 해준다
런데 또 에러가 발생했다.
E/kakao.sdk: com.kakao.util.exception.KakaoException: AUTHORIZATION_FAILED : invalid android_key_hash or ios_bundle_id or web_site_url
DevTalk에 찾아보니 키해시등록해야한단다.
키해시 등록하는 법은 카카오개발자에도 있는데 간략히 써놓겠다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Log.e("hi", getKeyHash(LoginActivity.this)); }
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.e("d", "Unable to get MessageDigest. signature=" + signature, e);
}
}
return null;
}
이런 식으로 로그를 찍으면 50자이내의 번호가 나온다
위와 같이 키해시를 등록해주면 해결
전체소스
public class GlobalApplication extends Application {
private static volatile GlobalApplication instance = null;
private static volatile Activity currentActivity = null;
@Override
public void onCreate() {
super.onCreate();
instance = this;
KakaoSDK.init(new KakaoSDKAdapter());
}
public static Activity getCurrentActivity() {
return currentActivity;
}
public static void setCurrentActivity(Activity currentActivity) {
GlobalApplication.currentActivity = currentActivity;
}
/**
* singleton 애플리케이션 객체를 얻는다.
*
* @return singleton 애플리케이션 객체
*/
public static GlobalApplication getGlobalApplicationContext() {
if (instance == null)
throw new IllegalStateException("this application does not inherit com.kakao.GlobalApplication");
return instance;
}
/**
* 애플리케이션 종료시 singleton 어플리케이션 객체 초기화한다.
*/
@Override
public void onTerminate() {
super.onTerminate();
instance = null;
}
}
public class KakaoSignupActivity extends AppCompatActivity {
/**
* Main으로 넘길지 가입 페이지를 그릴지 판단하기 위해 me를 호출한다.
* @param savedInstanceState 기존 session 정보가 저장된 객체
*/
private GlobalApplication app;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestMe();
}
/**
* 사용자의 상태를 알아 보기 위해 me API 호출을 한다.
*/
protected void requestMe() { //유저의 정보를 받아오는 함수
UserManagement.requestMe(new MeResponseCallback() {
@Override
public void onFailure(ErrorResult errorResult) {
String message = "failed to get user info. msg=" + errorResult;
Logger.d(message);
ErrorCode result = ErrorCode.valueOf(errorResult.getErrorCode());
if (result == ErrorCode.CLIENT_ERROR_CODE) {
finish();
} else {
redirectLoginActivity();
}
}
@Override
public void onSessionClosed(ErrorResult errorResult) {
redirectLoginActivity();
}
@Override
public void onNotSignedUp() {} // 카카오톡 회원이 아닐 시 showSignup(); 호출해야함
@Override
public void onSuccess(UserProfile userProfile) { //성공 시 userProfile 형태로 반환
String kakaoNickname = userProfile.getNickname(); // Nickname 값을 가져옴
String kakaoImagePath = userProfile.getProfileImagePath();
long kakaoUserId = userProfile.getId();
Logger.d("UserProfile : " + userProfile +", "+kakaoNickname);
redirectMainActivity(); // 로그인 성공시 MainActivity로
}
});
}
private void redirectMainActivity() {
startActivity(new Intent(this, MainActivity.class));
finish();
}
protected void redirectLoginActivity() {
final Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
finish();
}
}
public class KakaoSDKAdapter extends KakaoAdapter {
@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 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 SessionCallback callback; //콜백 선언
// 카카오톡
private class SessionCallback implements ISessionCallback {
@Override
public void onSessionOpened() {
redirectSignupActivity(); // 세션 연결성공 시 redirectSignupActivity() 호출
}
@Override
public void onSessionOpenFailed(KakaoException exception) {
if(exception != null) {
Logger.e(exception);
}
setContentView(R.layout.activity_login); // 세션 연결이 실패했을때
} // 로그인화면을 다시 불러옴
}
protected void redirectSignupActivity() { //세션 연결 성공 시 SignupActivity로 넘김
final Intent intent = new Intent(this, KakaoSignupActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
finish();
}
@Override
protected void onDestroy() {
super.onDestroy();
//카카오톡
Session.getCurrentSession().removeCallback(callback);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//카카오톡
if (Session.getCurrentSession().handleActivityResult(requestCode, resultCode, data)) {
return;
}
}
// 카카오톡@Override
protected void onCreate(Bundle savedInstanceState) {
callback = new SessionCallback(); // 이 두개의 함수 중요함
Session.getCurrentSession().addCallback(callback); }
'Android' 카테고리의 다른 글
안드로이드 스튜디오에서 github연동하는 법 (0) | 2017.07.31 |
---|---|
facebook login api (0) | 2017.07.31 |
google map 길찾기 폴리라인 (directions polyLine) (1) | 2017.07.27 |
Android OpenCv 이미지 필터 + 얼굴인식 (10) | 2017.07.26 |
Android MediaPlayer Error - (1, -2147483648) (0) | 2017.07.25 |