안녕하세요.
제 앱(ID:143413)에서
신규 안드로이드 사용자 분께서 로그인이 안된다고 합니다.
(계속 안 됨)
사용 중인 카카오 SDK를 최신 버전(2.4.2)으로 올려도 동일한 문제가 발생하고 있습니다.
제가 보기에는 로그인 후 토큰 정보를 못 가져오는 것 같습니다. 제 앱의 로그인 실패 관련 부분 코드입니다.
UserApiClient.getInstance().accessTokenInfo((tokenInfo, error) → {
if (error != null) {
Toast.makeText(LoginActivity.this, "토큰 정보 보기 실패: " + error, Toast.LENGTH_LONG).show();
}
else if (tokenInfo != null) {
proceedKakaoLogin();
}
return null;
});
아래의 에러가 발생하고 있다고 사진을 전달 받았습니다.
혹시 무엇이 문제인지 알 수 있을까요?
*사용자 분의 정보
카카오 계정 이메일: kms18good@naver.com
Device: Samsung Galaxy S10 5G
Android version: Android 11 (SDK 30)
로그인 시도 시간(KST): 2021년 4월 20일 10시 11분~18분 사이
*로그인 실패 사진
안녕하세요~
혹시 토큰 정보 확인하기 전에 로그인하는 부분 코드도 첨부 가능할까요?
안녕하세요. 로그인 부분의 코드는 아래와 같습니다.
//[S]
// 카카오계정으로 로그인
UserApiClient.getInstance().loginWithKakaoAccount(getApplicationContext(), (token, error) -> {
if (error != null) {
//[S] 에러 메세지 보여주기
GonggaCommonDialog gonggaCommonDialog = new GonggaCommonDialog();
gonggaCommonDialog.dialogTitle = getResources().getString(R.string.dialog_title_for_error);
gonggaCommonDialog.dialogMessage = error.getLocalizedMessage();
gonggaCommonDialog.cancelButtonEnabled = false;
gonggaCommonDialog.cancelable = false;
gonggaCommonDialog.btnConfirmText = getResources().getString(R.string.close);
gonggaCommonDialog.onClickListener = new View.OnClickListener(){
@Override
public void onClick(View view) {
//finish();
gonggaCommonDialog.dismiss();
}
};
gonggaCommonDialog.show(getSupportFragmentManager(), "ERROR_DIALOG");
//[E] 에러 메세지 보여주기
}
else if (token != null) {
proceedKakaoLogin();
}
return null;
});
//[E]
서버 로그를 확인해본 결과, 로그인이 안 된 상태에서 토큰 정보를 확인하려고 해서 발생한 이슈인 것으로 판단됩니다.
토큰 정보 확인하기의 경우에는 다음과 같이 가이드하고 있습니다. 링크 참고하셔서 수정해보시기를 권장드립니다
https://developers.kakao.com/docs/latest/ko/kakaologin/android#token-presence
if (AuthApiClient.instance.hasToken()) {
UserApiClient.instance.accessTokenInfo { _, error ->
if (error != null) {
if (error is KakaoSdkError && error.isInvalidTokenError() == true) {
//로그인 필요
}
else {
//기타 에러
}
}
else {
//토큰 유효성 체크 성공(필요 시 토큰 갱신됨)
}
}
}
else {
//로그인 필요
}
1개의 좋아요
말씀해주신 로직으로 수정이 어렵지는 않으나
제 코드를 보면
카카오 계정으로 로그인
-> token이 null이 아닐 경우에 제가 만든 proceedKakaoLogin() 함수를 호출
-> proceedKakaoLogin()함수에서 UserApiClient.getInstance().me를 수행
하도록 되어있습니다.
로그인 성공 후 UserApiClient.getInstance().me를 호출하는 것인데 여기에서…
로그인 성공 후 AuthApiClient.instance.hasToken()를 체크하는 과정이 의미가 있을까요?
그리고 좀 이상한 것은 여러 사용자 중에 한 분만에게만 저 증상이 나타난다는 것입니다. ㅜㅜ
안녕하세요?
로그인 성공 후 AuthApiClient.instance.hasToken()를 체크하는 과정이 의미가 있을까요?
=> hasToken()은 로그인 전에 토큰 정보가 단말에 저장 되어 있는지 확인 하는 것입니다. 단말에 토큰 정보가 없다면, 로그인을 요청 하는 것 입니다.
그리고 좀 이상한 것은 여러 사용자 중에 한 분만에게만 저 증상이 나타난다는 것입니다. ㅜㅜ
=> 저희 예상으로는 저 분이 refresh Token이 만료 된 상태로 보이며, 시간이 지날 수록 동일 현상 계정이 추가로 생길 것 같습니다.
저희가 공유 드린 가이드 대로
UserApiClient.getInstance().accessTokenInfo((tokenInfo, error) 에서
refreshToken 만료 시 로그인 요청 코드가 추가 되야 합니다.
2개의 좋아요
로그인을 한 기록이 있는 상태에서 앱이 재실행되는 경우 자동로그인을 하기 위해 말씀하신 로직을 쓸 수는 있을 것 같습니다.
그런데 로그인이 안된 상태에서 말씀해주신 로직을 사용하면,
사용자가 처음 카카오 계정으로 로그인 -> AuthApiClient.instance.hasToken()로 토큰 체크 -> 토큰 이상하면 다시 로그인 시도 -> 토큰 체크… 이런식으로 계속 반복될 여지가 있지 않을까요?
UserApiClient.getInstance().loginWithKakaoAccount() 함수 내부를 좀 보면,
UserApiClient.getInstance().loginWithKakaoAccount()
-> AuthApiClient.instance.issueAccessToken(code!!, codeVerifier)
-> tokenManagerProvider.manager.setToken(token)
으로 타는 것 같습니다. 토큰 발급에 성공하면 단말에 저장하고 콜백을 부르는 것 같습니다.
그리고 토큰 체크를 하는 AuthApiClient.getInstance().hasToken() 내부를 좀 보면,
fun hasToken() : Boolean {
return tokenManagerProvider.manager.getToken() != null
}
동일하게 tokenManagerProvider를 통해 단말의 토큰 정보를 확인하는 것 같습니다. tokenManagerProvider.manager.getToken()
제 생각에는 로그인 성공 후 콜백이 불리는 상황에서는 단말에도 토큰 정보가 저장되어 있는 상태 같습니다.
카카오 서버에도 관련된 내용이 있어야할 것으로 보이는데 이 상황에서
UserApiClient.getInstance().accessTokenInfo((tokenInfo, error),
UserApiClient.getInstance().me((user, error) 등의 함수에서 에러 응답이 나오는 것 같습니다.
제가 잘못 이해하고 있는 것일까요?
로그인 과정에서 문제가 생긴게 아닌가 의심됩니다.
일단 로그를 좀 더 추가하고 확인해보려고 합니다.
안녕하세요?
사용자가 처음 카카오 계정으로 로그인 -> AuthApiClient.instance.hasToken()로 토큰 체크 -> 토큰 이상하면 다시 로그인 시도 -> 토큰 체크… 이런식으로 계속 반복될 여지가 있지 않을까요?
=>
로그인 실패 시 (loginWithKakaoAccount), callback 내부에서 로그인을 다시 시도 해서는 안됩니다. 무한 루프에 빠지겟죠?.
앱 설정 또는 단말 문제 이기 때문에 유저에게 에러 알림만 표시 되야 합니다. (사용자 엑션에 의해 재시도 해야 합니다.)
가이드 코드 자세하게 주석 달아 봤어요. 궁금한 점 있으면 알려주세요
// 단말에 토큰이 있는지 검사
if (AuthApiClient.instance.hasToken()) {
// 서버에 유효한 AccessToken이 있는지 가져옴
UserApiClient.instance.accessTokenInfo { _, error ->
// 현재 유효한 AccessToken 이 없음
// AccessToken이 만료 된것 이라면 SDK 내부에서 AccessToken을 갱신 합니다.
if (error != null) {
if (error is KakaoSdkError && error.isInvalidTokenError() == true) {
// AccessToken 갱신 까지 실패 한 것이기 때문에 RefreshToken이 유효하지 않음, 로그인 시도
}
else {
//기타 에러
}
}
else {
//AccessToken 유효성 체크 성공(필요 시 SDK 내부에서 AccessToken 갱신됨)
}
}
}
else {
// 단말에 토큰이 없으니 로그인 시도
}
1개의 좋아요
서버 로그를 계속 확인해봤는데 저희쪽에서어떻게 로그인을 구현했는지 정확히 알기가 어려워서 정확한 원인 파악이 안되고 있는 상황입니다.
로그인 관련 코드 전부를 첨부해주실 수 있으실까요?
댓글로 코드 첨부 부탁드립니다.
혹시나 코드가 오픈되는게 부담스러우시다면 저에게 쪽지로 코드를 보내주시면 이슈를 파악하는데 좀 더 수월할 것 같아요
안녕하세요. 제 앱에서 로그인 버튼으로 로그인하는 코드를 공유합니다.
(여기 질문의 처음 부분에 올렸던 코드는 앱 처음 실행시 자동 로그인이 진행될 때 타는 코드라 아래 코드와 좀 다릅니다)
로그인이 안되는 사용자분께 카카오 로그인 버튼을 눌렀을 때 어떤 에러 메시지가 뜨냐고 조금 전에 물어보니
버튼을 눌렀을 때는 아래의 사진이 나오며 '계속하기’를 눌러도 로그인 화면으로 돌아가고 아무런 에러 메시지가 안뜬다고 합니다.
그래서 제가 지금 의심되는 것은 UserApiClient.getInstance().loginWithKakaoAccount() 함수의 콜백에서
error와 token 모두 null 값이 오는 게 아닌가 싶기도 합니다. 그러면 아무런 동작도 하지 않거든요. 아니면 제가 작성한 proceedKakaoLogin() 함수에서 //공가 내부 로그인 진행 코드 생략 주석으로 표시한 부분에서 문제가 있을 수도 있습니다. 아차… proceedKakaoLogin() 함수의 UserApiClient.getInstance().me 콜백에서도 user와 error가 모두 null이면 아무런 에러가 뜨지 않습니다.
정확히 어느 부분에서 문제가 되는지 알기 위해 의심되는 부분에 로그를 추가하고 플레이스토어에 심사를 올린 상태입니다. 저녁에 아마 릴리즈 될 것 같은데 그때 사용자분께 다시 다운로드 받아서 정확히 어느 부분에서 문제가 생기는지 파악하려고 합니다.
1.버튼을 눌려 로그인 진행 코드
simple_kakao_login_btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
//[S]카카오계정으로 로그인
UserApiClient.getInstance().loginWithKakaoAccount(getApplicationContext(), (token, error) → {
if (error != null) {
//[S] 에러 메세지 보여주기
//에러 관련 dialog 보여주는 코드 생략함
//[E] 에러 메세지 보여주기
}
else if (token != null) {
proceedKakaoLogin();
}
return null;
});
//[E]카카오계정으로 로그인
}
});
2.proceekKakaoLogin()함수
//카카오 서버와 로그인 성공 후 공가에서 다음 단계 진행하는 함수
private void proceedKakaoLogin() {
gonggaLog("LoginActivity: proceedKakaoLogin");
UserApiClient.getInstance().me((user, error) -> {
if (error != null) {
Toast.makeText(LoginActivity.this, "사용자 정보 요청 실패: " + error.getLocalizedMessage(), Toast.LENGTH_LONG).show();
}
else if (user != null) {
//공가 내부 로그인 진행 코드 생략
}
return null;
});
}
처음에 말씀하신 이슈와 댓글로 남겨주신 '계속하기’를 눌렀을 때 로그인 화면으로 다시 돌아가는 이슈는 다른 이슈로 판단됩니다.
우선 처음에 말씀하신 ‘토큰 정보를 가져오지 못하는 이슈’ 의 경우에는 서버 로그와 댓글에 남겨주신 코드 및 설명을 참고했을 때, 자동 로그인을 사용하는 사용자가 오랫동안 앱을 실행하지 않아서 리프레시 토큰이 만료된 상태에서 자동 로그인을 시도하기 때문에 발생하는 이슈인 것으로 파악됩니다.
따라서 해당 이슈의 경우에는 저희가 안내한 가이드 코드를 참고하셔서 자동 로그인 로직에서 토큰을 갱신하면 해결될 것으로 보입니다.
그리고 댓글로 남겨주신 '계속하기’를 눌렀을 때 로그인 화면으로 다시 돌아가는 이슈의 경우는 아직 정확한 원인을 파악하지 못해서 앱에 남기신 카카오 sdk 로그를 첨부해주시면 확인 후 답변 드리겠습니다.
안녕하세요.
알려주신대로 토큰 로직도 고치고 제 앱 서버에서 의심되는 부분도 고치고 하니
지금은 사용자분이 드디어 잘 된다고 합니다. ㅜㅜ
문제가 1개가 아니었던 것 같습니다.
정확한 원인을 찾고 싶었는데
제 카카오 계정으로는 재현이 되지 않아 이것저것 수정하다보니 해결이 됐습니다.
감사합니다.
1개의 좋아요