Android

Android SNS 로그인 (네이버)

Dean83 2022. 3. 24. 23:01

참조 : https://developers.naver.com/docs/login/android/
       : https://stickode.com/detail.html?no=1458

1. 네이버 프로젝트 추가 및 설정
     - https://developers.naver.com/apps/#/register 에서 정보 입력 필요. 
       - 사용 API에서 네아로 선택
       - 로그인 오픈 API 서비스 환경에서 안드로이드 추가
       - 다운로드 URL에 스토어에 올라간 주소 입력 (스토어에 올라가지 않은 상태라면, 회사 홈페이지등으로 설정 후 추후 변경)
       - 안드로이드 앱 패키지 이름 입력
    - 어플리케이션 등록 상세 : https://developers.naver.com/docs/common/openapiguide/appregister.md#%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EB%93%B1%EB%A1%9D

2. SDK 설정
    - app에 있는 build.gradle에 implementation 'com.naver.nid:naveridlogin-android-sdk:4.2.6' 추가 후 sync

3. 개발 - 로그인
     - 버튼 생성 및 버튼의 클릭함수 연동
     - 로그인 초기화 및 통신 콜백 처리 추가
   

OAuthLogin module;

//외부에서 사용할 수 있도록 context를 선언하고, 함수 초기화 하는곳에서 값을 넣어야 함.(서버통신시 필요)
//이 경우 메인액티비티에 있으므로, onCreate 함수 내부에 context = this;를 적어야 함.
public static Context context;



//버튼 클릭과 연결된 함수
//로그인 모듈 초기화 진행
public void onLoginNaverClicked(View view)
    {
        module = OAuthLogin.getInstance();
        module.init(this,"QWCMjSQ8mTpfKaP8eDeU","hFU2Ar07k2","라이브사주");
        module.startOauthLoginActivity(this,handler);
    }

// 로그인 이후 콜백 함수
 private OAuthLoginHandler handler = new OAuthLoginHandler() {
        @Override
        public void run(boolean success) {
            if(success)
            {
                String accessToken = module.getAccessToken(MainActivity.this);
                // 토큰을 가지고, 사용자 프로필 조회를 위한 코드 추가. NaverLoginNetwork는
                // 개발자가 구현해야 하는 클래스.
                NaverLoginNetwork network = new NaverLoginNetwork();
                network.SetToken(accessToken, m_naverCallback);
                network.execute();
            }
            else
            {
                String errorCode = module.getLastErrorCode(MainActivity.this).getCode();
                String errorDesc = module.getLastErrorDesc(MainActivity.this);
                Log.d("haha","error : " + errorDesc + " code : " + errorCode);
            }
        };
    };

    // async 통신 이후 콜백 받기 위한 코드. 이부분은 추후 설명
    private NaverCallback m_naverCallback = new NaverCallback() {
        @Override
        public void loginSuccessCallback(String email) {
            Log.d("haha","email : " + email);
        }

        @Override
        public void loginFailCallback(String error) {
            Log.d("haha","error : " + error);
        }
    };

4. 개발 - 프로필 조회
     
- async로 동작해야 함. Asynctask를 상속받은 클래스를 이용하여, 네이버 requestapi 함수 이용
 

package com.example.pushtest;

import android.app.PendingIntent;
import android.os.AsyncTask;
import android.util.Log;

import com.nhn.android.naverlogin.OAuthLogin;

import org.json.JSONException;
import org.json.JSONObject;

public class NaverLoginNetwork  extends AsyncTask<Void,Void,String> {

    //로그인 성공시 토큰
    private String m_token;
    private NaverCallback m_callback;

    public void SetToken(String token, NaverCallback callback)
    {
        m_token = token;
        m_callback = callback;
    }

    @Override
    protected void onPreExecute()
    {

    }

    //실제 async 통신하는 부분
    @Override
    protected String doInBackground(Void... params) {
        return OAuthLogin.getInstance().requestApi(MainActivity.context, m_token,"https://openapi.naver.com/v1/nid/me");
    }

    //통신 성공시 응답이 이곳으로 리턴됨. email을 추출하는 코드들.
    protected void onPostExecute(String content)
    {
        try {
            JSONObject obj = new JSONObject(content);
            JSONObject response = obj.getJSONObject("response");
            //성공시 호출할 콜백
            m_callback.loginSuccessCallback(response.getString("email"));
        } catch (JSONException e) {
            //실패 콜백 호출
            m_callback.loginFailCallback(e.getMessage());
            e.printStackTrace();
        }
    }
}