뒤끝 구글 로그인

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