뒤끝 구글 로그인
구글 로그인은 GPGS(Google Play Game Service)사용하여 커스텀과는 차이가 크다. 커스텀은 서버의 정보를 불러오거나 입력하는 구조로 간단하지만, GPGS는 GCP(Google Cloud Platform)와 GPC(Google Play Console)에서의 설정을 조금 해주어야 한다.
[예제] https://developer.thebackend.io/unity3d/guide/federation/gpgs/
위 예제를 통해 설정을 다 한 이후를 자세히 설명해주는 블로그나 카페가 별로 없어 추가로 설명을 한다.
1)구글 해시키 입력
위의 예제만 그대로 따라했을 경우 실행되지 않을 것이다. 먼저 구글 해시키를 뒤끝콘솔에 입력해 두어야 한다.
Backend.Utils.GetGoogleHash();
//example
string googlehash = Backend.Utils.GetGoogleHash();
Debug.Log("구글 해시 키 : " + googlehash);
위의 code를 통해 해시키를 확인할 수 있다. 위의 해시키를 확인하기 위해 apk로 빌드한 후 안드로이드 환경에서 logcat을 확인하여 나오는 해시키를 입력하면 된다.
2)code
void Start()
{
Screen.sleepTimeout = SleepTimeout.NeverSleep;
//안드로이드 환경에서 시간이 지나도 화면이 꺼지지 않게
Initialize();
//뒤끝 초기화
if(Application.platform == RuntimePlatform.Android)
//환경이 안드로이드일 때
{
if (Version())
//최신 버전 확인
{
PlayGamesClientConfiguration config = new PlayGamesClientConfiguration
.Builder()
.RequestServerAuthCode(false)
.RequestIdToken() // 토큰 요청
.Build();
//커스텀된 정보로 GPGS 초기화
PlayGamesPlatform.InitializeInstance(config);
PlayGamesPlatform.DebugLogEnabled = false;
//GPGS 시작.
PlayGamesPlatform.Activate();
GoogleAuth();//gpgs 로그인 시도
TokenLogin();//토큰 로그인(성공할 경우 로그인 실패시 회원가입)
}
}
else
//환경이 유니티 에디터일 때
{
PlayGamesClientConfiguration config = new PlayGamesClientConfiguration
.Builder()
.RequestServerAuthCode(false)
.RequestIdToken() // 토큰 요청
.Build();
//커스텀된 정보로 GPGS 초기화
PlayGamesPlatform.InitializeInstance(config);
PlayGamesPlatform.DebugLogEnabled = false;
//GPGS 시작.
PlayGamesPlatform.Activate();
GoogleAuth();
TokenLogin();
}
}
위의 코드는 기본 설정이다. GoogleAuth 함수로 외부의 gpgs에 로그인을 하게 된다.
public void GoogleAuth()
{
if (PlayGamesPlatform.Instance.localUser.authenticated == false)
{
Social.localUser.Authenticate(success =>
{
if (success == false)
{
Debug.Log("구글 로그인 실패");
StartCoroutine(GoogleLoginFail()); //실패 창(panel)
return;
}
});
}
}
private string GetTokens()
//구글 토큰 로그인
{
if (PlayGamesPlatform.Instance.localUser.authenticated)
{
// 유저 토큰 받기 첫번째 방법
string _IDtoken = PlayGamesPlatform.Instance.GetIdToken();
// 두번째 방법
// string _IDtoken = ((PlayGamesLocalUser)Social.localUser).GetIdToken();
return _IDtoken;
}
else
{
Debug.Log("접속되어있지 않습니다. 잠시 후 다시 시도하세요.");
return null;
}
}
public void OnClickGPGSLogin()
//구글 로그인
{
GoogleAuth(); //gpgs 로그인
BackendReturnObject BRO = Backend.BMember.AuthorizeFederation(GetTokens(), FederationType.Google, "gpgs로 만든계정");
//구글 로그인 시도
switch (BRO.GetStatusCode())
{
case "201": //회원가입
Debug.Log("구글 토큰으로 뒤끝서버 로그인 성공 - 동기 방식-");
UIManager.Inst.DoDisappear(chooseLogin);
UIManager.Inst.DoMove(loginPanel);
LoadChart2();
break;
case "200": //이미 회원되어 있어 기존 정보로 로그인
Debug.Log("이미 회원가입된 회원");
UIManager.Inst.DoDisappear(chooseLogin);
UIManager.Inst.DoMove(UIManager.Inst.mainUI);
UIManager.Inst.nickNameBtn.transform.GetChild(0).GetComponent<Text>().text = Backend.UserNickName.ToString();
UIManager.Inst.DoMove(UIManager.Inst.nickNameBtn);
LoadChart2();
break;
case "403": //로그인 불가
Debug.Log("차단된 사용자 입니다. 차단 사유 : " + BRO.GetErrorCode());
break;
}
}
public void OnClickChangeCustomToFederation()
//커스텀 계정에서 구글 연동
{
BackendReturnObject BRO = Backend.BMember.ChangeCustomToFederation(GetTokens(), FederationType.Google);
//구글 로그인 시도
if(BRO.IsSuccess())
//성공
{
Debug.Log("페더레이션 계정으로 변경 완료");
GoogleBtn();
}
else
{
switch (BRO.GetStatusCode())
{
case "400": //이미 로그인 되어 있을 경우
if(BRO.GetErrorCode() == "BadParameterException")
{
Debug.Log("이미 ChangeCustomToFederation 완료 되었는데 다시 시도한 경우");
}
else if(BRO.GetErrorCode() == "UndefinedParameterException")
//커스텀 로그인이 되어 있지 않은 경우 (위와 에러 코드가 동일)
{
Debug.Log("customLogin 하지 않은 상황에서 시도한 경우");
}
break;
case "409":
// 이미 가입되어 있는 경우
Debug.Log("Duplicated federationId, 중복된 federationId 입니다");
break;
}
}
}
public void OnClickCheckUserAuthenticate()
//
{
GoogleAuth();
BackendReturnObject BRO = Backend.BMember.CheckUserInBackend(GetTokens(), FederationType.Google);
if(BRO.GetStatusCode()== "200")
//구글 계정으로 가입이 되어 있는 경우 정보를 불러와 로그인
{
Debug.Log("가입 중인 계정입니다.");
// 해당 계정 정보
Debug.Log(BRO.GetReturnValue());
Debug.Log("해당 구글 계정으로 회원가입된 이력이 있습니다. 지금의 정보를 지우고 이전의 정보를 가져오시겠습니까?");
UIManager.Inst.DoMove(customToGoogle);
}
else
//구글 회원가입
{
Debug.Log("가입된 계정이 아닙니다.");
OnClickChangeCustomToFederation();
}
}