-
유니티 안드로이드 네이버 로그인 구현 (Unity Android Naver Login)Unity 2022. 1. 3. 20:23728x90
네이버 로그인을 안드로이드로 구현한 버전이다. 이전에 작성했던 카카오 로그인과 같은 맥락으로, 안드로이드 스튜디오를 다뤄 aar 플러그인을 직접 만들기 어려운 상황일 때, 유니티에서 C#으로 네이버 로그인을 구현한 예제이다.
//사용시 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'Unity' 카테고리의 다른 글
유니티 스팀 멀티 연동하기 - 4. 테스트 (0) 2023.10.13 유니티 스팀 멀티 연동하기 - 3. 플레이어 및 변수 연동 (3) 2023.10.13 유니티 스팀 멀티 연동하기 - 2. 로비 (0) 2023.10.13 유니티 스팀 멀티 연동하기 - 1. 사전 설정 (0) 2023.10.13 유니티 카카오 로그인 웹뷰 플러그인 (Unity Kakao Login WebView Plugin) (0) 2022.01.03