GPGS 회원가입 문의입니다.

고객님의 문의에 답변하는 직원은 고객 여러분의 가족 중 한 사람일 수 있습니다.
고객의 언어폭력(비하, 조롱, 욕설, 협박, 성희롱 등)으로부터 직원을 보호하기 위해
관련 법에 따라 수사기관에 필요한 조치를 요구할 수 있으며, 형법에 의해 처벌 대상이 될 수 있습니다.

커뮤니티 이용 정책에 위배되는 게시물을 작성할 경우, 별도 안내 없이 게시물 삭제 또는 커뮤니티 이용이 제한될 수 있습니다.

문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.

  • 뒤끝 SDK 버전 : 5.16.1
  • 프로젝트명 : VTuber : Idle RPG
  • 스테이터스 코드 : 401
  • 에러 코드 :
  • 에러 메시지 :
using System.Collections;
using System.Collections.Generic;
using GooglePlayGames;
using GooglePlayGames.BasicApi;
using UnityEngine;
// 뒤끝 SDK namespace 추가
using BackEnd;
using System;

public class BackendManager : MonoBehaviour
{
    MyObject myChar;
    private static BackendManager instance;
    private string guestID;

    private int retryCount = 0;
    private const int maxRetry = 3; // 최대 재시도 횟수


    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject); // 씬이 변경되어도 오브젝트 유지
        }
        else
        {
            Destroy(gameObject);
        }
        
    }
    void Start()
    {
        myChar = MyObject.MyChar;
        PlayGamesPlatform.Activate();   //GPGS 활성화

        var bro = Backend.Initialize(); // 뒤끝 초기화

        // 뒤끝 초기화에 대한 응답값
        if (bro.IsSuccess())
        {
            Debug.Log("초기화 성공 : " + bro); // 성공일 경우 statusCode 204 Success
        }
        else
        {
            Debug.LogError("초기화 실패 : " + bro); // 실패일 경우 statusCode 400대 에러 발생
        }

        // GPGS 로그인
        PlayGamesPlatform.Instance.Authenticate(ProcessAuthentication);
    }
    void ProcessAuthentication(SignInStatus status)
    {
        if (status == SignInStatus.Success)
        {
            Debug.Log("GPGS 로그인 성공!");
            GetAccessCode();
            // Continue with Play Games Services
        }
        else
        {
            // Disable your integration with Play Games Services or show a login button
            // to ask users to sign-in. Clicking it should call
            // PlayGamesPlatform.Instance.ManuallyAuthenticate(ProcessAuthentication).
            //Debug.LogError("GPGS 로그인 실패. 상태: " + status);
            TryGuestLogin(); // GPGS 실패 시 게스트 로그인 진행
        }
    }
    public void GetAccessCode()
    {
        PlayGamesPlatform.Instance.RequestServerSideAccess(
        /* forceRefreshToken= */ false,
        code => {
            Debug.Log("구글 인증 코드 : " + code);

            Backend.BMember.GetGPGS2AccessToken(code, googleCallback =>
            {
                Debug.Log("GetGPGS2AccessToken 함수 호출 결과 " + googleCallback);

                string accessToken = "";

                if (googleCallback.IsSuccess())
                {
                    accessToken = googleCallback.GetReturnValuetoJSON()["access_token"].ToString();
                }

                Backend.BMember.AuthorizeFederation(accessToken, FederationType.GPGS2, callback =>
                {
                    Debug.Log(accessToken);
                    Debug.Log("뒤끝 로그인 성공했습니다. " + callback);
                });
            });
        });
    }

    private void TryGuestLogin()
    {
        guestID = SystemInfo.deviceUniqueIdentifier; // 기기 고유 ID를 게스트 ID로 사용
        Debug.Log("기기 ID : "+guestID);

        Debug.Log("기존 게스트 계정 확인 중...");

        // 기존 계정이 있는지 확인 (로그인 시도)
        Backend.BMember.CustomLogin(guestID, "guest_password", loginCallback =>
        {
            if (loginCallback.IsSuccess())
            {
                Debug.Log("기존 게스트 계정 로그인 성공!");
                string userID = Backend.UID;
                string userUUID = Backend.BMember.GetUserInfo().GetReturnValuetoJSON()["row"]["gamerId"].ToString();
                Debug.Log(userID + ": 2\n" + userUUID);
            }
            else
            {
                Debug.LogWarning("기존 게스트 계정 없음. 새로운 계정 생성 진행");

                // 기존 계정이 없다면 회원가입 진행
                RegisterGuestAccount();
            }
        });
    }
    private void RegisterGuestAccount()
    {
        Backend.BMember.CustomSignUp(guestID, "guest_password", signupCallback =>
        {
            if (signupCallback.IsSuccess())
            {
                Debug.Log("새로운 게스트 계정 생성 및 로그인 성공!");
                string userID = Backend.UID;
                string userUUID = Backend.BMember.GetUserInfo().GetReturnValuetoJSON()["row"]["gamerId"].ToString();
                Debug.Log(userID + ": 3\n" + userUUID);
            }
            else
            {
                Debug.LogError("게스트 계정 생성 실패: " + signupCallback);
            }
        });
    }
}

액을 실행해서 확인해보면 구글인증 코드 와 GetGPGS2AccessToken 함수 호출 결과에서 StatusCode : 200을 받고 성공한걸로나오는데 그뒤에
Debug.Log(accessToken); 값을 확인해보면 ya29.a0Ae…의 값을 제대로 받으면서
뒤끝 로그인 성공했다는 안내와함께 StatusCode : 401값을 출력하면서 GPGS 회원가입이 안되고있습니다.

401값은Client Secret에러라고나와잇는데 구글클라우드의 클라이언트 보안 비밀번호값이랑 동일한 값이 입력된 상태인데 왜 가입이 진행이 안되는걸까요?

안녕하세요 개발자님,
발생 에러정보 확인 시 bad google_hash, 잘못된 google_hash 입니다 에러가 확인됩니다.
뒤끝 콘솔 내 인증정보 메뉴에서 구글 해시키를 입력하신 후 재시도 바랍니다.

추가로 해시키는 하나만 존재하지 않고, 상황에 따라 아래와 같이 여러 해시키가 생성될 수 있습니다.

  • 디버그 키를 이용하여 생성한 debug 해시키
  • keyStore를 등록하여 생성한 release 해시키
  • 구글 콘솔에 apk 파일 업로드 후 구글의 인증키로 생성된 Signing 해시키

에디터 환경 / 빌드된 apk을 통한 설치 / 스토어 업로드 후 설치 각 환경에 따라 사용되는 해시키 정보가 상이하기에 확인되는 해시키들을 모두 등록하여 이용해 주시면 감사하겠습니다.

좋아요 1