Unity

유니티 안드로이드 네이버 로그인 구현 (Unity Android Naver Login)

devkimluxx 2022. 1. 3. 20:23
728x90

https://devkimluxx.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%9B%B9%EB%B7%B0-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8-Unity-Kakao-Login-WebView-Plugin

 

유니티 카카오 로그인 웹뷰 플러그인 (Unity Kakao Login WebView Plugin)

유니티에서 카카오 로그인을 구현하려면, 프로젝트를 export해서 기능을 안드로이드 스튜디오에서 구현하거나, 안드로이드 스튜디오에서 반대로 카카오 로그인 플러그인을 만들어서 유니티 프

devkimluxx.tistory.com

 

네이버 로그인을 안드로이드로 구현한 버전이다. 이전에 작성했던 카카오 로그인과 같은 맥락으로, 안드로이드 스튜디오를 다뤄 aar 플러그인을 직접 만들기 어려운 상황일 때, 유니티에서 C#으로 네이버 로그인을 구현한 예제이다.

 

com.naver.nid.naveridlogin-android-sdk-4.4.1.aar
0.19MB

//사용시 com.naver.nid.naveridlogin-android-sdk-4.4.1.aar 필요함 (다른 버전에서는 작동 미확인)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace NaverLogin
{
    public class NaverLogin : MonoBehaviour
    {
        public static string OAUTH_CLIENT_ID = "";
        public static string OAUTH_CLIENT_SECRET = "";
        public static string OAUTH_CLIENT_NAME = "";
        [SerializeField]
        private string clientId;
        [SerializeField]
        private string clientSecret;
        [SerializeField]
        private string clientName;

        private static AndroidJavaObject oAuthLoginInstance;    //private static OAuthLogin mOAuthLoginInstance;

        public static NaverAuth naverAuth;

        void Start()
        {
            SetClientData();

            InitData();
            StartAuth();

            //↓사용 예제
            //StartCoroutine(GetAuthDelay(null));
        }

        /// <summary>inspector의 id/secret/name 값을 static으로 값 옮김</summary>
        private void SetClientData()
        {
            OAUTH_CLIENT_ID = clientId;
            OAUTH_CLIENT_SECRET = clientSecret;
            OAUTH_CLIENT_NAME = clientName;
        }

        #region INIT

        /// <summary>로그인 인스턴스 초기화</summary>
        private void InitData()
        {
            try
            {
                using (AndroidJavaClass oAuthLogin = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLogin")) //import com.nhn.android.naverlogin.OAuthLogin;
                {
                    using (AndroidJavaClass oAuthLoginHandler = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLoginHandler"))   //import com.nhn.android.naverlogin.OAuthLoginHandler;
                    {
                        //Init Data
                        oAuthLoginInstance = oAuthLogin.CallStatic<AndroidJavaObject>("getInstance"); //mOAuthLoginInstance = OAuthLogin.getInstance();
                        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//context를 가져오기 위함
                        AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");//context를 가져오기 위함
                        oAuthLoginInstance.Call("init", context, OAUTH_CLIENT_ID, OAUTH_CLIENT_SECRET, OAUTH_CLIENT_NAME);  //mOAuthLoginInstance.init(mContext, OAUTH_CLIENT_ID, OAUTH_CLIENT_SECRET, OAUTH_CLIENT_NAME);
                    }
                }
            }
            catch
            {
                Logger.Error("Cannot load com.nhn.android.naverlogin, Check aar plugin exist");
            }
        }

        /// <summary>로그인 시작</summary>
        public static void StartAuth()
        {
            using (AndroidJavaClass oAuthLogin = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLogin")) //import com.nhn.android.naverlogin.OAuthLogin;
            {
                using (AndroidJavaClass oAuthLoginHandler = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLoginHandler"))   //import com.nhn.android.naverlogin.OAuthLoginHandler;
                {
                    AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//context를 가져오기 위함
                    AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");//context를 가져오기 위함
                    AndroidJavaObject mOAuthLoginHander = new AndroidJavaObject("com.nhn.android.naverlogin.OAuthLoginHandler");   //OAuthLoginHandler mOAuthLoginHandler = new OAuthLoginHandler() {

                    oAuthLoginInstance.Call("startOauthLoginActivity", context, mOAuthLoginHander);

                }
            }
        }

        #endregion

        #region GET_AUTH

        ///<summary>accessToken등 정보 가져오기 (로그인 성공 완료 전 가져오면 데이터 비어 있으니 주의할 것)</summary>
        private static NaverAuth GetAuth()
        {
            NaverAuth naverAuth = new NaverAuth();
            using (AndroidJavaClass oAuthLogin = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLogin")) //import com.nhn.android.naverlogin.OAuthLogin;
            {
                using (AndroidJavaClass oAuthLoginHandler = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLoginHandler"))   //import com.nhn.android.naverlogin.OAuthLoginHandler;
                {
                    AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//context를 가져오기 위함
                    AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");//context를 가져오기 위함

                    naverAuth.accessToken = oAuthLoginInstance.Call<string>("getAccessToken", context);
                    naverAuth.refreshToken = oAuthLoginInstance.Call<string>("getRefreshToken", context);
                    naverAuth.expiresAt = oAuthLoginInstance.Call<long>("getExpiresAt", context);
                    naverAuth.tokenType = oAuthLoginInstance.Call<string>("getTokenType", context);
                }
            }
            return naverAuth;
        }
        ///<summary>accessToken등 정보 가져오기 (로그인 성공 완료 전 가져오면 데이터 비어 있으니 주의할 것)</summary>
        public static IEnumerator GetAuthDelay(System.Action<NaverAuth> callback)
        {
            //var text = GameObject.Find("Text").GetComponent<UnityEngine.UI.Text>();
            while (true)
            {
                yield return new WaitForSeconds(0.1f);
                var auth = GetAuth();
                //text.text = string.Format("token : {0} \n refresh : {1} \n expire : {2} \n type : {3}", auth.accessToken, auth.refreshToken, auth.expiresAt, auth.tokenType);
                if (!string.IsNullOrEmpty(auth.accessToken))
                {
                    naverAuth = auth;
                    yield return naverAuth;
                    callback?.Invoke(naverAuth);
                    break;
                }
            }
        }

        #endregion

        #region REQUEST

        private static string RequestApi()
        {
            string str;
            using (AndroidJavaClass oAuthLogin = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLogin")) //import com.nhn.android.naverlogin.OAuthLogin;
            {
                using (AndroidJavaClass oAuthLoginHandler = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLoginHandler"))   //import com.nhn.android.naverlogin.OAuthLoginHandler;
                {
                    AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//context를 가져오기 위함
                    AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");//context를 가져오기 위함

                    str = oAuthLoginInstance.Call<string>("getAccessToken", context);
                }
            }
            return str;
        }
        ///<summary>accessToken등 정보 가져오기 (로그인 성공 완료 전 가져오면 데이터 비어 있으니 주의할 것)</summary>
        public static IEnumerator RequestApi(System.Action<string> callback)
        {
            while (true)
            {
                yield return new WaitForSeconds(0.1f);
                string auth = RequestApi();
                if (!string.IsNullOrEmpty(auth))
                {
                    yield return auth;
                    callback?.Invoke(auth);
                    break;
                }
            }
        }

        #endregion

        #region REFRESH

        private static string RefreshToken()
        {
            string str;
            using (AndroidJavaClass oAuthLogin = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLogin")) //import com.nhn.android.naverlogin.OAuthLogin;
            {
                using (AndroidJavaClass oAuthLoginHandler = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLoginHandler"))   //import com.nhn.android.naverlogin.OAuthLoginHandler;
                {
                    AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//context를 가져오기 위함
                    AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");//context를 가져오기 위함

                    str = oAuthLoginInstance.Call<string>("getRefreshToken", context);
                }
            }
            return str;
        }
        public static IEnumerator RefreshToken(System.Action<string> callback)
        {
            while (true)
            {
                yield return new WaitForSeconds(0.1f);
                string auth = RefreshToken();
                if (!string.IsNullOrEmpty(auth))
                {
                    yield return auth;
                    callback?.Invoke(auth);
                    break;
                }
            }
        }
        #endregion

        #region LOGOUT

        private static void Logout()
        {
            using (AndroidJavaClass oAuthLogin = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLogin")) //import com.nhn.android.naverlogin.OAuthLogin;
            {
                using (AndroidJavaClass oAuthLoginHandler = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLoginHandler"))   //import com.nhn.android.naverlogin.OAuthLoginHandler;
                {
                    AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//context를 가져오기 위함
                    AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");//context를 가져오기 위함

                    oAuthLoginInstance.Call("logout", context);
                }
            }
        }


        #endregion

        #region DELETE_TOKEN
        private static void DeleteAndLogout()
        {
            using (AndroidJavaClass oAuthLogin = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLogin")) //import com.nhn.android.naverlogin.OAuthLogin;
            {
                using (AndroidJavaClass oAuthLoginHandler = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLoginHandler"))   //import com.nhn.android.naverlogin.OAuthLoginHandler;
                {
                    AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//context를 가져오기 위함
                    AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");//context를 가져오기 위함

                    oAuthLoginInstance.Call("logoutAndDeleteToken", context);
                }
            }
        }
        #endregion

        #region MODEL
        [System.Serializable]
        public class NaverAuth
        {
            public string accessToken;
            public string refreshToken;
            public long expiresAt;
            public string tokenType;
        }
        #endregion
    }

}
728x90