이전에 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("로그아웃 실패")
}
})
}
}
}