Gamebaseでは基本的にゲストログインに対応しています。
多くのゲームがタイトル画面にログインを設計しています。
上述したロジックは、次のような手順で設計することができます。
最後にログインしたIdPでログインを試みます。
該当するログイントークンの期限が切れていたり、トークン検証などに失敗した場合、失敗を返します。
この場合、該当するIdPに対するログインを設計する必要があります。
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);
}
}
}
}
Gamebaseは、ゲストログインに対応しています。
ゲストログインを設計する方法については、次のコード例をご参考ください。
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());
}
}
}
});
}
次は特定のIdPでログインできるようにするコード例です。
ログイン可能なIdPのタイプは、AuthProviderクラスから確認することができます。
[注意]
PAYCO IdPは、iOSで認証モジュールであるにもかかわらず、外部決済と誤認されてリジェクトされるケースが発生して 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.AUTH_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());
}
}
}
});
}
IdPが提供するSDKを使ってゲームで直接認証した後、発行されたアクセストークンなどを利用してGamebaseにログインできるインターフェースです。
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 AuthProvider.GPGS_V2 "payco" |
AuthProviderCredentialConstants.ACCESS_TOKEN | IdPログイン後に取得した認証情報(アクセストークン)の設定 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());
}
}
}
});
}
ログインされた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());
}
}
}
});
}
ログイン状態で退会を試行します。
[注意]
複数の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());
}
}
}
});
}
マッピングは、既にログインされているアカウントに他のIdPアカウントを連携させたり、解除する機能です。
ほとんどのゲームにおいて、一つのゲームユーザーアカウントに複数のIdPを連携(マッピング)させることができます。
GamebaseのマッピングAPIを使用すれば、既にログインされているアカウントに他のIdPアカウントを連携させたり、解除することができます。
つまり、連携中のIdPアカウントでログインを試みる場合、常に同じユーザーIDでログインされることになります。
注意すべき点は、各IdPは一つのアカウントにのみ連携させることができるという点です。
例えば、Googleアカウントに連携中の場合、他のGoogleアカウントを追加で連携させることはできません。
アカウント連携の例は、次の通りです。
マッピングAPIにはマッピング追加APIとマッピング解除APIがあります。
[注意]
Guestログイン中にMappingに成功するとGuest IdPは消滅します。
マッピングは、次の手順で設計することができます。
マッピングは、現在のアカウントにIdPアカウントの連携を追加する機能であるため、ログインされた状態でなければなりません。 まず、ログインAPIを呼び出してログインします。
Gamebase.addMapping(activity, idpType, callback)を呼び出してマッピングを試みます。
特定のIdPにログインされた状態で他のIdPへのマッピングを試みます。
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());
}
}
});
}
ゲームで直接IdPのSDKで取得したアクセストークンを用いてGamebase AddMappingをするインターフェースです。
keyname | a use | 値の種類 |
---|---|---|
AuthProviderCredentialConstants.PROVIDER_NAME | IdPタイプの設定 | AuthProvider.GOOGLE AuthProvider.FACEBOOK AuthProvider.NAVER AuthProvider.TWITTER AuthProvider.LINE AuthProvider.APPLEID AuthProvider.WEIBO AuthProvider.KAKAOGAME AuthProvider.GPGS_V2 "payco" |
AuthProviderCredentialConstants.ACCESS_TOKEN | IdPログイン後に取得した認証情報(アクセストークン)の設定 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());
}
}
});
}
特定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 {
...
}
}
});
}
特定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 {
...
}
}
});
}
特定の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で認証フローを進めた後、アプリを制作する際に必要な情報を取得することができます。
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();
[注意]
- 外部IdPの認証情報はセキュリティのためにゲームサーバーで呼び出すことを推奨します。
- IdPによってはアクセストークンの有効期限が短い場合があります。
- 例えばGoogleは、ログインしてから2時間後にはアクセストークンの有効期限が切れます。
- ユーザー情報が必要な場合は、ログイン後すぐにGamebase Server APIを呼び出してください。
- "Gamebase.loginForLastLoggedInProvider()" APIでログインした場合には、認証情報を取得できません。
- ユーザー情報が必要な場合は、"Gamebase.loginForLastLoggedInProvider()"の代わりに、使用したいIDPCodeと同じ{IDP_CODE}をパラメータにして"Gamebase.login(activity, IDP_CODE, callback)"APIでログインする必要があります。
Gamebase Consoleで利用制限対象のゲームユーザーに登録された場合、 ログインを試みると、次のような利用制限情報コードが表示されることがあります。BanInfo.from(exception)メソッドを利用して利用制限情報を確認することができます。
ゲストアカウントを他の端末に移行するためのキーを発行する機能です。
このキーをTransferAccountInfoと呼びます。 発行されたTransferAccountInfoは、他の端末でrequestTransferAccountAPIを呼び出してアカウントを移行できます。
[注意]
TransferAccountInfoは、ゲストログイン状態でのみ発行できます。 TransferAccountInfoを利用したアカウント移行は、ゲストログイン状態またはログインしていない状態でのみ可能です。 ログインしたゲストアカウントがすでに他の外部IdP (Google、Facebook、PAYCOなど)アカウントとマッピングされている場合は、アカウント移行がサポートされません。
ゲストアカウントを移行するために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;
}
});
ゲストアカウントを移行するために、すでに発行されているTransferAccountInfo情報をGamebaseサーバーに問い合わせます。
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;
}
});
すでに発行されたTransferAccountInfo情報を更新します。 更新方法には自動更新と手動更新があり、パスワードのみ更新、IDとパスワードを更新を選択して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;
}
});
issueTransferAPIで発行したTransferAccountでアカウントを移行する機能です。 アカウントの移行に成功した時、TransferAccountを発行した端末で移行完了メッセージが表示される場合があり、ゲストログインすると新規のアカウントが作成されます。 アカウント移行が成功した端末では、TransferAccountを発行した端末のゲストアカウントを継続して使用できます。
[Caution]
- すでにゲストログインしている状態で移行すると、端末にログインしていたゲストアカウントは消滅します。
- 無効なIDやパスワードを連続して入力すると、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
}
});
退会猶予機能です。 一時退会をリクエストして即時に退会が行われず、一定期間が過ぎると退会されます。 猶予期間はコンソールで変更できます。
[注意]
退会猶予機能を使用する場合はGamebase.withdraw()APIを使用しないでください。 Gamebase.withdraw()APIを使用するとアカウントを即時に退会させます。
ログインに成功するとAuthToken.getTemporaryWithdrawalInfo() APIを呼び出して退会猶予状態のユーザーなのかを判断できます。
一時退会をリクエストします。 コンソールで設定した期間が過ぎると、自動的に退会が行われます。
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.
}
});
}
退会猶予を使用するゲームはログイン後、常に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.
}
}
});
}
退会リクエストをキャンセルします。 退会リクエスト後、猶予期間が過ぎて退会が完了した場合、キャンセルできません。
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.
}
});
}
退会猶予期間を無視して即時退会を進行します。 実際の内部動作は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.
}
});
}
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.
}
}
});
}
Category | Error | Error Code | Description |
---|---|---|---|
Auth | INVALID_MEMBER | 6 | 正しくない会員に対するリクエストです。 |
BANNED_MEMBER | 7 | 利用制限対象の会員です。 | |
Auth | 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のパスワードが有効ではありません。 | |
AUTH_TRANSFERACCOUNT_CONSOLE_NO_CONDITION | 3045 | TransferAccountが設定されていません。 先にTOAST Gamebaseコンソールで設定してください。 |
|
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();
...
}
}
}
});