네이버 네아로 로그인시 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)
        }
    }
})