Cheondi
취미 · 게임 프로젝트

뒤끝 구글 로그인

  • #unity
  • #vscode
  • #csv
  • #뒤끝서버





뒤끝 구글 로그인

구글 로그인은 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();
        }
    }