소셜 로그인/복습
Unity 소셜로그인 21.07.07. GPGS - Firebase 연동
HappyFrog
2021. 7. 8. 00:33
팀프로젝트에 소셜로그인을 구현하면서 복습을 할 예정이니 차근차근 모두 포스팅하며 진행할 것이다.
선행조건으로는 Google Play Console에 앱이 등록되어있으며, 내부트랙으로라도 출시가 되어있어야 한다.(출시해야하는것은 확실하진 않음)
https://firebase.google.com/docs/samples?authuser=0
Firebase
filter_list 필터링 기준 모든 기능 AdMob 애널리틱스 인증 Cloud Firestore Cloud Functions 클라우드 메시징 Crashlytics 동적 링크 호스팅 성능 실시간 데이터베이스 원격 구성 저장소 Test Lab 모든 플랫폼 Android
firebase.google.com
Firebase 샘플 앱
https://firebase.google.com/docs/guides?authuser=0
Firebase 가이드
firebase.google.com
Firebase 문서
- Firebase페이지에 접속하면 해당 화면이 보일것이다.
- 해당 화면에서 '시작하기'를 눌러주자
- 나는 이미 등록된 프로젝트가 있어서 화면과 같이 나오지만 처음 만들때는 모습이 다를 수도 있다.
- 프로젝트 추가를 누르자.
- 그리고 나오는 창에서 이름입력 인풋박스를 눌러보면 왼쪽 사진과 같이 내가 Google Play Console에 생성해둔 프로젝트들이 나온다.
- 원하는 프로젝트를 선택하면 오른쪽 사진과 같이 나온다.
- '계속'하자.
- '계속'
- 후에 애널리틱스를 이용할 것이기 때문에 애널리틱스 사용한다고 해주고 '계속'하자.
- 애널리틱스 계정으로 Default와 계정생성을 물어보는데 나는 내 이메일을 적었다(흰색으로 지워서 사진에선 안보인다)
- 위치를 지정해주고 애널리틱스를 하기위해 데이터공유설정과 약관에 동의한 뒤 Firebase를 추가하자.
- 나는 유니티에 연동을 시킬것이니 유니티로고를 눌러주자.
- 앱등록엔 위 사진들과 같이 4단계로 나뉘어진 절차가 나온다. 따라주자.
- 나의 패키지 이름을 기입하고 앱 닉네임을 적어준다.
- 앱 닉네임은 굳이 적지않아도 된다.
- 패키지 이름은 Unity Editor - Edit - Project Settings - Player - Identification에 있다.
- 이제 1단계의 내용을 토대로 작성된 json파일을 다운받아 프로젝트에 import시켜주자.
- Firebase SDK도 다운받아주자.
- 주의할 점은 Firebase SDK를 import시킬 때 Unity 2019버전 이상에서는 dotnet4폴더에 있는 패키지를 적용시켜야 한다.
- 나는 Unity 2020.3.10f, 3.13f를 사용중이므로 dotnet4패키지를 가져올것이다.
- 받은 SDK 압축파일을 풀면 위 사진과 같이 나오는데 dotnet4를 들어가면 오른쪽 사진과 같이 여러 SDK가 존재한다.
- 나는 당장 인증만 필요하므로 Auth만 가져올 생각이다.
- Auth패키지를 import시키면 위 사진과 같은 창이 뜬다.
- "모르면 '네'라고 해야된다." - 대충 흑백사진 바탕에 궁서체
- 끝났단다.
- 이제 Unity Editor에서 ClientID로 지정했던 값을 Firebase가 새로이 만들어준 ID로 할당해주어야 한다.
- Google Cloud Platform의 해당 앱으로 들어가면 원래 OAuth 2.0클라이언트 ID밖에 없던것이 여러가지가 더 추가되었을 것이다
- 여기에서 OAuth 2.0 클라이언트 ID의 Web client의 클라이언트 ID가 필요하다.
- 해당 ID를 복사하자.
- 그리고 Unity Editor로 돌아와 Window - Google Play Games - Setup - Android setup...을 눌러 팝업을 켜주자.
- 가져온 ID를 Client ID칸에 다시 할당해주고 Setup을 눌러 적용해주자.
- 제대로 됐다면 해당 팝업이 나올것이다.
- 그렇다면 이제 코드를 통해 googleIdToken을 받아와보자.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using GooglePlayGames;
using GooglePlayGames.BasicApi;
using UnityEngine.SocialPlatforms;
using UnityEngine.SceneManagement;
public class App : MonoBehaviour
{
public enum ePlayMode
{
Test, Build
}
public Text version;
public Text txtState;
public Button btnStart;
public ePlayMode playMode;
void Start()
{
if (playMode == ePlayMode.Test)
{
this.btnStart.gameObject.SetActive(true);
btnStart.onClick.AddListener(() =>
{
SceneManager.LoadScene("Logo");
});
return;
}
else
{
Debug.Log("else");
this.btnStart.gameObject.SetActive(false);
GPGSInit();
}
GPGSInit();
}
void GPGSInit()
{
this.version.text = Application.version;
Debug.Log("==================== Init GPGS");
PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder()
.RequestIdToken()
.Build();
PlayGamesPlatform.InitializeInstance(config);
PlayGamesPlatform.DebugLogEnabled = true;
PlayGamesPlatform.Activate();
Debug.Log("==================== Authenticate");
PlayGamesPlatform.Instance.Authenticate(SignInInteractivity.CanPromptOnce, (result) =>
{
if (Social.localUser.authenticated)
{
this.txtState.text = result.ToString();
if (result == SignInStatus.Success)
{
var localUser = (PlayGamesLocalUser)Social.localUser;
var googleIdToken = localUser.GetIdToken();
Debug.LogFormat("googleIdToken: {0}", googleIdToken);
SceneManager.LoadScene("Logo");
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
Firebase.Auth.Credential credential =
Firebase.Auth.GoogleAuthProvider.GetCredential(googleIdToken, null);
auth.SignInWithCredentialAsync(credential).ContinueWith(task =>
{
if (task.IsCanceled)
{
Debug.LogError("SignInWithCredentialAsync was canceled.");
return;
}
if (task.IsFaulted)
{
Debug.LogError("SignInWithCredentialAsync encountered an error: " + task.Exception);
return;
}
Firebase.Auth.FirebaseUser newUser = task.Result;
Debug.LogFormat("User signed in successfully: {0} ({1})",
newUser.DisplayName, newUser.UserId);
});
}
}
});
}
}
- 위 코드에서 받아오는 코드는 얼마 안된다.
- Firebase에서 IdToken을 받아오는 코드는 위 두 사진이 끝이다.
- 나머지 코드는 Test용 빌드와 Build용 빌드를 나누기 위한 코드, 그리고 GPGS인증을 위한 코드들이다.
- 빌드해주자.
- 마지막으로 NOX를 켜고 NOX의 bin폴더에서 cmd를 켜서 adb를 실행하자.
- adb connect 127.0.0.1:62001을 한다면 adb가 연결될 것이다.
- 연결이 되었다면 adb logcat 또는 adb logcat -s Unity를 입력하자.
- 둘의 차이는 전체 실행로그를 모두 띄우냐 / 유니티의 로그만 띄우냐의 차이이다. logcat을 실행하는 것을 권장하지만 나는 빠르게 확인하기위해 Unity로그만 띄울 예정이다.(오류잡기에는 adb logcat이 훨씬 수월하다. 유니티로그에는 안뜨는 경우도 있기때문에.)
- logcat이 실행중인 상태에서 빌드된 APK를 실행하고 인증에 성공했다면 중간에 저런 로그가 끼어있는 것을 볼 수 있다.
- googleIdToken을 가져오는데 성공했기에 adb의 로그에 찍힌것이다.
끝.