본문 바로가기

Android/개념 및 예제

[Android] 네이버 로그인을 안드로이드 앱에 연동하기

이번에는 안드로이드용 네아로(네이버 아이디로 로그인) 연동하는 법에 대해 알아보겠습니다.

 

 

 

 

 

네이버 아이디로 로그인 구현하는 방법은 네이버 개발 문서에 자세히 나와있습니다.

하지만 개발 문서에 부족한 부분이 있다고 (오픈 API 호출 부분에 url 값이 무엇인지? 등등) 생각이 들어서 보완해서 다루겠습니다.

 

developers.naver.com/docs/login/android/

 

네이버아이디로로그인 안드로이드 개발가이드

NAVER Developers - 네이버아이디로로그인 안드로이드 개발가이드

developers.naver.com

 

1. 애플리케이션 등록하기

  • open API 등록 신청을 통해 안드로이드 앱을 등록합니다.
  • 사용 애플리케이션은 네아로만 사용할 것이므로 '선택하시오' 메뉴는 선택하지 않습니다.
  • 가져올 네이버 사용자 정보를 선택합니다.

필수로 가져오시려면 나중에 네이버 검수를 받을 때 왜 필요한지 설명해야 합니다.

그러므로 필수로 가져오는 정보를 최소한으로 하는 것이 좋습니다. (반려 당하면 다시 검수 요청을 해야 합니다.)

** TMI : 저는 반려당한 적이 있습니다. (검수 요청한 지 4일 만에 응답해주셨어요^^)

  • 환경 추가를 '안드로이드'로 선택합니다.
  • 다운로드 URL을 보시면 네이버 사전 url을 넣었는데요.

나중에 앱이 출시되고 플레이스토어에서 검색이 가능할 때 다운로드 URL을 바꿔주셔야 합니다.

  • 등록하기를 클릭해 앱을 등록합니다.

다음과 같이 등록한 앱의 정보를 확인할 수 있습니다.

 

 

2. 라이브러리 설정

build.gradle(Module.app)

 //네이버 로그인
implementation 'com.naver.nid:naveridlogin-android-sdk:4.2.6'

 

3. 초기화

네이버 아이디로 로그인 인스턴스를 초기화합니다.

mOAuthLoginModule = OAuthLogin.getInstance();
        mOAuthLoginModule.init(
                LoginActivity.this
                ,getString(R.string.naver_client_id)
                ,getString(R.string.naver_client_secret)
                ,getString(R.string.app_name)

);
  • OAUTH_CLIENT_ID: 애플리케이션 등록 후 발급받은 클라이언트 아이디
  • OAUTH_CLIENT_SECRET: 애플리케이션 등록 후 발급받은 클라이언트 시크릿
  • OAUTH_CLIENT_NAME: 네이버 앱의 로그인 화면에 표시할 애플리케이션 이름. 모바일 웹의 로그인 화면을 사용할 때는 서버에 저장된 애플리케이션 이름이 표시됩니다.

3-1. app/res/values/strings.xml

아까 받아온 clientId와 clientSecret, 애플리케이션 이름을 넣어줍니다.

<string name="naver_client_id">xxx</string>
<string name="naver_client_secret">xxx</string>
<string name="naver_client_name">xxx</string>

 

 

4. 로그인

로그인은 두 가지 방법으로 구현합니다. 첫 번째는 OAuthLoginButton 객체로 네이버 아이디로 로그인 버튼을 레이아웃에 추가하는 방법이고, 두 번째는 OAuthLogin.startOAuthLoginActivity() 메서드를 직접 실행하는 방법입니다.

저는 두 번째 방법으로 구현할 예정입니다.

 

4.1 로그인 창에서 로그인이 완료되거나 취소되는 이벤트를 받을 OAuthLoginHandler 설정

private OAuthLoginHandler mOAuthLoginHandler = new OAuthLoginHandler() {
        @Override
        public void run(boolean success) {
            if (success) {
                String accessToken = mOAuthLoginModule.getAccessToken(mContext);
                String refreshToken = mOAuthLoginModule.getRefreshToken(mContext);
                long expiresAt = mOAuthLoginModule.getExpiresAt(mContext);
                String tokenType = mOAuthLoginModule.getTokenType(mContext);
                new RequestApiTask(mContext, mOAuthLoginModule).execute();
            } else {
                String errorCode = mOAuthLoginModule.getLastErrorCode(mContext).getCode();
                String errorDesc = mOAuthLoginModule.getLastErrorDesc(mContext);
                Toast.makeText(mContext, "errorCode:" + errorCode
                        + ", errorDesc:" + errorDesc, Toast.LENGTH_SHORT).show();
            }
        }
    };

 

4.2 로그인 시도

private void naverLogin() {
        mOAuthLoginModule.startOauthLoginActivity(LoginActivity.this, mOAuthLoginHandler);
}

 

4.3 오픈 API 호출

네이버 서버와 통신을 통해 사용자의 정보를 가져옵니다.

 

다음은 네이버 개발 문서에 오픈 API 호출에 관해 명시된 코드입니다.

???!! 한 줄이 끝입니다.

 

mOAuthLoginModule.requestApi(mContext, accessToken, url);

 

개인적으로 네이버 공식 문서에서 아쉬웠던 부분

1. 네이버 서버로 요청하다보니 비동기적으로 서버에 요청했어야 하는데 해당하는 코드를 다음과 같이 한 줄로 나타냈습니다. (아마 개발자들이 알아서 할 수 있을 거라 생각한 듯합니다.)

2. 요청할 서버 url도 없었습니다. (찾아보면 있을 거 같긴 한데 튜토리얼/Android에선 찾지 못했습니다.)

3. 응답 값 파싱 하는 부분 

응답 값에 대해서는 네이버 개발 문서가 아닌 postman을 사용해 응답 값 구조에 대해서 알 수 있었습니다.^^

그래도 다른 부분은 자세히 설명해주셔서 네이버 개발자 분에게 감사했습니다.

 

다음 코드는 오픈 API 호출할 때 위 세 가지 아쉬운 사항을 보완한 내용입니다.

public static class RequestApiTask extends AsyncTask<Void, Void, String> {
        private final Context mContext;
        private final OAuthLogin mOAuthLoginModule;
        public RequestApiTask(Context mContext, OAuthLogin mOAuthLoginModule) {
            this.mContext = mContext;
            this.mOAuthLoginModule = mOAuthLoginModule;
        }

        @Override
        protected void onPreExecute() {}

        @Override
        protected String doInBackground(Void... params) {
            String url = "https://openapi.naver.com/v1/nid/me";
            String at = mOAuthLoginModule.getAccessToken(mContext);
            return mOAuthLoginModule.requestApi(mContext, at, url);
        }

        protected void onPostExecute(String content) {
            try {
                JSONObject loginResult = new JSONObject(content);
                if (loginResult.getString("resultcode").equals("00")){
                    JSONObject response = loginResult.getJSONObject("response");
                    String id = response.getString("id");
                    String email = response.getString("email");
                    Toast.makeText(mContext, "id : "+id +" email : "+email, Toast.LENGTH_SHORT).show();
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
 }

 

4.4 로그인, 사용자 정보 가져오는지 확인


여기까지 마무리하면

다음과 같은 로그인 화면 시도 화면이 나오고, 사용자의 정보를 잘 가져옵니다.

 

좌 - 로그인 시도 중, 우 - 로그인 성공

 

 

 

 

5. 로그아웃

애플리케이션에서 로그아웃할 때는 다음과 같이 OAuthLogin.logout() 메서드를 호출합니다.

OAuthLogin.logout() 메서드가 호출되면 클라이언트에 저장된 토큰이 삭제되고 OAuthLogin.getState() 메서드가 OAuthLoginState.NEED_LOGIN 값을 반환합니다.

 private void logout() {
        if (mOAuthLoginModule!=null){
            mOAuthLoginModule.logout(getApplicationContext());
            Toast.makeText(mContext, "로그아웃 하셨습니다." , Toast.LENGTH_SHORT).show();
            new DeleteTokenTask(mContext, mOAuthLoginModule).execute();
        }
}


6. 연동 해제

OAuthLogin.logoutAndDeleteToken() 메서드로 구현합니다. 연동을 해제하면 클라이언트에 저장된 토큰과 서버에 저장된 토큰이 모두 삭제됩니다.

public static class DeleteTokenTask extends AsyncTask<Void, Void, Boolean> {
        private final Context mContext;
        private final OAuthLogin mOAuthLoginModule;
        public DeleteTokenTask(Context mContext, OAuthLogin mOAuthLoginModule) {
            this.mContext = mContext;
            this.mOAuthLoginModule = mOAuthLoginModule;
        }
        @Override
        protected Boolean doInBackground(Void... params) {
            boolean isSuccessDeleteToken = mOAuthLoginModule.logoutAndDeleteToken(mContext);

            if (!isSuccessDeleteToken) {
                // 서버에서 토큰 삭제에 실패했어도 클라이언트에 있는 토큰은 삭제되어 로그아웃된 상태입니다.
                // 클라이언트에 토큰 정보가 없기 때문에 추가로 처리할 수 있는 작업은 없습니다.
                Log.d(TAG, "errorCode:" + mOAuthLoginModule.getLastErrorCode(mContext));
                Log.d(TAG, "errorDesc:" + mOAuthLoginModule.getLastErrorDesc(mContext));
            }

            return isSuccessDeleteToken;
        }

        protected void onPostExecute(boolean isSuccessDeleteToken) {
        }
}	

이상으로 안드로이드 네이버 아이디 로그인 연동에 대한 포스팅을 마치겠습니다.