Game > Gamebase > Android SDK 사용 가이드 > 인증

Login

Gamebase에서는 게스트 로그인을 기본으로 지원합니다.

Login Flow

많은 게임이 타이틀 화면에 로그인을 구현합니다.

  • 앱을 설치하고 처음 실행했을 때 타이틀 화면에서 게임 유저가 어떤 IdP(identity provider)로 인증할지 선택할 수 있게 합니다.
  • 한 번 로그인한 후에는 IdP 선택 화면을 표시하지 않고 이전에 로그인한 IdP 유형으로 인증합니다.

위에서 설명한 로직은 다음과 같은 순서로 구현할 수 있습니다.

last provider login flow idp login flow

1. 이전 로그인 유형으로 인증

  • 이전에 인증했던 기록이 있다면 ID와 비밀번호를 입력받지 않고 인증을 시도합니다.
  • Gamebase.loginForLastLoggedInProvider()를 호출합니다.

1-1. 인증이 성공한 경우

  • 축하합니다! 인증에 성공했습니다.
  • Gamebase.getUserID()로 사용자 ID를 획득하여 게임 로직을 구현하시면 됩니다.

1-2. 인증이 실패한 경우

  • 네트워크 오류
    • 오류 코드 SOCKET_ERROR(110) 또는 SOCKET_RESPONSE_TIMEOUT(101)인 경우, 일시적인 네트워크 문제로 인증이 실패한 것이므로 Gamebase.loginForLastLoggedInProvider()를 다시 호출하거나, 잠시 후 다시 시도합니다.
  • 이용 정지 게임 유저
    • 오류 코드가 BANNED_MEMBER(7)인 경우, 이용 정지 게임 유저이므로 인증에 실패한 것입니다.
    • BanInfo.from(exception)으로 제재 정보를 확인하여 게임 유저에게 게임을 할 수 없는 이유를 알려 주시기 바랍니다.
    • Gamebase 초기화 시 GamebaseConfiguration.Builder.enablePopup(true)enableBanPopup(true)를 호출한다면 Gamebase가 이용 정지에 관한 팝업 창을 자동으로 띄웁니다.
  • 그 외 오류
    • 이전 로그인 유형으로 인증에 실패했기 때문에 '2. 지정된 IdP로 인증'을 진행하시기 바랍니다.

2. 지정된 IdP로 인증

  • IdP 유형을 직접 지정하여 인증을 시도합니다.
    • 인증 가능한 유형은 AuthProvider 클래스에 선언돼 있습니다.
  • Gamebase.login(activity, idpType, callback) API를 호출합니다.

2-1. 인증에 성공한 경우

  • 축하합니다! 인증에 성공했습니다.
  • Gamebase.getUserID()로 사용자 ID를 획득하여 게임 로직을 구현하시면 됩니다.

2-2. 인증에 실패한 경우

  • 네트워크 오류
    • 오류 코드가 SOCKET_ERROR(110) 또는 SOCKET_RESPONSE_TIMEOUT(101)인 경우, 일시적인 네트워크 문제로 인증에 실패한 것이므로 Gamebase.login(activity, idpType, callback)을 다시 호출하거나, 잠시 후 다시 시도합니다.
  • 이용 정지 게임 유저
    • 오류 코드가 BANNED_MEMBER(7)인 경우, 이용 정지 게임 유저이므로 인증에 실패한 것입니다.
    • BanInfo.from(exception)으로 제재 정보를 확인하여 게임 유저에게 게임을 플레이할 수 없는 이유를 알려주시기 바랍니다.
    • Gamebase 초기화 시 GamebaseConfiguration.Builder.enablePopup(true)enableBanPopup(true)를 호출한다면 Gamebase가 이용 정지에 관한 팝업 창을 자동으로 띄웁니다.
  • 그 외 오류
    • 오류가 발생했다는 것을 게임 유저에게 알리고, 게임 유저가 인증 IdP 유형을 선택할 수 있는 상태(주로 타이틀 화면 또는 로그인 화면)로 되돌아갑니다.

Login as the Latest Login IdP

가장 최근에 로그인한 IdP로 로그인을 시도합니다.
해당 로그인에 대한 토큰이 만료되었거나, 토큰에 대한 검증 등이 실패하면 실패를 반환합니다.
이때는 해당 IdP에 대한 로그인을 구현해야 합니다.

  • AdditionalInfo 파라미터 설정 방법
keyname a use 값 종류
AuthProviderCredentialConstants.SHOW_LOADING_ANIMATION API 호출이 끝날 때까지 로딩 애니메이션을 표시 boolean
default: true

API

+ (void)Gamebase.loginForLastLoggedInProvider(Activity activity, GamebaseDataCallback<AuthToken> callback);
+ (void)Gamebase.loginForLastLoggedInProvider(Activity activity, Map<String, Object> additionalInfo, GamebaseDataCallback<AuthToken> callback);

Example

Gamebase.loginForLastLoggedInProvider(activity, new GamebaseDataCallback<AuthToken>() {
    @Override
    public void onCallback(AuthToken data, GamebaseException exception) {
        if (Gamebase.isSuccess(exception)) {
            // 로그인 성공
            Log.d(TAG, "Login successful");
            String userId = Gamebase.getUserID();
        } else {
            if (exception.getCode() == GamebaseError.SOCKET_ERROR ||
                    exception.getCode() == GamebaseError.SOCKET_RESPONSE_TIMEOUT) {
                // Socket error 로 일시적인 네트워크 접속 불가 상태임을 의미합니다.
                // 네트워크 상태를 확인하거나 잠시 대기 후 재시도 하세요.
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(2000);
                            onLoginForLastLoggedInProvider(activity);
                        } catch (InterruptedException e) {}
                    }
                }).start();
            } else if (exception.getCode() == GamebaseError.BANNED_MEMBER) {
                // 로그인을 시도한 게임 유저가 이용 정지 상태입니다.
                // GamebaseConfiguration.Builder.enablePopup(true).enableBanPopup(true) 를 호출하였다면
                // Gamebase가 이용 정지에 관한 팝업 창을 자동으로 띄워줍니다.
                //
                // Game UI에 맞게 직접 이용 정지 팝업 창을 구현하고자 한다면 BanInfo.from(exception)으로
                // 제재 정보를 확인하여 게임 유저에게 게임을 플레이할 수 없는 사유를 표시해 주시기 바랍니다.
                BanInfo banInfo = BanInfo.from(exception);
            } else {
                // 그 외의 오류가 발생하는 경우 지정된 IdP로 인증을 시도합니다.
                Gamebase.login(activity, provider, logincallback);
            }
        }
    }
});

Login with GUEST

Gamebase는 게스트 로그인을 지원합니다.

  • 디바이스의 유일한 키를 생성하여 Gamebase에 로그인을 시도합니다.
  • 게스트 로그인은 앱 삭제 또는 디바이스 초기화 시에 계정이 삭제될 수 있으므로 IdP를 활용한 로그인 방식을 권장합니다.

게스트 로그인을 구현하는 방법은 아래 예시 코드를 참고하세요.

API

+ (void)Gamebase.login(Activity activity, AuthProvider.GUEST, GamebaseDataCallback<AuthToken> callback);

Example

private static void onLoginForGuest(final Activity activity) {
    Gamebase.login(activity, AuthProvider.GUEST, new GamebaseDataCallback<AuthToken>() {
        @Override
        public void onCallback(AuthToken data, GamebaseException exception) {
            if (Gamebase.isSuccess(exception)) {
                // 로그인 성공
                Log.d(TAG, "Login successful");
                String userId = Gamebase.getUserID();
            } else {
                if (exception.getCode() == GamebaseError.SOCKET_ERROR ||
                        exception.getCode() == GamebaseError.SOCKET_RESPONSE_TIMEOUT) {
                    // Socket error 로 일시적인 네트워크 접속 불가 상태임을 의미합니다.
                    // 네트워크 상태를 확인하거나 잠시 대기 후 재시도 하세요.
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                Thread.sleep(2000);
                                onLoginForGuest(activity);
                            } catch (InterruptedException e) {}
                        }
                    }).start();
                } else if (exception.getCode() == GamebaseError.BANNED_MEMBER) {
                    // 로그인을 시도한 게임 유저가 이용 정지 상태입니다.
                    // GamebaseConfiguration.Builder.enablePopup(true).enableBanPopup(true) 를 호출하였다면
                    // Gamebase가 이용 정지에 관한 팝업 창을 자동으로 띄웁니다.
                    //
                    // Game UI에 맞게 직접 이용 정지 팝업 창을 구현하고자 한다면 BanInfo.from(exception)으로
                    // 제재 정보를 확인하여 게임 유저에게 게임을 플레이할 수 없는 사유를 표시해 주시기 바랍니다.
                    BanInfo banInfo = BanInfo.from(exception);
                } else {
                    // 로그인 실패
                    Log.e(TAG, "Login failed- "
                            + "errorCode: " + exception.getCode()
                            + "errorMessage: " + exception.getMessage());
                }
            }
        }
    });
}

Login with IdP

다음은 특정 IdP로 로그인할 수 있게 하는 예시 코드입니다.
로그인할 수 있는 IdP 유형은 AuthProvider 클래스에서 확인할 수 있습니다.

[주의]

PAYCO IdP는 인증 모듈임에도 외부 결제로 오탐되어 앱 스토어 심사에서 거절되는 경우가 발생하여 AuthProvider.PAYCO의 상수를 제공하지 않으므로 "payco" 라는 문자열을 직접 파라미터로 전달해야 합니다.

[주의]

LINE IdP는 Gamebase SDK 2.43.0부터 LINE 서비스 제공 지역을 설정할 수 있습니다. 해당 지역은 AdditionalInfo에 설정할 수 있습니다.

  • AdditionalInfo 파라미터 설정 방법
keyname a use 값 종류
AuthProviderCredentialConstants.SHOW_LOADING_ANIMATION API 호출이 끝날 때까지 로딩 애니메이션을 표시 boolean
default: true
AuthProviderCredentialConstants.LINE_CHANNEL_REGION LINE 서비스 제공 지역 설정 "japan"
"thailand"
"taiwan"
"indonesia"

API

+ (void)Gamebase.login(Activity activity, AuthProvider provider, GamebaseDataCallback<AuthToken> callback);
+ (void)Gamebase.login(Activity activity, AuthProvider provider, Map<String, Object> additionalInfo, GamebaseDataCallback<AuthToken> callback);

Example

private static void onLoginForGoogle(final Activity activity) {
    Gamebase.login(activity, AuthProvider.GOOGLE, new GamebaseDataCallback<AuthToken>() {
        @Override
        public void onCallback(AuthToken data, GamebaseException exception) {
            if (Gamebase.isSuccess(exception)) {
                // 로그인 성공
                Log.d(TAG, "Login successful");
                String userId = Gamebase.getUserID();
            } else {
                if (exception.getCode() == GamebaseError.SOCKET_ERROR ||
                        exception.getCode() == GamebaseError.SOCKET_RESPONSE_TIMEOUT) {
                    // Socket error 로 일시적인 네트워크 접속 불가 상태임을 의미합니다.
                    // 네트워크 상태를 확인하거나 잠시 대기 후 재시도 하세요.
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                Thread.sleep(2000);
                                onLoginForGoogle(activity);
                            } catch (InterruptedException e) {}
                        }
                    }).start();
                } else if (exception.getCode() == GamebaseError.BANNED_MEMBER) {
                    // 로그인을 시도한 유저가 이용 정지 상태입니다.
                    // GamebaseConfiguration.Builder.enablePopup(true).enableBanPopup(true) 를 호출하였다면
                    // Gamebase가 이용 정지에 관한 팝업 창을 자동으로 띄워줍니다.
                    //
                    // Game UI에 맞게 직접 이용 정지 팝업 창을 구현하고자 한다면 BanInfo.from(exception)으로
                    // 제재 정보를 확인하여 유저에게 게임을 플레이 할 수 없는 사유를 표시해 주시기 바랍니다.
                    BanInfo banInfo = BanInfo.from(exception);
                } else {
                    // 로그인 실패
                    Log.e(TAG, "Login failed- "
                            + "errorCode: " + exception.getCode()
                            + "errorMessage: " + exception.getMessage());
                }
            }
        }
    });
}

Login with Credential

IdP에서 제공하는 SDK를 사용해 게임에서 직접 인증한 후 발급 받은 Access Token 등을 이용하여, Gamebase에 로그인할 수 있는 인터페이스입니다.

  • Credential 파라미터 설정 방법
keyname a use 값 종류
AuthProviderCredentialConstants.PROVIDER_NAME IdP 유형 설정 AuthProvider.GOOGLE
AuthProvider.FACEBOOK
AuthProvider.NAVER
AuthProvider.TWITTER
AuthProvider.LINE
AuthProvider.HANGAME
AuthProvider.APPLEID
AuthProvider.WEIBO
AuthProvider.KAKAOGAME
"payco"
AuthProviderCredentialConstants.ACCESS_TOKEN IdP 로그인 이후 받은 인증 정보(Access Token) 설정
Google 인증 시에는 사용 안 함
AuthProviderCredentialConstants.AUTHORIZATION_CODE Google 로그인 이후 획득할 수 있는 OTAC(one time authorization code) 입력
AuthProviderCredentialConstants.GAMEBASE_ACCESS_TOKEN IdP 인증 정보가 아닌 Gamebase Access Token으로 로그인하는 경우 사용
AuthProviderCredentialConstants.IGNORE_ALREADY_LOGGED_IN Gamebase에 로그인한 상태에서 로그아웃을 하지 않고 다른 계정을 이용해 로그인을 시도하는 것을 허용 boolean
AuthProviderCredentialConstants.SHOW_LOADING_ANIMATION API 호출이 끝날 때까지 로딩 애니메이션을 표시 boolean
default: true
AuthProviderCredentialConstants.LINE_CHANNEL_REGION LINE 서비스 제공 지역 설정 Login with IdP 참고

[참고]

게임 내에서 외부 서비스(Facebook 등)의 고유 기능을 사용해야 할 때 필요할 수 있습니다.


[주의]

외부 SDK에서 지원 요구하는 개발 사항은 외부 SDK의 API를 사용해 구현해야 하며, Gamebase에서는 지원하지 않습니다.

API

+ (void)Gamebase.login(Activity activity, Map<String, Object> credentialInfo, GamebaseDataCallback<AuthToken> callback);

Example

private static void onLoginWithCredential(final Activity activity) {
    Map<String, Object> credentialInfo = new HashMap<>();
    credentialInfo.put(AuthProviderCredentialConstants.PROVIDER_NAME, AuthProvider.FACEBOOK);
    credentialInfo.put(AuthProviderCredentialConstants.ACCESS_TOKEN, facebookAccessToken);

    Gamebase.login(activity, credentialInfo, new GamebaseDataCallback<AuthToken>() {
        @Override
        public void onCallback(AuthToken data, GamebaseException exception) {
            if (Gamebase.isSuccess(exception)) {
                // 로그인 성공
                Log.d(TAG, "Login successful");
                String userId = Gamebase.getUserID();
            } else {
                if (exception.getCode() == GamebaseError.SOCKET_ERROR ||
                        exception.getCode() == GamebaseError.SOCKET_RESPONSE_TIMEOUT) {
                    // Socket error 로 일시적인 네트워크 접속 불가 상태임을 의미합니다.
                    // 네트워크 상태를 확인하거나 잠시 대기 후 재시도 하세요.
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                Thread.sleep(2000);
                                onLoginWithCredential(activity);
                            } catch (InterruptedException e) {}
                        }
                    }).start();
                } else if (exception.getCode() == GamebaseError.BANNED_MEMBER) {
                    // 로그인을 시도한 게임 유저가 이용 정지 상태입니다.
                    // GamebaseConfiguration.Builder.enablePopup(true).enableBanPopup(true) 를 호출하였다면
                    // Gamebase가 이용 정지에 관한 팝업 창을 자동으로 띄워줍니다.
                    //
                    // Game UI에 맞게 직접 이용 정지 팝업 창을 구현하고자 한다면 BanInfo.from(exception)으로
                    // 제재 정보를 확인하여 사용자에게 게임을 플레이할 수 없는 사유를 표시해 주시기 바랍니다.
                    BanInfo banInfo = BanInfo.from(exception);
                } else {
                    // 로그인 실패
                    Log.e(TAG, "Login failed- "
                            + "errorCode: " + exception.getCode()
                            + "errorMessage: " + exception.getMessage());
                }
            }
        }
    });
}

Authentication Additional Information Settings

Console Guide

Logout

로그인된 IdP에서 로그아웃을 시도합니다. 주로 게임의 설정 화면에 로그아웃 버튼을 두고, 버튼을 클릭하면 실행되도록 구현하는 경우가 많습니다. 로그아웃이 성공하더라도, 게임 유저 데이터는 유지됩니다. 로그아웃에 성공하면 해당 IdP로 인증했던 기록을 제거하므로 다음에 로그인할 때 ID, 비밀번호 입력 창이 표시됩니다.

다음은 로그아웃 버튼을 클릭하면 로그아웃이 되는 예시 코드입니다.

API

+ (void)Gamebase.logout(Activity activity, GamebaseCallback callback);

Example

private static void onLogout(final Activity activity) {
    Gamebase.logout(activity, new GamebaseCallback() {
        @Override
        public void onCallback(GamebaseException exception) {
            if (Gamebase.isSuccess(exception)) {
                // 로그아웃 성공
                Log.d(TAG, "Logout successful");
            } else {
                if (exception.getCode() == GamebaseError.SOCKET_ERROR ||
                        exception.getCode() == GamebaseError.SOCKET_RESPONSE_TIMEOUT) {
                    // Socket error 로 일시적인 네트워크 접속 불가 상태임을 의미합니다.
                    // 네트워크 상태를 확인하거나 잠시 대기 후 재시도 하세요.
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                Thread.sleep(2000);
                                onLogout(activity);
                            } catch (InterruptedException e) {}
                        }
                    }).start();
                } else {
                    // 로그아웃 실패
                    Log.e(TAG, "Logout failed- "
                            + "errorCode: " + exception.getCode()
                            + "errorMessage: " + exception.getMessage());
                }
            }
        }
    });
}

Withdraw

로그인 상태에서 탈퇴를 시도합니다.

  • 탈퇴 성공 시
  • 로그인했던 IdP의 게임 이용자 데이터는 삭제됩니다.
  • 해당 IdP로 다시 로그인할 수 있으며, 새로운 게임 이용자 데이터를 생성합니다.
  • 연동 중인 모든 IdP가 로그아웃 처리됩니다.
  • Gamebase 탈퇴를 의미하며, IdP 계정 탈퇴를 의미하지는 않습니다.

[주의]

여러 IdP를 연동 중인 경우, 모든 IdP 연동이 해제되고 Gamebase 유저 데이터가 삭제됩니다.

API

+ (void)Gamebase.withdraw(Activity activity, GamebaseCallback callback);

Example

private static void onWithdraw(final Activity activity) {
    Gamebase.withdraw(activity, new GamebaseCallback() {
        @Override
        public void onCallback(GamebaseException exception) {
            if (Gamebase.isSuccess(exception)) {
                // 탈퇴 성공
                Log.d(TAG, "Withdraw successful");
            } else {
                if (exception.getCode() == GamebaseError.SOCKET_ERROR ||
                        exception.getCode() == GamebaseError.SOCKET_RESPONSE_TIMEOUT) {
                    // Socket error 로 일시적인 네트워크 접속 불가 상태임을 의미합니다.
                    // 네트워크 상태를 확인하거나 잠시 대기 후 재시도 하세요.
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                Thread.sleep(2000);
                                onWithdraw(activity);
                            } catch (InterruptedException e) {}
                        }
                    }).start();
                } else {
                    // 탈퇴 실패
                    Log.e(TAG, "Withdraw failed- "
                            + "errorCode: " + exception.getCode()
                            + "errorMessage: " + exception.getMessage());
                }
            }
        }
    });
}

Mapping

매핑은 기존에 로그인된 계정에 다른 IdP의 계정을 연동하거나 해제시키는 기능입니다.

대다수의 게임에서는 게임 유저 계정 하나에 여러 IdP를 연동(매핑)할 수 있습니다.
Gamebase의 매핑 API를 사용하면 기존에 로그인된 계정에 다른 IdP 계정을 연동하거나 해제할 수 있습니다.

즉, 연동 중인 IdP 계정으로 로그인을 시도하면 항상 같은 사용자 ID로 로그인됩니다.

주의할 점은, IdP마다 하나의 계정만 연동할 수 있다는 점입니다.
예를 들어 Google 계정을 연동 중이면, 다른 Google 계정을 추가로 연동할 수 없습니다.
계정 연동 예시는 다음과 같습니다.

  • Gamebase 사용자 ID: 123bcabca
    • Google ID: aa
    • Facebook ID: bb
    • AppleID ID: cc
    • Twitter ID: dd
  • Gamebase 사용자 ID : 456abcabc
    • Google ID: ee
    • Google ID: ff -> 이미 Google ee 계정이 연동 중이므로 Google 계정을 추가로 연동할 수 없습니다.

매핑 API에는 매핑 추가와 매핑 해제 API가 있습니다.

[주의]

Guest 로그인 중에 매핑을 성공하면 Guest IdP는 사라집니다.

Add Mapping Flow

매핑은 다음 순서로 구현할 수 있습니다.

add mapping flow

1. 로그인

매핑은 현재 계정에 IdP 계정 연동을 추가하는 것이므로 우선 로그인이 돼 있어야 합니다. 먼저 로그인 API를 호출해 로그인합니다.

2. 매핑

Gamebase.addMapping(activity, idpType, callback)을 호출해 매핑을 시도합니다.

2-1. 매핑이 성공한 경우

  • 축하합니다! 현재 계정과 연동중인 IdP 계정이 추가되었습니다.
  • 매핑에 성공해도 '현재 로그인 중인 IdP'가 바뀌지는 않습니다. 즉, Google 계정으로 로그인한 후, Facebook 계정 매핑 시도가 성공했다고 해서 '현재 로그인 중인 IdP'가 Google에서 Facebook으로 변경되지는 않습니다. Google 상태로 유지됩니다.
    • [주의] : Guest 계정은 예외입니다. Guest 계정으로 로그인한 상태에서 시도한 매핑이 성공했다면 Guest IdP는 삭제되고 '현재 로그인 중인 IdP'도 매핑된 IdP로 변경됩니다.
  • 매핑은 단순히 IdP 연동만 추가해 줍니다.

2-2. 매핑이 실패한 경우

  • 네트워크 오류
    • 오류 코드가 SOCKET_ERROR(110) 또는 SOCKET_RESPONSE_TIMEOUT(101)인 경우, 일시적인 네트워크 문제로 인증이 실패한 것이므로 Gamebase.addMapping()을 다시 호출하거나, 잠시 대기했다가 재시도 합니다.
  • 이미 다른 계정에 연동 중일 때 발생하는 오류
    • 오류 코드가 AUTH_ADD_MAPPING_ALREADY_MAPPED_TO_OTHER_MEMBER(3302)인 경우, 매핑하려는 IdP의 계정이 이미 다른 계정에 연동 중이라는 뜻입니다. 이때 획득한 ForcingMappingTicket으로 강제 매핑(Gamebase.AddMappingForcibly())이나 로그인 계정 변경(Gamebase.ChangeLogin())을 시도할 수 있습니다.
  • 이미 동일한 IdP 계정에 연동돼 발생하는 오류
    • 오류 코드가 AUTH_ADD_MAPPING_ALREADY_HAS_SAME_IDP(3303)인 경우 매핑하려는 IdP와 같은 종류의 계정이 이미 연동 중이라는 뜻입니다.
      • Gamebase 매핑은 한 IdP당 하나의 계정만 연동 가능합니다. 예를 들어 PAYCO 계정에 이미 연동 중이라면 더 이상 PAYCO 계정을 추가할 수 없습니다.
      • 동일 IdP의 다른 계정을 연동하기 위해서는 Gamebase.removeMapping()을 호출해 연동을 해제한 후 다시 매핑을 시도하세요.
  • 그 외의 오류
    • 매핑 시도가 실패했습니다.

Add Mapping

특정 IdP에 로그인된 상태에서 다른 IdP로 매핑을 시도합니다.

  • AdditionalInfo 파라미터 설정 방법
keyname a use 값 종류
AuthProviderCredentialConstants.SHOW_LOADING_ANIMATION API 호출이 끝날 때까지 로딩 애니메이션을 표시 boolean
default: true
AuthProviderCredentialConstants.LINE_CHANNEL_REGION LINE 서비스 제공 지역 설정 Login with IdP 참고

다음은 Facebook에 매핑을 시도하는 예시입니다.

API

+ (void)Gamebase.addMapping(Activity activity, String providerName, GamebaseDataCallback<AuthToken> callback);
+ (void)Gamebase.addMapping(Activity activity, String providerName, Map<String, Object> additionalInfo, GamebaseDataCallback<AuthToken> callback);

Example

private static void addMappingForFacebook(final Activity activity) {
    String mappingProvider = AuthProvider.FACEBOOK;
    Gamebase.addMapping(activity, mappingProvider, new GamebaseDataCallback<AuthToken>() {
        @Override
        public void onCallback(AuthToken result, GamebaseException exception) {
            if (Gamebase.isSuccess(exception)) {
                // 매핑 추가 성공
                Log.d(TAG, "Add Mapping successful");
                String userId = Gamebase.getUserID();
                return;
            }

            // 매핑 추가 실패
            if (exception.getCode() == GamebaseError.SOCKET_ERROR ||
                    exception.getCode() == GamebaseError.SOCKET_RESPONSE_TIMEOUT) {
                // Socket error 로 일시적인 네트워크 접속 불가 상태임을 의미합니다.
                // 네트워크 상태를 확인하거나 잠시 대기 후 재시도 하세요.
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(2000);
                            addMappingForFacebook(activity);
                        } catch (InterruptedException e) {}
                    }
                }).start();
            } else if (exception.getCode() == GamebaseError.AUTH_ADD_MAPPING_ALREADY_MAPPED_TO_OTHER_MEMBER) {
                // Mapping을 시도하는 IdP계정이 이미 다른 계정에 연동되어 있습니다.
                // 강제로 연동을 해제하기 위해서는 해당 계정의 탈퇴나 Mapping 해제를 하거나, 다음과 같이
                // ForcingMappingTicket을 획득 후, addMappingForcibly() 메소드를 이용하여 강제 매핑을 시도합니다.
                Log.e(TAG, "Add Mapping failed- ALREADY_MAPPED_TO_OTHER_MEMBER");
                final ForcingMappingTicket forcingMappingTicket = ForcingMappingTicket.from(exception);
                Gamebase.addMappingForcibly(activity, forcingMappingTicket, new GamebaseDataCallback<AuthToken>() {
                    @Override
                    public void onCallback(AuthToken data, GamebaseException exception) {
                        ...
                        // 자세한 내용은 addMappingForcibly API 문서를 참고하세요.
                    }
                }
            } else if (exception.getCode() == GamebaseError.AUTH_ADD_MAPPING_ALREADY_HAS_SAME_IDP) {
                // Mapping을 시도하는 IdP의 계정이 이미 추가되어 있습니다.
                // Gamebase Mapping은 한 IdP당 하나의 계정만 연동 가능합니다.
                // IdP 계정을 변경하려면 이미 연동중인 계정은 Mapping 해제를 해야 합니다.
                Log.e(TAG, "Add Mapping failed- ALREADY_HAS_SAME_IDP");
            } else {
                // 매핑 추가 실패
                Log.e(TAG, "Add Mapping failed- "
                        + "errorCode: " + exception.getCode()
                        + "errorMessage: " + exception.getMessage());
            }
        }
    });
}

Add Mapping with Credential

게임에서 직접 IdP에서 제공하는 SDK로 먼저 인증하고 발급 받은 Access Token 등을 이용하여, Gamebase AddMapping을 할 수 있는 인터페이스입니다.

  • Credential 파라미터 설정방법
keyname a use 값 종류
AuthProviderCredentialConstants.PROVIDER_NAME IdP 유형 설정 AuthProvider.GOOGLE
AuthProvider.FACEBOOK
AuthProvider.NAVER
AuthProvider.TWITTER
AuthProvider.LINE
AuthProvider.APPLEID
AuthProvider.WEIBO
AuthProvider.KAKAOGAME
"payco"
AuthProviderCredentialConstants.ACCESS_TOKEN IdP 로그인 이후 받은 인증 정보(Access Token) 설정.
Google 인증 시에는 사용 안 함.
AuthProviderCredentialConstants.AUTHORIZATION_CODE Google 로그인 이후 획득할 수 있는 OTAC(one time authorization code) 입력
AuthProviderCredentialConstants.SHOW_LOADING_ANIMATION API 호출이 끝날 때까지 로딩 애니메이션을 표시 boolean
default: true
AuthProviderCredentialConstants.LINE_CHANNEL_REGION LINE 서비스 제공 지역 설정 Login with IdP 참고

[참고]

게임 내에서 외부 서비스(Facebook 등)의 고유 기능을 사용해야 할 때 필요할 수 있습니다.


[주의]

외부 SDK에서 지원 요구하는 개발사항은 외부 SDK의 API를 사용하여 구현해야 하며, Gamebase에서는 지원하지 않습니다.

API

+ (void)Gamebase.addMapping(Activity activity, Map<String, Object> credentialInfo, null, GamebaseDataCallback<AuthToken> callback);

Example

private static void addMappingWithCredential(final Activity activity) {
    Map<String, Object> credentialInfo = new HashMap<>();
    credentialInfo.put(AuthProviderCredentialConstants.PROVIDER_NAME, AuthProvider.FACEBOOK);
    credentialInfo.put(AuthProviderCredentialConstants.ACCESS_TOKEN, facebookAccessToken);

    Gamebase.addMapping(activity, credentialInfo, new GamebaseDataCallback<AuthToken>() {
        @Override
        public void onCallback(AuthToken data, GamebaseException exception) {
            if (Gamebase.isSuccess(exception)) {
                // 매핑 추가 성공
                Log.d(TAG, "Add Mapping successful");
                String userId = Gamebase.getUserID();
                return;
            }

            // 매핑 추가 실패
            if (exception.getCode() == GamebaseError.SOCKET_ERROR ||
                    exception.getCode() == GamebaseError.SOCKET_RESPONSE_TIMEOUT) {
                // Socket error 로 일시적인 네트워크 접속 불가 상태임을 의미합니다.
                // 네트워크 상태를 확인하거나 잠시 대기 후 재시도 하세요.
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(2000);
                            addMappingWithCredential(activity);
                        } catch (InterruptedException e) {}
                    }
                }).start();
            } else if (exception.getCode() == GamebaseError.AUTH_ADD_MAPPING_ALREADY_MAPPED_TO_OTHER_MEMBER) {
                // Mapping을 시도하는 IdP계정이 이미 다른 계정에 연동되어 있습니다.
                // 강제로 연동을 해제하기 위해서는 해당 계정의 탈퇴나 Mapping 해제를 하거나, 다음과 같이
                // ForcingMappingTicket을 획득 후, addMappingForcibly() 메소드를 이용하여 강제 매핑을 시도합니다.
                Log.e(TAG, "Add Mapping failed- ALREADY_MAPPED_TO_OTHER_MEMBER");
                final ForcingMappingTicket forcingMappingTicket = ForcingMappingTicket.from(exception);
                Gamebase.addMappingForcibly(activity, forcingMappingTicket, new GamebaseDataCallback<AuthToken>() {
                    @Override
                    public void onCallback(AuthToken data, GamebaseException exception) {
                        ...
                        // 자세한 내용은 addMappingForcibly API 문서를 참고하세요.
                    }
                }
            } else if (exception.getCode() == GamebaseError.AUTH_ADD_MAPPING_ALREADY_HAS_SAME_IDP) {
                // Mapping을 시도하는 IdP의 계정이 이미 추가되어 있습니다.
                // Gamebase Mapping은 한 IdP당 하나의 계정만 연동 가능합니다.
                // IdP계정을 변경하려면 이미 연동중인 계정은 Mapping 해제를 해야 합니다.
                Log.e(TAG, "Add Mapping failed- ALREADY_HAS_SAME_IDP");
            } else {
                // 매핑 추가 실패
                Log.e(TAG, "Add Mapping failed- "
                        + "errorCode: " + exception.getCode()
                        + "errorMessage: " + exception.getMessage());
            }
        }
    });
}

Add Mapping Forcibly

특정 IdP에 이미 매핑되어있는 계정이 있을 때, 강제로 매핑을 시도합니다. 강제 매핑을 시도할 때는 AddMapping API에서 획득한 ForcingMappingTicket이 필요합니다.

다음은 Facebook에 강제 매핑을 시도하는 예시입니다.

API

+ (void)Gamebase.addMappingForcibly(Activity activity, ForcingMappingTicket forcingMappingTicket, GamebaseDataCallback<AuthToken> callback);

// Legacy API
+ (void)Gamebase.addMappingForcibly(Activity activity, String providerName, String forcingMappingKey, GamebaseDataCallback<AuthToken> callback);
+ (void)Gamebase.addMappingForcibly(Activity activity, String providerName, String forcingMappingKey, Map<String, Object> additionalInfo, GamebaseDataCallback<AuthToken> callback);
+ (void)Gamebase.addMappingForcibly(Activity activity, Map<String, Object> credentialInfo, String forcingMappingKey, GamebaseDataCallback<AuthToken> callback);

Example

private static void addMappingForciblyFacebook(final Activity activity) {
    String mappingProvider = AuthProvider.FACEBOOK;
    Gamebase.addMapping(activity, mappingProvider, new GamebaseDataCallback<AuthToken>() {
        @Override
        public void onCallback(AuthToken result, GamebaseException exception) {
            if (Gamebase.isSuccess(exception)) {
                // 매핑 추가 성공
                Log.d(TAG, "Add Mapping successful");
                String userId = Gamebase.getUserID();
                return;
            }

            // 우선 addMapping API 호출 및 이미 연동되어 있는 계정으로 매핑을 시도하여, 다음과 같이 ForcingMappingTicket을 얻을 수 있습니다.
            if (exception.getCode() == GamebaseError.AUTH_ADD_MAPPING_ALREADY_MAPPED_TO_OTHER_MEMBER) {
                // ForcingMappingTicket 클래스의 from() 메소드를 이용하여 ForcingMappingTicket 인스턴스를 얻습니다.
                final ForcingMappingTicket forcingMappingTicket = ForcingMappingTicket.from(exception);

                // 강제 매핑을 시도합니다.
                Gamebase.addMappingForcibly(activity, forcingMappingTicket, new GamebaseDataCallback<AuthToken>() {
                    @Override
                    public void onCallback(AuthToken data, GamebaseException addMappingForciblyException) {
                        if (Gamebase.isSuccess(addMappingForciblyException)) {
                            // 강제 매핑 추가 성공
                            Log.d(TAG, "Add Mapping Forcibly successful");
                            String userId = Gamebase.getUserID();
                            return;
                        }

                        // 강제 매핑 추가 실패
                        // 오류 코드를 확인하고 적절한 처리를 진행합니다.
                    }
                }
            } else {
                ...
            }
        }
    });
}

Change Login with ForcingMappingTicket

특정 IdP에 이미 매핑되어 있는 계정이 있을 때, 현재 계정을 로그아웃하고 이미 매핑되어 있던 해당 계정으로 로그인합니다. 이때, AddMapping API에서 획득한 ForcingMappingTicket이 필요합니다.

Change Login API 호출이 실패하는 경우, Gamebase 로그인 상태는 기존의 UserID로 유지됩니다.

다음은 Facebook으로 매핑 시도 후 Facebook에 이미 매핑된 계정이 존재하자, 해당 계정으로 로그인을 변경하는 예시입니다.

API

+ (void)Gamebase.changeLogin(Activity activity, ForcingMappingTicket forcingMappingTicket, GamebaseDataCallback<AuthToken> callback);

Example

private static void changeLoginFacebook(final Activity activity) {
    String mappingProvider = AuthProvider.FACEBOOK;
    Gamebase.addMapping(activity, mappingProvider, new GamebaseDataCallback<AuthToken>() {
        @Override
        public void onCallback(AuthToken result, GamebaseException exception) {
            if (Gamebase.isSuccess(exception)) {
                // 매핑 추가 성공
                Log.d(TAG, "Add Mapping successful");
                String userId = Gamebase.getUserID();
                return;
            }

            // 우선 addMapping API 호출 및, 이미 연동되어있는 계정으로 매핑을 시도하여, 다음과 같이, ForcingMappingTicket을 얻을 수 있습니다.
            if (exception.getCode() == GamebaseError.AUTH_ADD_MAPPING_ALREADY_MAPPED_TO_OTHER_MEMBER) {
                // ForcingMappingTicket 클래스의 from() 메소드를 이용하여 ForcingMappingTicket 인스턴스를 얻습니다.
                final ForcingMappingTicket forcingMappingTicket = ForcingMappingTicket.from(exception);

                // ForcingMappingTicket의 UserID로 로그인합니다.
                Gamebase.changeLogin(activity, forcingMappingTicket, new GamebaseDataCallback<AuthToken>() {
                    @Override
                    public void onCallback(AuthToken data, GamebaseException changeLoginException) {
                        if (Gamebase.isSuccess(changeLoginException)) {
                            // 로그인 변경 성공
                            Log.d(TAG, "Change Login successful");
                            String userId = Gamebase.getUserID();
                            return;
                        }

                        // 로그인 변경 실패
                        // 오류 코드를 확인하고 적절한 처리를 진행합니다.
                    }
                }
            } else {
                ...
            }
        }
    });
}

Remove Mapping

특정 IdP에 대한 연동을 해제합니다. 만약, 현재 로그인 중인 계정을 해제하려고 하면 실패를 반환합니다.
연동 해제 후에는 Gamebase 내부에서, 해당 IdP에 대한 로그아웃을 처리합니다.

API

+ (void)Gamebase.removeMapping(Activity activity, String providerName, null, GamebaseDataCallback<AuthToken> callback);

Example

private static void removeMappingForFacebook(final Activity activity) {
    Gamebase.removeMapping(activity, AuthProvider.FACEBOOK, new GamebaseCallback() {
        @Override
        public void onCallback(GamebaseException exception) {
            if (Gamebase.isSuccess(exception)) {
                // 매핑 해제 성공
                Log.d(TAG, "Remove mapping successful");
            } else {
                if (exception.getCode() == GamebaseError.SOCKET_ERROR ||
                        exception.getCode() == GamebaseError.SOCKET_RESPONSE_TIMEOUT) {
                    // Socket error 로 일시적인 네트워크 접속 불가 상태임을 의미합니다.
                    // 네트워크 상태를 확인하거나 잠시 대기 후 재시도 하세요.
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                Thread.sleep(2000);
                                removeMappingForFacebook(activity);
                            } catch (InterruptedException e) {}
                        }
                    }).start();
                } else if (exception.getCode() == GamebaseError.AUTH_REMOVE_MAPPING_LOGGED_IN_IDP) {
                    // 로그인중인 계정으로는 Mapping 해제를 할 수 없습니다.
                    // 다른 계정으로 로그인 하여 Mapping 해제 하거나 탈퇴하여야 합니다.
                    Log.e(TAG, "Remove Mapping failed- LOGGED_IN_IDP");
                } else {
                    // 매핑 해제 실패
                    Log.e(TAG, "Remove mapping failed- "
                            + "errorCode: " + exception.getCode()
                            + "errorMessage: " + exception.getMessage());
                }
            }
        }
    });
}

Gamebase User`s Information

Gamebase로 인증 절차를 진행한 후, 앱을 제작할 때 필요한 정보를 얻을 수 있습니다.

Get Authentication Information for Gamebase

Gamebase에서 발급한 인증 정보를 가져올 수 있습니다.

API

+ (String)Gamebase.getUserID();
+ (String)Gamebase.getAccessToken();
+ (String)Gamebase.getLastLoggedInProvider();

Example


// Obtaining Gamebase UserID
String userId = Gamebase.getUserID();

// Obtaining Gamebase AccessToken
String accessToken = Gamebase.getAccessToken();

// Obtaining Last Logged In Provider
String lastLoggedInProvider = Gamebase.getLastLoggedInProvider();

Get Authentication Information for External IdP

[주의]

  • 외부 IdP의 인증 정보는 보안을 위해 게임 서버에서 호출할 것을 권장합니다.
  • IdP에 따라 Access Token이 빠른 시간에 만료될 수 있습니다.
    • 예를 들어 Google은 로그인 2시간 후에는 Access Token이 만료되어 버립니다.
    • 사용자 정보가 필요하다면 로그인 후 바로 Gamebase Server API를 호출하시기 바랍니다.
  • "Gamebase.loginForLastLoggedInProvider()" API로 로그인한 경우에는 인증 정보를 가져올 수 없습니다.
    • 사용자 정보가 필요하다면 "Gamebase.loginForLastLoggedInProvider()" 대신, 사용하고자 하는 IDPCode와 동일한 {IDP_CODE}를 파라미터로 하여 "Gamebase.login(activity, IDP_CODE, callback)" API로 로그인 해야 합니다.

Get Banned User Information

Gamebase Console에 제재된 게임 유저로 등록될 경우, 로그인을 시도하면 아래와 같은 이용 제한 정보 코드가 표시될 수 있습니다. BanInfo.from(exception) 메서드를 이용해 제재 정보를 확인할 수 있습니다.

  • BANNED_MEMBER(7)

TransferAccount

게스트 계정을 다른 단말기로 이전하기 위해 계정 이전을 위한 키를 발급받는 기능입니다.

이 키를 TransferAccountInfo 라고 부릅니다. 발급 받은 TransferAccountInfo는 다른 단말기에서 requestTransferAccount API를 호출하여 계정 이전을 할 수 있습니다.

[주의]
TransferAccountInfo의 발급은 게스트 로그인 상태에서만 발급이 가능합니다. TransferAccountInfo를 이용한 계정 이전은 게스트 로그인 상태 또는 로그인되어 있지 않은 상태에서만 가능합니다. 로그인한 게스트 계정이 이미 다른 외부 IdP (Google, Facebook, PAYCO 등) 계정과 매핑이 되어 있다면 계정 이전이 지원되지 않습니다.

Issue TransferAccount

게스트 계정 이전을 위한 TransferAccountInfo를 발급합니다.

API

+ (void)Gamebase.issueTransferAccount(final GamebaseDataCallback<TransferAccountInfo> callback);

Example

Gamebase.issueTransferAccount(new GamebaseDataCallback<TransferAccountInfo>() {
    @Override
    public void onCallback(final TransferAccountInfo transferAccount, final GamebaseException exception) {
        if (!Gamebase.isSuccess(exception)) {
            // Issuing TransferAccount failed.
            return;
        }

        // Issuing TransferAccount success.
        final String account = transferAccount.account.id;
        final String password = transferAccount.account.password;
    }
});

Query TransferAccount

게스트 계정 이전을 위해 이미 발급 받은 TransferAccountInfo 정보를 게임베이스 서버에 질의합니다.

API

+ (void)Gamebase.queryTransferAccount(final GamebaseDataCallback<TransferAccountInfo> callback);

Example

Gamebase.queryTransferAccount(new GamebaseDataCallback<TransferAccountInfo>() {
    @Override
    public void onCallback(final TransferAccountInfo transferAccount, final GamebaseException exception) {
        if (!Gamebase.isSuccess(exception)) {
            // Querying TransferAccount failed.
            return;
        }

        // Querying TransferAccount success.
        final String account = transferAccount.account.id;
        final String password = transferAccount.account.password;
    }
});

Renew TransferAccount

이미 발급 받은 TransferAccountInfo 정보를 갱신합니다. "자동 갱신", "수동 갱신"의 방법이 있으며, "Password만 갱신", "ID와 Password 모두 갱신" 등의 설정을 통해 TransferAccountInfo 정보를 갱신 할 수 있습니다.

+ (void)Gamebase.renewTransferAccount(final TransferAccountRenewConfiguration config, final GamebaseDataCallback<TransferAccountInfo> callback);

Example

// If you want renew the account automatically, use this config.
final RenewalTargetType renewalTargetType = RenewalTargetType.ID_PASSWORD; // RenewalTargetType.PASSWORD
final TransferAccountRenewConfiguration autoConfig = TransferAccountRenewConfiguration.newAutoRenewConfiguration(renewalTargetType);

// If you want renew the account manually, use this config.
final TransferAccountRenewConfiguration manualConfig = TransferAccountRenewConfiguration.newManualRenewConfiguration("id", "password");
Gamebase.renewTransferAccount(autoConfig, new GamebaseDataCallback<TransferAccountInfo>() {
    @Override
    public void onCallback(final TransferAccountInfo transferAccountInfo, final GamebaseException exception) {
        if (!Gamebase.isSuccess(exception)) {
            // Renewing TransferAccount failed.
            return;
        }

        // Renewing TransferAccount success.
        final String renewedAccount = transferAccount.account.id;
        final String renewedPassword = transferAccount.account.password;
    }
});

Transfer Guest Account to Another Device

issueTransfer API로 발급 받은 TransferAccount를 통해 계정을 이전하는 기능입니다. 계정 이전 성공 시 TransferAccount를 발급 받은 단말기에서 이전 완료 메시지가 표시될 수 있고, 게스트 로그인 시 새로운 계정이 생성됩니다. 계정 이전이 성공한 단말기에서는 TransferAccount를 발급받았던 단말기의 게스트 계정을 계속해서 사용할 수 있습니다.

주의

  • 이미 게스트 로그인이 되어 있는 상태에서 이전이 성공하게 되면, 단말기에 로그인되어 있던 게스트 계정은 유실됩니다.
  • 만일 잘못된 id/password를 연속해서 입력하면 AUTH_TRANSFERACCOUNT_BLOCK(3042) 오류가 발생하며 계정 이전이 일정 시간 차단됩니다. 이 경우에는 아래의 예제와 같이 TransferAccountFailInfo 값을 통해 언제까지 계정 이전이 차단되는지 유저에게 알려줄 수 있습니다.

API

+ (void)Gamebase.transferAccountWithIdPLogin(String accountId, String accountPassword, GamebaseDataCallback<AuthToken> callback);

Example

Gamebase.transferAccountWithIdPLogin(accountId, accountPassword, new GamebaseDataCallback<AuthToken>() {
    @Override
    public void onCallback(AuthToken authToken, GamebaseException exception) {
        if (!Gamebase.isSuccess(exception)) {
            // Transfering Account failed.
            TransferAccountFailInfo failInfo = TransferAccountFailInfo.from(exception);
            if (failInfo != null) {
                // Transfering Account failed by entering the wrong id / pw multiple times.
                // You can tell when the account transfer is blocked by the TransferAccountFailInfo.
                String failedId = failInfo.id;
                int failCount = failInfo.failCount;
                Date blockedDate = new Date(failInfo.blockEndDate);
                return;
            }

            // Transfering Account failed by another reason.
            return;
        }

        // Transfering Account success.
        // TODO: implements post login process
    }
});

TemporaryWithdrawal

'탈퇴 유예' 기능입니다. 임시 탈퇴를 요청하여 즉시 탈퇴가 진행되지 않고 일정 기간의 유예 기간이 지나면 탈퇴가 이루어집니다. 유예 기간은 콘솔에서 변경할 수 있습니다.

주의

탈퇴 유예 기능을 사용하는 경우에는 Gamebase.withdraw() API 를 사용하지 마세요. Gamebase.withdraw() API 는 즉시 계정을 탈퇴합니다.

로그인이 성공하면 AuthToken.getTemporaryWithdrawalInfo() API 를 호출하여 탈퇴 유예 상태인 유저인지 판단할 수 있습니다.

Request TemporaryWithdrawal

임시 탈퇴를 요청합니다. 콘솔에 지정된 기간이 지나면 자동으로 탈퇴 진행이 완료됩니다.

API

+ (void)Gamebase.TemporaryWithdrawal.requestWithdrawal(@NonNull Activity activity,
                                                       @Nullable GamebaseDataCallback<TemporaryWithdrawalInfo> callback);

ErrorCode

Error Code Description
AUTH_WITHDRAW_ALREADY_TEMPORARY_WITHDRAW(3602) 이미 임시 탈퇴를 요청한 유저입니다.

Example

public static void testRequestWithdraw() {
    Gamebase.TemporaryWithdrawal.requestWithdrawal(new GamebaseCallback() {
        @Override
        public void onCallback(TemporaryWithdrawalInfo data GamebaseException exception) {
            if (!Gamebase.isSuccess(exception)) {
                if (exception.getCode() == GamebaseError.AUTH_WITHDRAW_ALREADY_TEMPORARY_WITHDRAW) {
                    // Already requested temporary withdrawal before.
                } else {
                    // Request temporary withdrawal failed.
                    return;
                }
            }

            // Request temporary withdrawal success.
        }
    });
}

Check TemporaryWithdrawal User

탈퇴 유예를 사용하는 게임은 로그인 후 항상 AuthToken.getTemporaryWithdrawalInfo() API 를 호출하여, 결과가 null 이 아닌 유효한 TemporaryWithdrawalInfo 객체를 반환한다면 해당 유저에게 탈퇴 진행중이라는 사실을 알려주어야 합니다.

Example

public static void testLogin() {
    Gamebase.login(activity, provider, new GamebaseDataCallback<AuthToken>() {
        @Override
        public void onCallback(AuthToken data, GamebaseException exception) {
            if (!Gamebase.isSuccess(exception)) {
                // Login failed
                return;
            }

            // Check if user is requesting withdrawal
            if (data.getTemporaryWithdrawalInfo() != null) {
                // User is under temporary withdrawal
                long gracePeriodDate = data.getTemporaryWithdrawalInfo().getGracePeriodDate();
            } else {
                // Login success.
            }
        }
    });
}

Cancel TemporaryWithdrawal

탈퇴를 요청을 취소합니다. 탈퇴 요청 후 기간이 만료되어 탈퇴가 완료되면 취소가 불가능합니다.

API

+ (void)Gamebase.TemporaryWithdrawal.cancelWithdrawal(@NonNull Activity activity,
                                                      @Nullable GamebaseCallback callback);

ErrorCode

Error Code Description
AUTH_WITHDRAW_NOT_TEMPORARY_WITHDRAW(3603) 임시 탈퇴를 요청한 유저가 아닙니다.

Example

public static void testCancelWithdraw() {
    Gamebase.TemporaryWithdrawal.cancelWithdrawal(new GamebaseCallback() {
        @Override
        public void onCallback(final GamebaseException exception) {
            if (!Gamebase.isSuccess(exception)) {
                if (exception.getCode() == GamebaseError.AUTH_WITHDRAW_NOT_TEMPORARY_WITHDRAW) {
                    // Never requested temporary withdrawal before.
                } else {
                    // Cancel temporary withdrawal failed.
                    return;
                }
            }

            // Cancel temporary withdrawal success.
        }
    });
}

Withdraw Immediately

탈퇴 유예 기간을 무시하고 즉시 탈퇴를 진행합니다. 실제 내부 동작은 Gamebase.withdraw() API 와 동일합니다.

즉시 탈퇴는 취소가 불가능하므로 유저에게 실행 여부를 거듭 확인하시기 바랍니다.

API

+ (void)Gamebase.TemporaryWithdrawal.withdrawImmediately(@NonNull Activity activity,
                                                         @Nullable GamebaseCallback callback);

Example

public static void testWithdrawImmediately() {
    Gamebase.TemporaryWithdrawal.withdrawImmediately(activity, new GamebaseCallback() {
        @Override
        public void onCallback(final GamebaseException exception) {
            if (!Gamebase.isSuccess(exception)) {
                // Withdraw failed.
                return;
            }

            // Withdraw success.
        }
    });
}

GraceBan

  • '결제 어뷰징 자동 해제' 기능입니다.
    • 결제 어뷰징 자동 해제 기능은 결제 어뷰징 자동 제재로 이용 정지가 되어야 할 사용자가 '이용 정지 유예 상태' 후 이용 정지가 되도록 합니다.
    • '이용 정지 유예 상태'일 경우, 설정한 기간 내에 이용 정지 해제 조건을 모두 만족하면 정상적으로 플레이할 수 있습니다.
    • 기간 내에 조건을 충족하지 못하면 이용 정지가 됩니다.
  • 결제 어뷰징 자동 해제 기능을 사용하는 게임은 로그인 후 항상 AuthToken.getGraceBanInfo() API를 호출하여, 결과가 null이 아닌 유효한 GraceBanInfo 객체를 반환한다면 해당 유저에게 이용 정지 해제 조건, 기간 등을 안내해야 합니다.
    • 이용 정지 유예 상태인 유저의 게임 내 접근 제어는 게임에서 처리해야 합니다.

Example

public static void testLogin() {
    Gamebase.login(activity, provider, new GamebaseDataCallback<AuthToken>() {
        @Override
        public void onCallback(AuthToken token, GamebaseException exception) {
            if (!Gamebase.isSuccess(exception)) {
                // Login failed
                return;
            }

            // Check if user is under grace ban
            GraceBanInfo graceBanInfo = token.getGraceBanInfo();
            if (graceBanInfo != null) {
                String periodDate = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.getDefault())
                        .format(new Date(graceBanInfo.getGracePeriodDate()));
                String message = URLDecoder.decode(graceBanInfo.getMessage(), "utf-8");
                GraceBanInfo.ReleaseRuleCondition releaseRuleCondition =
                            graceBanInfo.releaseRuleCondition();
                GraceBanInfo.PaymentStatus paymentStatus = graceBanInfo.getPaymentStatus();
                if (releaseRuleCondition != null) {
                    // condition type : "AND", "OR"
                    String releaseRule = releaseRuleCondition.getAmount() +
                            releaseRuleCondition.getCurrency() +
                            " " + releaseRuleCondition.getConditionType() + " " +
                            releaseRuleCondition.getCount() + "time(s)";
                }
                if (paymentStatus != null) {
                    String paidAmount = paymentStatus.getAmount() + paymentStatus.getCurrency();
                    String paidCount = paymentStatus.getCount() + "time(s)";
                }
                // Guide the user through the UI how to finish the grace ban status.
            } else {
                // Login success.
            }
        }
    });
}

Error Handling

Category Error Error Code Description
Auth INVALID_MEMBER 6 잘못된 회원에 대한 요청입니다.
BANNED_MEMBER 7 제재된 회원입니다.
AUTH_USER_CANCELED 3001 로그인이 취소되었습니다.
AUTH_NOT_SUPPORTED_PROVIDER 3002 지원하지 않는 인증 방식입니다.
AUTH_NOT_EXIST_MEMBER 3003 존재하지 않거나 탈퇴한 회원입니다.
AUTH_EXTERNAL_LIBRARY_INITIALIZATION_ERROR 3006 외부 인증 라이브러리 초기화에 실패하였습니다.
AUTH_EXTERNAL_LIBRARY_ERROR 3009 외부 인증 라이브러리 오류입니다.
상세 오류를 확인하십시오.
AUTH_ALREADY_IN_PROGRESS_ERROR 3010 이전 인증 프로세스가 완료되지 않았습니다.
AUTH_INVALID_GAMEBASE_TOKEN 3011 Gamebase Access Token이 유효하지 않아 로그아웃되었습니다.
로그인을 다시 시도하십시오.
TransferAccount SAME_REQUESTOR 8 발급한 TransferAccount를 동일한 단말기에서 사용했습니다.
NOT_GUEST_OR_HAS_OTHERS 9 게스트가 아닌 계정에서 이전을 시도했거나, 계정에 게스트 이외의 IdP가 연동되어 있습니다.
AUTH_TRANSFERACCOUNT_EXPIRED 3041 TransferAccount의 유효기간이 만료됐습니다.
AUTH_TRANSFERACCOUNT_BLOCK 3042 잘못된 TransferAccount를 여러번 입력하여 계정 이전 기능이 잠겼습니다.
AUTH_TRANSFERACCOUNT_INVALID_ID 3043 TransferAccount의 Id가 유효하지 않습니다.
AUTH_TRANSFERACCOUNT_INVALID_PASSWORD 3044 TransferAccount의 Password가 유효하지 않습니다.
AUTH_TRANSFERACCOUNT_CONSOLE_NO_CONDITION 3045 TransferAccount 설정이 되어있지 않습니다.
NHN Cloud Gamebase Console에서 먼저 설정해주세요.
AUTH_TRANSFERACCOUNT_NOT_EXIST 3046 TransferAccount가 존재하지 않습니다. TransferAccount를 먼저 발급받아주세요.
AUTH_TRANSFERACCOUNT_ALREADY_EXIST_ID 3047 TransferAccount가 이미 존재합니다.
AUTH_TRANSFERACCOUNT_ALREADY_USED 3048 TransferAccount가 이미 사용되었습니다.
Auth (Login) AUTH_TOKEN_LOGIN_FAILED 3101 토큰 로그인에 실패했습니다.
AUTH_TOKEN_LOGIN_INVALID_TOKEN_INFO 3102 토큰 정보가 유효하지 않습니다.
AUTH_TOKEN_LOGIN_INVALID_LAST_LOGGED_IN_IDP 3103 최근에 로그인한 IdP 정보가 없습니다.
IdP Login AUTH_IDP_LOGIN_FAILED 3201 IdP 로그인에 실패했습니다.
AUTH_IDP_LOGIN_INVALID_IDP_INFO 3202 IdP 정보가 유효하지 않습니다. (Console에 해당 IdP 정보가 없습니다.)
Add Mapping AUTH_ADD_MAPPING_FAILED 3301 매핑 추가에 실패했습니다.
AUTH_ADD_MAPPING_ALREADY_MAPPED_TO_OTHER_MEMBER 3302 이미 다른 멤버에 매핑돼 있습니다.
AUTH_ADD_MAPPING_ALREADY_HAS_SAME_IDP 3303 이미 같은 IdP에 매핑돼 있습니다.
AUTH_ADD_MAPPING_INVALID_IDP_INFO 3304 IdP 정보가 유효하지 않습니다. (Console에 해당 IdP 정보가 없습니다.)
AUTH_ADD_MAPPING_CANNOT_ADD_GUEST_IDP 3305 게스트 IdP로는 AddMapping이 불가능합니다.
Add Mapping Forcibly AUTH_ADD_MAPPING_FORCIBLY_NOT_EXIST_KEY 3311 강제 매핑 키(ForcingMappingKey)가 존재하지 않습니다.
ForcingMappingTicket을 다시 한번 확인해주세요.
AUTH_ADD_MAPPING_FORCIBLY_ALREADY_USED_KEY 3312 강제 매핑 키(ForcingMappingKey)가 이미 사용되었습니다.
AUTH_ADD_MAPPING_FORCIBLY_EXPIRED_KEY 3313 강제 매핑 키(ForcingMappingKey)의 유효기간이 만료되었습니다.
AUTH_ADD_MAPPING_FORCIBLY_DIFFERENT_IDP 3314 강제 매핑 키(ForcingMappingKey)가 다른 IdP에 사용되었습니다.
발급 받은 ForcingMappingKey는 같은 IdP에 강제 매핑을 시도 하는데 사용됩니다.
AUTH_ADD_MAPPING_FORCIBLY_DIFFERENT_AUTHKEY 3315 강제 매핑 키(ForcingMappingKey)가 다른 계정에 사용되었습니다.
발급 받은 ForcingMappingKey는 같은 IdP 및 계정에 강제 매핑을 시도 하는데 사용됩니다.
Remove Mapping AUTH_REMOVE_MAPPING_FAILED 3401 매핑 삭제에 실패했습니다.
AUTH_REMOVE_MAPPING_LAST_MAPPED_IDP 3402 마지막에 매핑된 IdP는 삭제할 수 없습니다.
AUTH_REMOVE_MAPPING_LOGGED_IN_IDP 3403 현재 로그인되어 있는 IdP입니다.
Logout AUTH_LOGOUT_FAILED 3501 로그아웃에 실패했습니다.
Withdrawal AUTH_WITHDRAW_FAILED 3601 탈퇴에 실패했습니다.
AUTH_WITHDRAW_ALREADY_TEMPORARY_WITHDRAW 3602 이미 임시 탈퇴를 요청한 유저입니다.
AUTH_WITHDRAW_NOT_TEMPORARY_WITHDRAW 3603 임시 탈퇴를 요청한 유저가 아닙니다.
Not Playable AUTH_NOT_PLAYABLE 3701 플레이할 수 없는 상태입니다(점검 또는 서비스 종료 등).
Auth(Unknown) AUTH_UNKNOWN_ERROR 3999 알수 없는 오류입니다.(정의되지 않은 오류입니다).
  • 전체 오류 코드는 다음 문서를 참고하시기 바랍니다.

AUTH_EXTERNAL_LIBRARY_ERROR

  • 이 오류는 외부 인증 라이브러리에서 오류가 발생했을 때 반환됩니다.
  • 외부 인증 라이브러리에서 발생한 오류 정보는 상세 오류에 포함되어 있으며 상세한 오류 코드 및 메시지는 다음과 같이 확인할 수 있습니다.
Gamebase.login(activity, provider, new GamebaseDataCallback<AuthToken>() {
    @Override
    public void onCallback(AuthToken data, GamebaseException exception) {
        if (Gamebase.isSuccess(exception)) {
            Log.d(TAG, "Login successful");
            ...
        } else {
            Log.e(TAG, "Login failed");

            // Gamebase Error Info
            int errorCode = exception.getCode();
            String errorMessage = exception.getMessage();

            if (errorCode == GamebaseError.AUTH_EXTERNAL_LIBRARY_ERROR) {
                // Third Party Detail Error Info
                int moduleErrorCode = exception.getDetailCode();
                String moduleErrorMessage = exception.getDetailMessage();

                ...
            }
        }
    }
});
  • 상세 오류 코드는 각각의 외부 인증 라이브러리의 Developer 페이지를 참고하시기 바랍니다.
TOP