GPGS 로그인 토큰 발급 관련 문의 드립니다.

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

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

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

  • 뒤끝 SDK 버전 : 5.16.2
  • 프로젝트명 : WordMatching
    메시지: The given key ‘error’ was not present in the dictionary.
    상태코드: 401
    에러코드: GoogleParseException

안녕하세요, GPGSv2 로그인 관련하여 막히는 부분이 있어 질문 남깁니다.
현재 GPGSv2 플러그인 도입을 진행하면서 다음과 같은 프로세스로 개발하였습니다.

  1. 초기화
  2. GPGS 로그인 진행
  3. 파이어베이스 토큰 인증
  4. 뒤끝 토큰 수령(GetGPGS2AccessToken)
  5. 뒤끝 GPGS 인증

현재 1번부터 3번까지 로그를 찍어가며 잘되는건 확인하였지만,
현재 4번에서 문제가 생겨 뒤끝에 유저가 가입되지 않는 상태입니다.

internal void GetAccessToken()
    {
        
        PlayGamesPlatform.Instance.RequestServerSideAccess(true, code =>
        {
            OnLoginAttemptComplete?.Invoke($"GPGS 인증 코드: {code}");
            Debug.Log("code: " + code);

            if (string.IsNullOrEmpty(code))
            {
                OnLoginAttemptComplete?.Invoke("GPGS 인증 코드 획득 실패");
                return;
            }

            // 1단계: Firebase 인증
            var credential = PlayGamesAuthProvider.GetCredential(code);
            auth.SignInWithCredentialAsync(credential).ContinueWithOnMainThread(task =>
            {
                if (task.IsFaulted)
                {
                    OnLoginAttemptComplete?.Invoke($"Firebase 인증 실패: {task.Exception?.Message}");
                    return;
                }

                user = task.Result;
                OnLoginAttemptComplete?.Invoke($"Firebase 인증 성공! UID: {user.UserId}");

                // 2단계: Firebase 토큰 획득
                user.TokenAsync(false).ContinueWithOnMainThread(tokenTask =>
                {
                    if (tokenTask.IsFaulted)
                    {
                        OnLoginAttemptComplete?.Invoke($"Firebase 토큰 획득 실패: {tokenTask.Exception?.Message}");
                        return;
                    }

                    Backend.BMember.AuthorizeFederation(code,FederationType.GPGS2,callback=>{
                        if(callback.IsSuccess()){
                            bool isNewUser = callback.GetStatusCode() == "201";
                            OnLoginAttemptComplete?.Invoke("모든 인증 완료! (Firebase + 뒤끝)");
                            if(isNewUser){
                                OnLoginAttemptComplete?.Invoke("새로운 유저입니다.");
                            }
                        }else{
                            OnLoginAttemptComplete?.Invoke($"뒤끝 인증 실패: {callback.GetMessage()}");
                        }
                    });

                    // 3단계: 뒤끝 인증 시도
                    Backend.BMember.GetGPGS2AccessToken(code, googleCallback =>
            {
                if (!googleCallback.IsSuccess())
                {
                    Debug.Log("뒤끝 토큰 획득 실패\n" +
                        $"메시지: {googleCallback.GetMessage()}\n" +
                        $"상태코드: {googleCallback.GetStatusCode()}\n" +
                        $"에러코드: {googleCallback.GetErrorCode()}");
                    OnLoginAttemptComplete?.Invoke($"뒤끝 토큰 획득 실패\n" +
                        $"메시지: {googleCallback.GetMessage()}\n" +
                        $"상태코드: {googleCallback.GetStatusCode()}\n" +
                        $"에러코드: {googleCallback.GetErrorCode()}");
                    return;
                }

                try
                {
                    string accessToken = googleCallback.GetReturnValuetoJSON()["access_token"].ToString();
                    OnLoginAttemptComplete?.Invoke($"뒤끝 액세스 토큰: {accessToken}");

                    // 3단계: 뒤끝 GPGS 인증
                    Backend.BMember.AuthorizeFederation(accessToken, FederationType.GPGS2, callback =>
                    {
                        if (!callback.IsSuccess())
                        {
                            OnLoginAttemptComplete?.Invoke($"뒤끝 인증 실패: {callback.GetMessage()}");
                            return;
                        }

                        OnLoginAttemptComplete?.Invoke($"모든 인증 완료! (Firebase + 뒤끝)");

                        // 성공 시 추가 작업
                        bool isNewUser = callback.GetStatusCode() == "201";
                        if (isNewUser)
                        {
                            OnLoginAttemptComplete?.Invoke("새로운 유저입니다.");
                        }
                    });
                }
                catch (Exception e)
                {
                    OnLoginAttemptComplete?.Invoke($"토큰 처리 중 에러: {e.Message}\n스택트레이스: {e.StackTrace}");
                }
            });
                });
            });
        });
    }

!googleCallback.IsSuccess() 계속 여기에 걸려서 실패 로그가 찍힙니다.
image

구글에서 code는 잘 받아와지지만, 해당 코드로 AccessToken을 요청할때
메시지: The given key ‘error’ was not present in the dictionary.
상태코드: 401
에러코드: GoogleParseException
다음과 같은 메세지가 뜹니다.

해결 방법이 있을까요…

안녕하세요 개발자님,
정보상 기재해주신 프로젝트 정보가 확인되지 않습니다.
뒤끝 콘솔에서 설정하신 프로젝트 명을 정확하게 공유해 주시면 감사하겠습니다.

프로젝트 이름을 잘못 기입했었네요
프로젝트명: 영단어게임 입니다

iOS 환경에서 GPGS 로그인을 시도중인게 맞으실까요?
GPGS 로그인은 iOS 환경을 지원하지 않습니다.
각 로그인 기능은 다음과 같은 특징을 가지고 있으니 확인 후 이용해 주시면 감사하겠습니다.

구분 GPGS V2 GPGS V1 Sign In with Google
로그인 정보 PGS games_lite 정보 이용 구글 계정 정보 이용 구글 계정 정보 이용
계정간 호환 GPGS V2 단독
GPGS V1 및 Sign In with Google 호환 불가
Sign In with Google 호환
GPGS V2 호환 불가
GPGS V1 호환
GPGS V2 호환 불가
iOS 지원 미지원 미지원 지원

현재 Android, iOS 둘다 빌드를 해서 세팅이 되어있는건데,
GPGS v2 로그인은 구글에서 시도를 했습니다.
현재 상황이
안드로이드에서 GPGS로 로그인은 되고, 파이어베이스까지 인증은되는데
뒤끝 GetGPGS2AccessToken에서 googleCallback 결과값으로 아무것도 받아오지 못한다는 것입니다.
if (!googleCallback.IsSuccess())
해당 조건에서 계속 에러를 출력하구요.

좋아요 1

관련 정보 상세히 확인하여 안내드릴 수 있도록 하겠습니다.

넵 감사합니다 :slight_smile:
잘부탁드립니다.

GPGS의 RequestServerSideAccess() 함수로 발급한 인증코드를 파이어베이스와 뒤끝에 중복으로 사용하여 발생한 문제로 예상됩니다.
발급된 인증코드는 기본적으로 하나의 인증 세션만 생성할 수 있습니다.

따라서 파이어베이스에서 인증코드를 사용해서 액세스 토큰을 생성했다면 같은 인증코드를 사용하여 뒤끝의 액세스 토큰을 생성할 수 없습니다.

각각의 액세스 토큰을 생성하시려면 GPGS 인증 코드를 사용해야 하는 곳 마다 RequestServerSideAccess() 호출을 통해 별도의 인증코드를 발급받아서 사용해 주세요.

안녕하세요, 답변이 좀 늦었습니다.
답변 주신 이후 GPGS 로그인을 시도하면서,
토큰을 1회 요청하여 뒤끝 인증만 시도하는 방식으로 진행하였습니다.

public void SignInWithGPGSV2()
    {
        Debug.Log("GPGS2 로그인 시도");
        PlayGamesPlatform.Instance.Authenticate(ProcessAuthentication);
    }
internal void ProcessAuthentication(SignInStatus status)
    {
        if (status == SignInStatus.Success)
        {
            Debug.Log("Login successful");
            var user = PlayGamesPlatform.Instance.localUser;
            Debug.Log($"User ID: {user.id}, User Name: {user.userName}");
            GetAccessToken();
        }
        else
        {
            Debug.LogError($"Login failed: {status}");
        }
    }
rivate void AuthenticateWithBackend(string code)
    {
        Backend.BMember.GetGPGS2AccessToken(code, googleCallback =>
        {
            if (!googleCallback.IsSuccess())
            {
                Debug.LogError(
                    $"뒤끝 토큰 획득 실패\n" +
                    $"메시지: {googleCallback.GetMessage()}\n" +
                    $"상태코드: {googleCallback.GetStatusCode()}\n" +
                    $"에러코드: {googleCallback.GetErrorCode()}");
                return;
            }

            try
            {
                string accessToken = googleCallback.GetReturnValuetoJSON()["access_token"].ToString();
                Debug.Log("뒤끝 토큰 획득 성공: " + accessToken);

                // 뒤끝 GPGS2 인증 진행
                AuthorizeWithBackend(accessToken);
            }
            catch (Exception e)
            {
                Debug.LogError($"뒤끝 토큰 파싱 실패: {e.Message}");
            }
        });
    }
private void AuthorizeWithBackend(string accessToken)
    {
        Backend.BMember.AuthorizeFederation(accessToken, FederationType.GPGS2, callback =>
        {
            if (!callback.IsSuccess())
            {
                Debug.LogError($"뒤끝 GPGS2 인증 실패: {callback.GetMessage()}");
                return;
            }

            bool isNewUser = callback.GetStatusCode() == "201";
            Debug.Log(isNewUser ? "새로운 유저입니다." : "기존 유저입니다.");
        });
    }

하지만 여전히 동일한 문제가 발생하여, 지속적으로 뒤끝 로그인에는 실패하고있습니다.

추가적으로 뒤끝 로그인 시도 후 파이어베이스 로그인을 시도하는 과정에서 파이어베이스는 인증이 잘됩니다.

현재 code를 잘받아와서, GetGPGS2AccessToken(code, callback)으로 진행하는데 callback에서 오류가 뜬다는게,
뒤끝 서버에서 code에 따른 token 값을 받아오지 못하는 것 같은데,
다른 가능성은 없을까요?

앗… 해결되었습니다
확인해보니 Clientid부분 앞에 공백 하나때문에 안되고 있던거더군요 하하…
친절하게 답변 해주셨던 부분 감사드립니다.

좋아요 1