[Android] 네이버 로그인

Sdoubleu·5일 전
0

Android

목록 보기
18/19
post-thumbnail

이전에 SNS 로그인 관련해서 다룬 적이 있다
그 중에 네이버 로그인만 따로 추가로 다뤄볼 예정인데
그 이유는 기존 코드로 진행하게 됐을 때 네이버 로그인같은 경우
한 번 로그인을 했을 때 수동으로 로그아웃을 하지 않는 이상 한 번 로그인한 아이디로 계속 로그인이 되는 현상이 발생했기 때문이다


처음 접속 후 로그인을 시도했을 때 사진과 같이 동의 항목이 뜨면서
우측 상단의 닉네임을 클릭하여 다른 아이디로 로그인할 수 있는 방법이 있다

그러나 앱을 로그아웃하지 않고 그대로 끄고 다시 접속 했을 때 네이버 로그인을 했을 때 기존의 아이디로 로그인이 되기 때문에 다른 아이디로 로그인을 하려면 번거로울 수 있다

그래서 생각해낸 방법이

// Custom Tabs를 활용한 OAuth에서 재인증 수행 여부를 결정한다.
NaverIdLoginSDK.isRequiredCustomTabsReAuth = true

를 추가하는 것이다

다음과 같은 코드를 추가한다면

네이버 아이디를 직접 입력하여 로그인하거나 기기에 네이버 앱이 있다면 간편하게 로그인할 수 있다

본인이 현재 진행하고 있는 프로젝트가 어떤 기획이냐에 따라 수정하면 될 것 같다


전체 코드

class NaverLoginDataSourceImpl @Inject constructor(@ApplicationContext val context: Context) :
    SnsLoginDataSource {
    override suspend fun login(): String {
        return suspendCancellableCoroutine {
            val oauthLoginCallback =
                object : OAuthLoginCallback {
                    override fun onError(
                        errorCode: Int,
                        message: String,
                    ) {
                        Log.e("Login-naver", "Error: $message")
                        it.resume("ERROR:$errorCode", {})
                    }

                    override fun onFailure(
                        httpStatus: Int,
                        message: String,
                    ) {
                        val errorCode = NaverIdLoginSDK.getLastErrorCode().code
                        val errorDescription = NaverIdLoginSDK.getLastErrorDescription()
                        Log.e(
                            "Login-naver",
                            "errorCode:$errorCode errorDescription:$errorDescription"
                        )
                        it.resume("FAILURE:$httpStatus MESSAGE:$message", {})
                    }

                    override fun onSuccess() {
                        Log.d("Login-naver", "로그인 성공")
                        it.resume(NaverIdLoginSDK.getAccessToken().toString(), {})
                    }
                }
            CoroutineScope(Dispatchers.Main).launch {
                NaverIdLoginSDK.logout()
                // UI 스레드에서 호출되어야 하는 작업
                NaverIdLoginSDK.isRequiredCustomTabsReAuth = true
                NaverIdLoginSDK.authenticate(context, oauthLoginCallback)
            }
        }
    }

    override suspend fun logout():String {
        return suspendCoroutine { continuation ->
            NidOAuthLogin().callDeleteTokenApi(context, object : OAuthLoginCallback {
                override fun onSuccess() {
                    //서버에서 토큰 삭제에 성공한 상태입니다.
                    continuation.resume("로그아웃")
                }

                override fun onFailure(httpStatus: Int, message: String) {
                    // 서버에서 토큰 삭제에 실패했어도 클라이언트에 있는 토큰은 삭제되어 로그아웃된 상태입니다.
                    // 클라이언트에 토큰 정보가 없기 때문에 추가로 처리할 수 있는 작업은 없습니다.
                    Log.d("naver Logout", "errorCode: ${NaverIdLoginSDK.getLastErrorCode().code}")
                    Log.d("naver Logout", "errorDesc: ${NaverIdLoginSDK.getLastErrorDescription()}")
                    continuation.resume("로그아웃 실패")
                }

                override fun onError(errorCode: Int, message: String) {
                    // 서버에서 토큰 삭제에 실패했어도 클라이언트에 있는 토큰은 삭제되어 로그아웃된 상태입니다.
                    // 클라이언트에 토큰 정보가 없기 때문에 추가로 처리할 수 있는 작업은 없습니다.
                    onFailure(errorCode, message)
                    continuation.resume("로그아웃 실패")
                }
            })
        }
    }
}

앱을 사용해보고 싶다면? 🤭

google Play - Vegan Life

profile
개발자희망자

0개의 댓글