Google Play Game Service V2(GPGS2) 사용
Google Play Games Service (GPGS)로 간편하게 로그인하는 기능을 넣어서, 사용자 경험을 향상하세요.
이 가이드에서는 GPGS 회원가입 및 로그인 기능을 구현하는 방법을 소개합니다.
GPGS 로그인과 Google 계정 로그인은 동일하지 않으며 다음과 같은 차이가 있습니다.
구분 | 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 지원 | 미지원 | 미지원 | 지원 |
- Google Play Game Service를 통해 구글 계정으로 로그인
- 구글 Auth Code 획득
- 이 구글 Access Code를 Backend.BMember.GetGPGS2AccessToken() 함수에 사용
- 구글 액세스 토큰이 발급
- 구글 액세스 토큰을 이용해 Backend.BMember.AuthorizeFederation("accessToken", FederationType.GPGS2) 호출
초기 설정
1. 구글 플레이에 어플리케이션 등록
구글 플레이 콘솔 > 앱 만들기 > 출시 > 프로덕션 or(공개, 비공개, 내부) 테스트 > 새 버전 만들기
Google Play 앱 서명에서 계속을 눌러 앱 서명을 등록하여 앱 서명 키 인증서를 발급해 줍니다.
APK 또는 App Bundle을 업로드하여 업로드 키 인증서까지 발급해 줍니다.
발급된 앱 서명은 왼쪽 메뉴 중 설정 > 앱 서명에서 확인할 수 있으며, 이후 구글 게임 서비스를 등록할 때 필요합니다.
2. 구글 게임 서비스 등록
- 왼쪽 메뉴 중 Play 게임 서비스 > 설정 및 관리 > 설정에서 아니요, 게임에서 Google API를 사용하지 않습니다를 선택하여 새로운 Play 게임 서비스 프로젝트를 생성합니다.
이후, 사용자 인증 정보에 OAuth 동의 화면 구성을 클릭하여 Google Cloud Platform으로 들어갑니다.
Google Cloud Platform에서 OAuth 동의 화면을 구성합니다.
동의 화면 구성 후, 왼쪽 메뉴에 사용자 인증 정보를 클릭하여 사용자 인증 정보를 구성합니다.
사용자 인증 정보 만들기 > OAuth 클라이언트 ID > Android 선택
이 과정을 1번(사진 4)에서 등록한 어플리케이션의 앱 서명 > 앱 서명 인증서와 업로드 인증서 두 가지를 모두 해줍니다.
다음과 같이 Google Cloud Platform에 총 2개의 OAuth 2.0 클라이언트 ID가 등록되어 있어야 합니다.
- Play 게임 서비스에 사용자 인증 정보 추가 4번에 Google Cloud Platform에서 추가한 2개의 Android 사용자 인증 정보를 추가합니다.
다음과 같이 구글 콘솔에 2개의 사용자 인증정보가 추가되어야 합니다.
3. 테스터 설정
GPGS를 테스트하기 위해서는 구글 콘솔에 테스터가 등록되어 있어야 합니다.
왼쪽 메뉴 Play 게임 서비스 > 테스터 > 출시 트랙에서 트랙 추가를 클릭하여 앱을 게시한 트랙을 추가합니다.
이후, 테스터 항목에서 테스터 추가를 클릭하여 테스터를 추가합니다.
4. 유니티 설정
- Unity Project - Google Play Games Services Plugin 추가
https://github.com/playgameservices/play-games-plugin-for-unityGPGS 버전 11 다운로드 > [current-build] 폴더 > unitypackage import
임포트 후, 유니티 상단에 Windows > Google Play Games > Setup > Android Setup 클릭
Resources Definition 설정
Play 게임 서비스 > 설정 및 관리 > 설정 > 사용자 인증 정보 우측에 리소스 보기를 클릭합니다.
Android(XML)을 복사하여 유니티 GPGS 설정 창 - Resources Definition에 입력해 줍니다.
- Client ID 설정
해당 프로젝트의 Google Cloud Platform > 사용자 인증 정보 > +사용자 인증 정보 만들기를 클릭합니다.
어플리케이션 유형을 웹 애플리케이션으로 설정하고 생성합니다.
생성된 웹 어플리케이션의 클라이언트 ID를 복사하여 유니티 GPGS 설정 창 - Client ID에 입력해 줍니다.
5. 뒤끝 콘솔 설정
뒤끝 콘솔에서는 뒤끝 서버와의 통신을 위해 승인된 리디렉션 URI에 https://auth0.thebackend.io를 입력해야합니다.
또한 인증 정보 > 구글 로그인 인증 정보에 GPGS와 연동된 GCP의 web Client ID의 Client ID와 Client Secret을 입력해야합니다.
Google Cloud Platform > API 및 서비스 > 사용자 인증 정보 > 웹 클라이언트 선택
승인된 리디렉션 URI에 https://auth0.thebackend.io를 추가
https://auth0.thebackend.io/google/token는 웹 탈퇴 링크 사용시 등록하는 uri로, gpgs v2 구현시에는 필요하지 않습니다.
클라이언트 ID와 클라이언트 보안 비밀번호를 복사
뒤끝 콘솔 > 인증 정보 > 구글 로그인 인증 정보에 Client ID와 Client Secret을 입력
완료
ID 토큰을 받기 위한 설정은 모두 끝났습니다.
이제 구글 플레이 콘솔에 등록한 아이디를 통해 auth Code를 받을 수 있습니다.
GetGPGS2AccessToken
public BackendReturnObject GetGPGS2AccessToken(string authCode);
public BackendReturnObject GetGPGS2AccessToken(string authCode, string redirectUri);
파라미터
Value | Type | Description |
---|---|---|
authCode | string | GPGS 로그인 이후, PlayGamesPlatform.Instance.RequestServerSideAccess 함수를 호출하여 얻은 인증 코드 값 |
redirectUri | string | GCP에서 설정한 해당 webClientId에 대한 redirectUri |
설명
GPGS 로그인 이후, GPGS 플러그인을 이용해 서버에 요청 가능한 인증 코드 값을 받습니다.
해당 인증 코드 값을 이용하여 페데레이션 로그인에 사용되는 액세스 토큰 값을 가져옵니다.
GetGPGS2AccessToken를 통해 액세스토큰을 발급받은 후에는 해당 액세스토큰을 AuthorizeFederation("access_token", FederationType.GPGS2)에 사용하여 로그인을 해야합니다!
AuthorizeFederation에 대한 설명은 아래에 설명되어있습니다.
Example
string google_code = "4/0AeaYSHCuDcNr-Kai7Hx42BpreFACh3wLVEe5u7ZF-phOY8qv6lAHQ2R7a5Y3zWOqkfqocw";
BackendReturnObject bro = Backend.BMember.GetGPGS2AccessToken(google_code);
if(bro.IsSuccess()) {
string accessToken = googleCallback.GetReturnValuetoJSON()["access_token"].ToString();
}
비동기
string google_code = "4/0AeaYSHCuDcNr-Kai7Hx42BpreFACh3wLVEe5u7ZF-phOY8qv6lAHQ2R7a5Y3zWOqkfqocw";
Backend.BMember.GetGPGS2AccessToken(google_code, callback => {
if(callback.IsSuccess()) {
string accessToken = googleCallback.GetReturnValuetoJSON()["access_token"].ToString();
}
});
SendQueue
string google_code = "4/0AeaYSHCuDcNr-Kai7Hx42BpreFACh3wLVEe5u7ZF-phOY8qv6lAHQ2R7a5Y3zWOqkfqocw";
SendQueue.Enqueue(Backend.BMember.GetGPGS2AccessToken, google_code, callback => {
if(callback.IsSuccess()) {
string accessToken = googleCallback.GetReturnValuetoJSON()["access_token"].ToString();
}
});
Sample Code
using BackEnd;
using GooglePlayGames;
using GooglePlayGames.BasicApi;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
void Start() {
PlayGamesPlatform.Instance.Authenticate(ProcessAuthentication);
}
void ProcessAuthentication(SignInStatus status) {
if (status == SignInStatus.Success) {
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).
}
}
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();
}
});
});
}
}
ReturnCase
Success cases
토큰 발급에 성공한 경우
statusCode : 200
message : Success
returnValue :
{
"access_token": "ya29.a0AfB_byAGc2xHeWWevNzeLGmzbOKJC5ydCpf_GaboF1PziwI6ZF3i8UqttxPM_sxJu9d76rIVH0IdPGdRLYsHySae-TdmsUUlG9-TNEuZYRQwz8CHsENfcX9hHnzvbA-JqqzLxuglfTwwV_RPvTgORgHxNsxGd5whGgaCgYKAaoSARESFQHGX2Mi7KDxujEBmU_9QeEKMUsw6A0169",
"expires_in": 3598,
"scope": "https://www.googleapis.com/auth/games_lite https://www.googleapis.com/auth/drive.appdata",
"token_type": "Bearer"
}
Error cases
뒤끝 콘솔에 구글 로그인 정보를 잘못 입력하였을 경우
statusCode : 404
errorCode : NotFoundException
message : GPGS authorization info not found, GPGS authorization info을(를) 찾을 수 없습니다
뒤끝 콘솔에 구글 로그인 정보를 잘못 입력하였을 경우
statusCode : 400
errorCode : GoogleOAuthException
message : invalid_grant : Bad Request
뒤끝 콘솔에 client secret가 잘못 입력되어있을 경우
statusCode : 401
errorCode : GoogleOAuthException
message : invalid_client : Unauthorized
GCP 프로젝트에 승인된 리디렉션 URI를 입력하지 않았을 경우
statusCode : 400
errorCode : GoogleOAuthException
message : redirect_uri_mismatch : Bad Request
GCP 프로젝트에 안드로이드 클라이언트를 추가하지 않았을 경우
statusCode : 400
errorCode : GoogleOAuthException
message : invalid_request : Missing required parameter: code
AuthorizeFederation
public BackendReturnObject AuthorizeFederation(string federationToken, FederationType type);
public BackendReturnObject AuthorizeFederation(string federationToken, FederationType type, string ect);
파라미터
Value | Type | Description |
---|---|---|
federationToken | string | 각 로그인 플러그인을 통해 생성된 token 값 |
federationType | FederationType | 페더레이션의 종류.(FederationType.GPGS2) |
ect | string | (Optional) 부가적으로 나오는 정보들 중에 저장하고 싶은 정보 |
설명
Google Play Game Services의 회원정보 토큰 값을 이용하여 회원가입/로그인을 시도합니다.
GPGS V2는 Play Game Services의 정보를 이용해 로그인하는 것이며, GPGS V1, Sign in with Google은 구글 계정의 정보를 이용해 로그인을 합니다.
따라서 GPGS V2에서 로그인을 할 경우, GPGS V1 혹은 Sign in with Google으로 페데레이션 로그인을 한 유저는 연동이 불가능합니다.
using BackEnd;
using GooglePlayGames;
using GooglePlayGames.BasicApi;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
void Start() {
PlayGamesPlatform.Instance.Authenticate(ProcessAuthentication);
}
void ProcessAuthentication(SignInStatus status) {
if (status == SignInStatus.Success) {
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).
}
}
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("뒤끝 로그인 성공했습니다. " + callback);
});
});
});
}
}
ReturnCase
Success cases
로그인에 성공한 경우
statusCode : 200
message : Success
신규 회원가입에 성공한 경우
statusCode : 201
message : Success
Error cases
차단당한 계정일 경우
statusCode : 403
errorCode : 콘솔에서 입력한 차단된 사유
message : Forbidden blocked user, 금지된 blocked user
GPGS 로그인 에러 케이스
GPGS 로그인 실패 시 발생하는 에러는 GPGS github를 참고 부탁드리겠습니다.
GPGS 로그인 시도 시, 앱이 꺼지는 경우
Application ID(1040339826718) must be a numeric value. Please verify that your manifest refers to the correct project ID.
위와 같은 에러가 발생하는 경우, Assets > GooglePlayGames > Plugins > Android > GooglePlayGamesManifest > AndroidManifest.xml의
meta-data android:name="com.google.android.gms.games.APP_ID"에 해당하는 value 값의 \
를 \u003
으로 변경해 주시기 바랍니다.