Android · Firebase Auth · Naver Login
NaverIdLoginSDK에서 NidOAuth로 네이버 로그인 연동 수정하기
네이버 OAuth SDK 5.11.2 기준으로 deprecated 된 NaverIdLoginSDK 사용 코드를 NidOAuth 기반 호출로 교체하고, access token 검증 로직을 추가한 작업 내용을 정리한다.
수정 배경
프로젝트 빌드 과정에서 네이버 로그인 연동부에 대해 다음과 같은 deprecation warning이 발생했다. 핵심은 NaverIdLoginSDK 클래스와 그 하위 메서드들이 이후 버전에서 제거될 예정이며, 새 API인 NidOAuth를 사용해야 한다는 점이다.
w: 'object NaverIdLoginSDK : Any' is deprecated.
This class will be removed from v6.1.0. Use NidOAuth instead.
w: 'fun getAccessToken(): String?' is deprecated.
Use NidOAuth.getAccessToken instead.
w: 'fun initialize(...)' is deprecated.
Use NidOAuth.initialize(...) instead.
w: 'fun authenticate(...)' is deprecated.
Use NidOAuth.requestLogin(...) instead.기존 코드는 동작은 가능하지만, SDK 6.1.0 이후에는 제거될 수 있는 wrapper API에 의존하고 있었다. 따라서 네이버 SDK가 안내하는 대체 객체인 NidOAuth로 직접 호출하도록 변경했다.
Import 교체
가장 먼저 import 대상을 교체했다. 기존에는 deprecated wrapper인 com.navercorp.nid.NaverIdLoginSDK를 import하고 있었다.
변경 전
import com.navercorp.nid.NaverIdLoginSDK변경 후
import com.navercorp.nid.NidOAuthNaverIdLoginSDK는 내부적으로 NidOAuth를 감싼 deprecated wrapper다. 따라서 기능을 새로 구현한 것이 아니라, 같은 SDK의 최신 권장 진입점으로 호출 대상을 옮긴 것이다.
API 교체 매핑
이번 수정에서 바뀐 네이버 로그인 API 호출은 다음과 같다.
| 구분 | 변경 전 | 변경 후 |
|---|---|---|
| SDK 초기화 | NaverIdLoginSDK.initialize(...) |
NidOAuth.initialize(...) |
| 로그인 요청 | NaverIdLoginSDK.authenticate(...) |
NidOAuth.requestLogin(...) |
| access token 조회 | NaverIdLoginSDK.getAccessToken() |
NidOAuth.getAccessToken() |
| 마지막 오류 코드 조회 | NaverIdLoginSDK.getLastErrorCode() |
NidOAuth.getLastErrorCode() |
| 마지막 오류 설명 조회 | NaverIdLoginSDK.getLastErrorDescription() |
NidOAuth.getLastErrorDescription() |
로그인 요청 코드 비교
네이버 로그인 시작 함수인 doNaverLogin()은 초기화와 로그인 요청을 순서대로 수행한다. 기존 코드에서는 두 단계 모두 NaverIdLoginSDK를 통해 호출했다.
변경 전
private fun doNaverLogin() {
NaverIdLoginSDK.initialize(
this@MainActivity,
BuildConfig.NAVER_CLIENT,
BuildConfig.NAVER_CLIENT_SECRET,
BuildConfig.APPLICATION_ID
)
NaverIdLoginSDK.authenticate(this@MainActivity, naverLauncher)
}변경 후
private fun doNaverLogin() {
NidOAuth.initialize(
this@MainActivity,
BuildConfig.NAVER_CLIENT,
BuildConfig.NAVER_CLIENT_SECRET,
BuildConfig.APPLICATION_ID
)
NidOAuth.requestLogin(this@MainActivity, naverLauncher)
}인자로 전달하는 값은 그대로 유지했다. 네이버 클라이언트 ID, 클라이언트 시크릿, 앱 이름 값은 기존과 동일하게 BuildConfig에서 가져온다. 변경된 부분은 호출 객체와 메서드명이다.
로그인 결과 처리 코드 비교
로그인 화면에서 돌아온 뒤, 성공 시 access token을 가져와 Cloud Functions로 전달하고 Firebase custom token을 발급받는 구조는 그대로 유지했다. 다만 token이 비어 있는 경우를 명확히 막았다.
변경 전
private val naverLauncher = registerForActivityResult<Intent, ActivityResult>(
ActivityResultContracts.StartActivityForResult()
) { result ->
when (result.resultCode) {
RESULT_OK -> {
viewModel.isProgressBar.value = true
Log.e("", "accessToken=${NaverIdLoginSDK.getAccessToken()}")
doSigninNaverToken(NaverIdLoginSDK.getAccessToken().toString())
}
RESULT_CANCELED -> {
val errorCode = NaverIdLoginSDK.getLastErrorCode().code
val errorDescription = NaverIdLoginSDK.getLastErrorDescription()
doToastMakeAppend(R.string.titleFailure, "$errorDescription")
}
}
}변경 후
private val naverLauncher = registerForActivityResult<Intent, ActivityResult>(
ActivityResultContracts.StartActivityForResult()
) { result ->
when (result.resultCode) {
RESULT_OK -> {
viewModel.isProgressBar.value = true
val accessToken = NidOAuth.getAccessToken()
Log.e("", "accessToken=$accessToken")
if (accessToken.isNullOrEmpty()) {
viewModel.isProgressBar.value = false
doToastMakeAppend(R.string.titleFailure, "Naver access token is empty.")
return@registerForActivityResult
}
doSigninNaverToken(accessToken)
}
RESULT_CANCELED -> {
val errorCode = NidOAuth.getLastErrorCode().code
val errorDescription = NidOAuth.getLastErrorDescription()
viewModel.isProgressBar.value = false
doToastMakeAppend(R.string.titleFailure, "$errorCode $errorDescription")
}
}
}getAccessToken().toString()을 바로 호출했다. access token이 null이면 문자열 "null"이 서버로 전달될 수 있다. 변경 후에는 isNullOrEmpty()로 검증한 뒤에만 doSigninNaverToken(accessToken)을 호출한다.
Firebase 로그인 흐름은 유지
이번 수정은 네이버 SDK 호출부를 최신 API로 교체한 작업이다. Firebase Auth와 연동되는 큰 흐름은 바꾸지 않았다.
- 네이버 OAuth 로그인 요청
- 네이버 access token 획득
- Cloud Functions에 access token 전달
- 서버에서 Firebase custom token 발급
auth.signInWithCustomToken(...)으로 Firebase 로그인
즉, 인증 서버 연동 방식이나 Firebase custom token 처리 방식은 그대로 두고, Android 클라이언트의 네이버 SDK 진입점만 교체했다.
최종 적용 코드
현재 적용된 네이버 로그인 관련 핵심 코드는 다음과 같다.
import com.navercorp.nid.NidOAuth
private val naverLauncher = registerForActivityResult<Intent, ActivityResult>(
ActivityResultContracts.StartActivityForResult()
) { result ->
when (result.resultCode) {
RESULT_OK -> {
viewModel.isProgressBar.value = true
val accessToken = NidOAuth.getAccessToken()
Log.e("", "accessToken=$accessToken")
if (accessToken.isNullOrEmpty()) {
viewModel.isProgressBar.value = false
doToastMakeAppend(R.string.titleFailure, "Naver access token is empty.")
return@registerForActivityResult
}
doSigninNaverToken(accessToken)
}
RESULT_CANCELED -> {
val errorCode = NidOAuth.getLastErrorCode().code
val errorDescription = NidOAuth.getLastErrorDescription()
viewModel.isProgressBar.value = false
doToastMakeAppend(R.string.titleFailure, "$errorCode $errorDescription")
}
}
}
private fun doNaverLogin() {
NidOAuth.initialize(
this@MainActivity,
BuildConfig.NAVER_CLIENT,
BuildConfig.NAVER_CLIENT_SECRET,
BuildConfig.APPLICATION_ID
)
NidOAuth.requestLogin(this@MainActivity, naverLauncher)
}빌드 검증 결과
수정 후 assembleDebug 빌드를 실행해 컴파일을 확인했다.
.\gradlew.bat assembleDebug
BUILD SUCCESSFUL기존에 발생하던 NaverIdLoginSDK 관련 deprecation warning은 제거됐다. 남아 있는 warning은 Locale, updateConfiguration, GsonBuilder.setLenient, AGP/Gradle 설정 관련 기존 경고로 이번 네이버 로그인 수정 범위와는 별개다.
정리
이번 변경의 핵심은 deprecated wrapper인 NaverIdLoginSDK를 제거하고, SDK가 권장하는 NidOAuth를 직접 사용하도록 바꾼 것이다. 기능 흐름은 유지하면서 향후 SDK 6.1.0 이후 제거될 API에 대한 의존성을 줄였고, access token이 비어 있을 때 서버 요청이 발생하지 않도록 방어 로직도 추가했다.
댓글 없음:
댓글 쓰기