본문 바로가기
Android

Android Kotiln(코틀린) 네이버 아이디 로그인하기 ( 안드로이드 12 이슈 대응 포함)

by 일용직 코딩노동자 2022. 1. 3.
728x90
반응형

기본 개발자사이트에서 등록하는 과정은

 

https://onedaycodeing.tistory.com/121

 

안드로이드 네이버 로그인 예제

developers.naver.com/main/ NAVER Developers 네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단

onedaycodeing.tistory.com

해당 게시글을 참조해주세요. (해당글은 자바로 작성된 예제입니다 코드부분은 이쪽 게시물을 봐주세요)

 

우선 검수가 끝나야 정식 서비스가 가능하지만

개발 과정에서는 맴버관리를 통해 테스트 아이디를 등록 할 수 있습니다.

 

https://developers.naver.com/main/

 

NAVER Developers

네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음

developers.naver.com

네이버 개발자 사이트에서 로그인을 하신 후

 

내 애플리케이션에 들어가셔서

 

왼쪽에 등록해둔 애플리케이션 리스트가있습니다.

 

클릭해보시면

 

맴버관리라는 탭이 보입니다.

 

여기서 테스트에 진행 할 네이버 아이디를 등록해주시면 검수전에는 개발로 테스트가 가능합니다.

 

----------------------------------------------------------------------------------------------------------------------

 

여기까지 완료하신 분은 이제 소스코드를 참조할게요.

 

implementation 'com.naver.nid:naveridlogin-android-sdk:4.2.6'

그래들에 의존성 추가 해주시구요.

 

저는 NaverLogin 이라는 클래스를 우선 하나 만들었습니다.

 

class NaverLogin {
    fun get(apiUrl: String, requestHeaders: Map<String, String>): String? {
        val con: HttpURLConnection = connect(apiUrl)
        return try {
            con.setRequestMethod("GET")
            for ((key, value) in requestHeaders) {
                con.setRequestProperty(key, value)
            }
            val responseCode: Int = con.getResponseCode()
            if (responseCode == HttpURLConnection.HTTP_OK) { // 정상 호출
                readBody(con.getInputStream())
            } else { // 에러 발생
                readBody(con.getErrorStream())
            }
        } catch (e: IOException) {
            throw RuntimeException("API 요청과 응답 실패", e)
        } finally {
            con.disconnect()
        }
    }

    fun connect(apiUrl: String): HttpURLConnection {
        return try {
            val url: URL = URL(apiUrl)
            url.openConnection() as HttpURLConnection
        } catch (e: MalformedURLException) {
            throw RuntimeException("API URL이 잘못되었습니다. : $apiUrl", e)
        } catch (e: IOException) {
            throw RuntimeException("연결이 실패했습니다. : $apiUrl", e)
        }
    }

    fun readBody(body: InputStream): String? {
        val streamReader = InputStreamReader(body)
        try {
            BufferedReader(streamReader).use { lineReader ->
                val responseBody = StringBuilder()
                var line: String?
                while (lineReader.readLine().also { line = it } != null) {
                    responseBody.append(line)
                }
                return responseBody.toString()
            }
        } catch (e: IOException) {
            throw RuntimeException("API 응답을 읽는데 실패했습니다.", e)
        }
    }
}

네이버와 통신하기위한 기본 셋팅입니다.

 

그리고 xml에

 

<com.nhn.android.naverlogin.ui.view.OAuthLoginButton
    android:id="@+id/buttonOAuthLoginImg"
    android:src="@mipmap/login_na1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
</com.nhn.android.naverlogin.ui.view.OAuthLoginButton>

네이버 버튼을 만들었습니다.

 

src는 제가 사용했던 네이버 아이디 로그인하기 이미지 입니다. 필요하신 이미지로 쓰시면 될것같습니다. (없어도되요!)

 

이제 로그인 진행 할 부분에서 

 

fun naverLogin() {
	var mOAuthLoginButton: OAuthLoginButton? = null
    mOAuthLoginButton = findViewById(R.id.buttonOAuthLoginImg)
    var mOAuthLoginInstance = OAuthLogin.getInstance()

    mOAuthLoginInstance.init(this, OAUTH_CLIENT_ID, OAUTH_CLIENT_SECRET, OAUTH_CLIENT_NAME)

    val mOAuthLoginHandler: OAuthLoginHandler = object : OAuthLoginHandler() {
        override fun run(success: Boolean) {
            if(success){
                val accessToken = mOAuthLoginInstance.getAccessToken(applicationContext)

                Thread {
                    val header = "Bearer $accessToken"
                    val requestHeaders: MutableMap<String, String> = HashMap()
                    requestHeaders["Authorization"] = header
                    val apiURL = "https://openapi.naver.com/v1/nid/me" //엑세스 토큰으로 유저정보를 받아올 주소
                    val responseBody: String = NaverLogin().get(apiURL, requestHeaders).toString()
                    Log.d(TAG, responseBody) //주소로 얻은 유저정보 (제이슨)
                    naverLoginParser(responseBody)
                }.start()
            }
            else {
                val errorCode = mOAuthLoginInstance.getLastErrorCode(getApplicationContext()).getCode();
                val errorDesc = mOAuthLoginInstance.getLastErrorDesc(getApplicationContext());
                Toast.makeText(getApplicationContext(), "errorCode:" + errorCode + ", errorDesc:" + errorDesc, Toast.LENGTH_SHORT).show();
            }
        }
    }
    mOAuthLoginButton!!.setOAuthLoginHandler(mOAuthLoginHandler)
}

이렇게 셋팅해주시면 됩니다.

 

Client ID , Client Secret 값은 네이버 개발자 사이트에서 확인 가능합니다! (개요 탭에 있으니 참고하시면 됩니다)

 

그리고 해당 함수를 onCreate 시작 시 호출해주세요.

 

그리고 naverLoginParser에서 에러나시는 분들은

 

fun naverLoginParser(msg: String) {

    val jsonParser = JSONParser()

        val jsonObject = jsonParser.parse(msg) as org.json.simple.JSONObject

        val resultCode = jsonObject.get("resultcode").toString()
        val message = jsonObject.get("message").toString()

        val resultJson = jsonParser.parse(jsonObject.get("response").toString()) as org.json.simple.JSONObject

        if (resultCode == "00") {
            if (message == "success") {
                val email = resultJson.get("email").toString()
                val id = resultJson.get("id").toString()
                val nickName = resultJson.get("nickname").toString()
                val birthday = resultJson.get("birthday").toString()
                val birthyear = resultJson.get("birthyear").toString()
                val profile = resultJson.get("profile_image").toString()

                Log.d(TAG, id)
                Log.d(TAG, nickName)
                Log.d(TAG, birthday)
                Log.d(TAG, email)
                Log.d(TAG, birthyear)
                Log.d(TAG, profile)
            }
            else{
                Toast.makeText(applicationContext,"네이버 로그인에 실패했습니다.",Toast.LENGTH_SHORT).show()
            }
        }
        else {
            Toast.makeText(applicationContext,"네이버 로그인에 실패했습니다.",Toast.LENGTH_SHORT).show()
        }
}

여기 함수가 있습니다!

 

로그아웃 같은경우에는

 

mOAuthLoginInstance.logout(applicationContext)

해당 코드로 가능하니 참고하시면 됩니다.

 

자 여기서 빌드를 딱 하면 이제 안드로이드(android)12를 타겟팅 하시는 분들은 에러가 납니다.

 

그 이유는

 

https://onedaycodeing.tistory.com/158

 

안드로이드 12 타겟팅 시 필수 메니페스트 설정

Activity(엑티비티) 속성에 항상 android:exported="false" android:exported="true" 둘 중 하나의 설정을 꼭 해주셔야합니다. true면 외부에서 접근 허용 false면 접근 불가

onedaycodeing.tistory.com

 

해당 이슈 때문인데요 네이버쪽에 이게 안되있습니다 ㅠㅠ

 

메니페스트에 

 

<activity android:name="com.nhn.android.naverlogin.ui.OAuthCustomTabActivity"
    android:exported="true">

이렇게 따로 등록을 해주셔야합니다... 이렇게 해주시면 빌드까지 성공입니다.

 

ㄱ ㅏ   ㄱ  푸시

ㅗ o    ㅗ  푸시 :D

728x90
반응형

댓글