티스토리 뷰

Android

네이버 아이디 로그인 API를 사용해보자

갈치참치꽁치멸치 2018. 8. 8. 02:20

네이버 아이디로 로그인 하기 위해서는 우선 developers.naver.com 에 가서 오픈 API를 신청해야 한다.


오픈 API를 신청하고 나면 아래와 같은 화면이 나타난다.


이후 현재 버전(작성 당시 4.2.0)에 맞는 sdk 파일을 https://developers.naver.com/docs/login/sdks/ 에서 다운 받는다. 


이후 .aar 파일을 libs/에 넣고 gradle에 추가해준다.


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

implementation files('libs/naveridlogin_android_sdk_4.2.0.aar') implementation 'com.android.support:appcompat-v7:25.3.1' implementation 'com.android.support:support-core-utils:25.3.1' implementation 'com.android.support:customtabs:25.3.1' implementation 'com.android.support:support-v4:25.3.1'


네이버 가이드에는 25.3.1 버전으로 되어있는데 필자가 라이브러리를 사용할 때는 26.1.0 버전으로 작업하라고 되어있어서

appcompat, core-utils, customtabs, support-v4를 모두 26.1.0 버전으로 맞추어 주었다.


이후 빌드를 할 때 여러개의 라이브러리들을 참조하면 README.md 파일이 OS 기준에서 여러개 있다고 발생할 수도 있는데,

.jar, .aar 등의 파일 확장자를 .zip으로 바꾸게되면 압축파일의 형식으로 바뀌어 내부를 볼 수 있으니 하나씩 속으로 들어가서 README.md파일을 지우도록하자.


필자는 네이버에서 직접 제공하는 버튼을 사용하지 않고 나중에 Image를 삽입할 예정이었으므로 ImageButton을 이용하였다.

따라서 네이버에서 제공하는 버튼의 방식을 설명하지 않고 ImageButton에 적용하는 방식으로 설명하겠다.


public static OAuthLogin mOAuthLoginModule;
ImageButton naverButton;


클래스 내부에 로그인에 필요한 모듈과 View에서 버튼을 가져온다.


이후 로그인에 사용될 모듈을 초기화한다.


mOAuthLoginModule = OAuthLogin.getInstance();
mOAuthLoginModule.init(
LoginActivity.this,
"clientId",
"clientSecret",
"clientName"
);

API 신청 후 첫 화면에서 나오는 Client ID와 ClientSecret, clientName을 각각 해당 "" 안에 적어준다.

알맞게 적어주지 않는다면 로그인 버튼을 클릭하였을 때 errorCode: invalid request 가 발생하게 된다.


네이버 개발자 센터에서 보면 핸들러의 선언을 아래와 같이 해놓았는데,


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);
                   mOauthAT.setText(accessToken);
                   mOauthRT.setText(refreshToken);
                   mOauthExpires.setText(String.valueOf(expiresAt));
                   mOauthTokenType.setText(tokenType);
                   mOAuthState.setText(mOAuthLoginModule.getState(mContext).toString());
             } else {
                   String errorCode = mOAuthLoginModule.getLastErrorCode(mContext).getCode();
                   String errorDesc = mOAuthLoginModule.getLastErrorDesc(mContext);
                   Toast.makeText(mContext, "errorCode:" + errorCode
                         + ", errorDesc:" + errorDesc, Toast.LENGTH_SHORT).show();
             }
      };
};

mOAuthLoginModule.startOauthLoginActivity(mContext, mOAuthLoginHandler);



안드로이드 스튜디오에서는 handler leak이 발생할 수 있다고 경고한다.


handler leak 즉 memory leak(메모리 누수)가 발생하는 이유는 위와같이 핸들러를 작성하여 실행을 하게 되면 핸들러는 Thread의 MessageQueue에 Looper에 의해 지속적으로 들어가 GC에 의해 사라지지 않기 때문이다.

이러한 문제가 발생하게 되면 액티비티를 finish() 했음에도 불구하고 MessageQueue에 핸들러가 남아있어 액티비티가 소멸되지 않는 결과를 초래할 수 있다.

handler는 한 위치에 종속되면 안되기 때문에 static을 이용하고, WeakReference를 이용하여 문제를 해결한다.


WeakReference란 GC가 발생하면 무조건 회수 되므로 어느 한 곳에 종속되지 않는 속성의 변수로 처리 될 수 있다.

(StrongReference도 존재하는데 StrongReference의 경우 GC에 의해 사라지지 않는다. 예시로 new 로 선언된 객체들..)


해당 문제를 해결하기 위해 static을 이용하여 handler 클래스를 만들었다.

private OAuthLoginHandler mOAuthLoginHandler = new NaverLoginHandler(this);

private static class NaverLoginHandler extends OAuthLoginHandler {
private final WeakReference<LoginActivity> mActivity;

public NaverLoginHandler(LoginActivity activity) {
mActivity = new WeakReference<LoginActivity>(activity);
}


@Override
public void run(boolean success) {
LoginActivity activity = mActivity.get();

if (success) {
String accessToken = mOAuthLoginModule.getAccessToken(activity);
String refreshToken = mOAuthLoginModule.getRefreshToken(activity);
long expiresAt = mOAuthLoginModule.getExpiresAt(activity);
String tokenType = mOAuthLoginModule.getTokenType(activity);
} else {
String errorCode = mOAuthLoginModule.getLastErrorCode(activity).getCode();
String errorDesc = mOAuthLoginModule.getLastErrorDesc(activity);
Toast.makeText(activity, "errorCode:" + errorCode
+ ", errorDesc:" + errorDesc, Toast.LENGTH_SHORT).show();
}
}
}

위와 같이 핸들러 클래스를 내부 클래스로 정의하고 사용하게 되면 해당 경고는 사라지는 것을 알 수 있다.


최종적으로

naverButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mOAuthLoginModule.startOauthLoginActivity(LoginActivity.this, mOAuthLoginHandler);
}
});

처음에 만들어둔 ImageButton에 OnClickListener를 달아주고, 만들어준 핸들러를 이용하여 동작할 수 있게 해준다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함