라떼군 이야기
네이버 네아로 로그인시 user_cancel 에러 해결 방법
Problem
네이버 SDK를 이용하여 로그인을 구현할 때 네이버 앱이 설치되있지 않은 경우에서 로그인 후 “user_cancel” 에러가 나오는 경우가 있었다. 재현이 가능한 특정 상황에서 나오는 문제는 아니고 여러번 시도하다보면 가끔 또는 자주 발생하기도 했다. 네이버 개발자 포럼을 찾아보니 이와 같은 어려움을 겪고있는 개발자들(1,2, 3) 이 많았지만 이상하게도 네이버측에서는 답변이 없었다. 여기에서는 확인해보겠다는 답변이 있지만 아직 명확한 해결책은 없는 상황이다. 하지만 게시물을 확인하던 중 아래 내용에 힌트가 있어 구현을 변경해서 해결했다.
OAuthLogin.getInstance().enableWebViewLoginOnly()을 호출해주면 CustomTab을 사용하지 않도록 설정돼서 문제가 발생하지 않아요!
Solution
아이디어는 네이버앱이 설치되있지 않은 경우는 enableWebViewLoginOnly
를 이용해 CustomTab
의 사용을 제한해주고,
앱이 설치되있는 경우는 앱으로만 실행되도록 강제하였다.
oAuthLoginModule?.enableWebViewLoginOnly()
try {
if (packageManager.getApplicationInfo("com.nhn.android.search", 0).enabled) {
oAuthLoginModule?.enableNaverAppLoginOnly()
}
} catch (e: Exception) {
}
oAuthLoginModule?.startOauthLoginActivity(this, @SuppressLint("HandlerLeak")
object : OAuthLoginHandler() {
override fun run(success: Boolean) {
if (success) {
val token = oAuthLoginModule?.getAccessToken(context)
val refreshToken = oAuthLoginModule?.getRefreshToken(context)
val expiresAt = oAuthLoginModule?.getExpiresAt(context)
val tokenType = oAuthLoginModule?.getTokenType(context)
AsyncTask.execute {
val response = oAuthLoginModule?.requestApi(context, token, "https://openapi.naver.com/v1/nid/me")
try {
val responseObject = JSONObject(response)
.optJSONObject("response")
if (responseObject != null) {
val name = responseObject.optString("name")
val email = responseObject.optString("email")
// signin
}
} catch (ignored: Exception) {
// error: naver connection error
}
}
} else {
// error: oAuthLoginModule?.getLastErrorDesc(context)
}
}
})