Gamebaseではゲストログインをデフォルトでサポートします。
多くのゲームがタイトル画面でログインを実装します。
上で説明したロジックは、次のような順序で実装できます。
最近ログインしたIdPでログインを試行します。 該当ログインに対するトークンの有効期限が切れているか、トークンの検証などに失敗すると、失敗を返します。 この場合は該当IdPに対するログインを実装する必要があります。
keyname | a use | 値の種類 |
---|---|---|
GamebaseAuthProviderCredential::ShowLoadingAnimation | API呼び出しが終わるまでローディングアニメーションを表示 Androidに限る |
bool default: true |
API
Supported Platforms ■ UNREAL_ANDROID ■ UNREAL_IOS
void LoginForLastLoggedInProvider(const FGamebaseAuthTokenDelegate& Callback);
void LoginForLastLoggedInProvider(const UGamebaseJsonObject& AdditionalInfo, const FGamebaseAuthTokenDelegate& Callback);
Example
void USample::LoginForLastLoggedInProvider()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->LoginForLastLoggedInProvider(FGamebaseAuthTokenDelegate::CreateLambda([=](const FGamebaseAuthToken* AuthToken, const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
UE_LOG(GamebaseTestResults, Display, TEXT("LoginForLastLoggedInProvider succeeded."));
}
else
{
if (Error->Code == GamebaseErrorCode::SOCKET_ERROR || Error->Code == GamebaseErrorCode::SOCKET_RESPONSE_TIMEOUT)
{
UE_LOG(GamebaseTestResults, Display, TEXT("Retry LoginForLastLoggedInProvider or notify an Error message to the user. : %s"), *Error->Messsage);
}
else if (Error->Code == GamebaseErrorCode::BANNED_MEMBER)
{
auto BanInfo = FGamebaseBanInfo::From(Error);
if (BanInfo.IsValid())
{
UE_LOG(GamebaseTestResults, Display, TEXT("This user has been banned. Gamebase userId is %s"), *BanInfo->userId);
}
}
else
{
UE_LOG(GamebaseTestResults, Display, TEXT("Try to login using a specifec IdP"));
}
}
}));
}
Gamebaseはゲストログインをサポートします。
API
Supported Platforms ■ UNREAL_ANDROID ■ UNREAL_IOS ■ UNREAL_WINDOWS
void Login(const FString& ProviderName, const FGamebaseAuthTokenDelegate& Callback);
Example
void USample::Login()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->Login(GamebaseAuthProvider::Guest, FGamebaseAuthTokenDelegate::CreateLambda([=](const FGamebaseAuthToken* AuthToken, const FGamebaseError* Error)
{1
if (Gamebase::IsSuccess(Error))
{
UE_LOG(GamebaseTestResults, Display, TEXT("Login succeeded. Gamebase userId is %s"), *AuthToken->Member.UserId);
}
else
{
UE_LOG(GamebaseTestResults, Display, TEXT("Login failed. (errorCode: %d, errorMessage: %s)"), Error->Code, *Error->Messsage);
if (Error->Code == GamebaseErrorCode::SOCKET_ERROR || Error->Code == GamebaseErrorCode::SOCKET_RESPONSE_TIMEOUT)
{
UE_LOG(GamebaseTestResults, Display, TEXT("Retry LoginForLastLoggedInProvider or notify an Error message to the user. : %s"), *Error->Messsage);
}
else if (Error->Code == GamebaseErrorCode::BANNED_MEMBER)
{
auto BanInfo = FGamebaseBanInfo::From(Error);
if (BanInfo.IsValid())
{
UE_LOG(GamebaseTestResults, Display, TEXT("This user has been banned. Gamebase userId is %s"), *BanInfo->userId);
}
}
}
}));
}
次は、特定IdPでログインできるようにするサンプルコードです。 ログインすることができるIdPタイプは GamebaseAuthProviderクラスで確認できます。
[参考]
ログインする時に追加情報を必要とするIdPもあります。 このような追加情報を設定できるようにvoid Login(const FString& ProviderName, const UGamebaseJsonObject& AdditionalInfo, const FGamebaseAuthTokenDelegate& Callback) APIを提供します。 AdditionalInfoパラメータに必須情報をdictionary形式で入力してください。 AdditionalInfo値がある場合にはその値を使用し、nullの場合にはNHN Cloud Consoleに登録された値を使用します。
[参考]
Line IdPはGamebase SDK 2.43.0からLineサービス提供地域を設定できます。 該当地域はAdditionalInfoに設定できます。 * AdditionalInfoパラメータの設定方法
keyname | a use | 値種類 |
---|---|---|
GamebaseAuthProviderCredential::LineChannelRegion | Lineサービス提供地域設定 | "japan" "thailand" "taiwan" "indonesia" |
API
Supported Platforms
■ UNREAL_ANDROID ■ UNREAL_IOS ■ UNREAL_WINDOWS
void Login(const FString& ProviderName, const FGamebaseAuthTokenDelegate& Callback);
void Login(const FString& ProviderName, const UGamebaseJsonObject& AdditionalInfo, const FGamebaseAuthTokenDelegate& Callback);
Example
void USample::Login()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->Login(GamebaseAuthProvider::Facebook, FGamebaseAuthTokenDelegate::CreateLambda([=](const FGamebaseAuthToken* AuthToken, const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
UE_LOG(GamebaseTestResults, Display, TEXT("Login succeeded. Gamebase userId is %s"), *AuthToken->Member.UserId);
}
else
{
UE_LOG(GamebaseTestResults, Display, TEXT("Login failed. (errorCode: %d, errorMessage: %s)"), Error->Code, *Error->Messsage);
if (Error->Code == GamebaseErrorCode::SOCKET_ERROR || Error->Code == GamebaseErrorCode::SOCKET_RESPONSE_TIMEOUT)
{
UE_LOG(GamebaseTestResults, Display, TEXT("Retry LoginForLastLoggedInProvider or notify an Error message to the user. : %s"), *Error->Messsage);
}
else if (Error->Code == GamebaseErrorCode::BANNED_MEMBER)
{
auto BanInfo = FGamebaseBanInfo::From(Error);
if (BanInfo.IsValid())
{
UE_LOG(GamebaseTestResults, Display, TEXT("This user has been banned. Gamebase userId is %s"), *BanInfo->UserId);
}
}
}
}));
}
void USample::LoginWithAdditionalInfo()
{
UGamebaseJsonObject* AdditionalInfo = NewObject<UGamebaseJsonObject>();
AdditionalInfo->SetStringField(TEXT("Key"), TEXT("Value"));
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->Login(GamebaseAuthProvider::Facebook, *AdditionalInfo, FGamebaseAuthTokenDelegate::CreateLambda([=](const FGamebaseAuthToken* AuthToken, const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
UE_LOG(GamebaseTestResults, Display, TEXT("Login succeeded. Gamebase userId is %s"), *AuthToken->Member.UserId);
}
else
{
UE_LOG(GamebaseTestResults, Display, TEXT("Login failed. (errorCode: %d, errorMessage: %s)"), Error->Code, *Error->Messsage);
}
}));
}
IdPで提供するSDKを使用して、ゲームで直接認証した後、発行されたアクセストークンなどを利用して、Gamebaseにログインできるインターフェイスです。
keyname | a use | 値種類 |
---|---|---|
GamebaseAuthProviderCredential::ProviderName | IdPタイプ設定 | google, facebook, payco, iosgamecenter, naver, twitter, line |
GamebaseAuthProviderCredential::AccessToken | IdPログイン後に取得した認証情報(Access Token)設定 Google認証時には使用しない |
|
GamebaseAuthProviderCredential::AuthorizationCode | Googleログイン後に取得した認証情報(Authorization Code)設定 | |
GamebaseAuthProviderCredential::GamebaseAccessToken | IdP認証情報ではなくGamebase Access Tokenでログインを行いたい場合に使用 | |
GamebaseAuthProviderCredential::LineChannelRegion | Lineサービス提供地域設定 | Login with IdP参照 |
[TIP]
ゲーム内で外部サービス(Facebookなど)の固有機能を使用する必要がある時に必要な場合があります。
[注意]
外部SDKでサポートを要求する開発事項は外部SDKのAPIを使用して実装する必要があり、Gamebaseではサポートしません。
API
Supported Platforms
■ UNREAL_ANDROID ■ UNREAL_IOS ■ UNREAL_WINDOWS
void Login(const UGamebaseJsonObject& CredentialInfo, const FGamebaseAuthTokenDelegate& Callback);
Example
void USample::LoginWithCredential()
{
UGamebaseJsonObject* CredentialInfo = NewObject<UGamebaseJsonObject>();
// google
//CredentialInfo->SetStringField(GamebaseAuthProviderCredential::ProviderName, GamebaseAuthProvider::Google);
//CredentialInfo->SetStringField(GamebaseAuthProviderCredential::AuthorizationCode, TEXT("google auchorization code"));
// facebook
CredentialInfo->SetStringField(GamebaseAuthProviderCredential::ProviderName, GamebaseAuthProvider::Facebook);
CredentialInfo->SetStringField(GamebaseAuthProviderCredential::AccessToken, TEXT("facebook access token"));
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->Login(*CredentialInfo, FGamebaseAuthTokenDelegate::CreateLambda([=](const FGamebaseAuthToken* AuthToken, const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
UE_LOG(GamebaseTestResults, Display, TEXT("Login succeeded. Gamebase userId is %s"), *AuthToken->Member.UserId);
}
else
{
UE_LOG(GamebaseTestResults, Display, TEXT("Login failed. (errorCode: %d, errorMessage: %s)"), Error->Code, *Error->Messsage);
}
}));
}
ログインしたIdPからログアウトを試行します。主にゲームの設定画面にログアウトボタンを設置し、ボタンをクリックすると実行されるように実装する場合が多いです。
ログアウトが成功しても、ゲームユーザーデータは維持されます。
ログアウトに成功すると、該当IdPで認証した記録を消去するため、次にログインする時、ID、パスワード入力ウィンドウが表示されます。
API
Supported Platforms
■ UNREAL_ANDROID ■ UNREAL_IOS ■ UNREAL_WINDOWS
void Logout(const FGamebaseErrorDelegate& Callback);
Example
void USample::Logout()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->Logout(FGamebaseErrorDelegate::CreateLambda([=](const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
UE_LOG(GamebaseTestResults, Display, TEXT("Logout succeeded."));
}
else
{
UE_LOG(GamebaseTestResults, Display, TEXT("Logout failed. (errorCode: %d, errorMessage: %s)"), Error->Code, *Error->Messsage);
}
}));
}
ログイン状態で退会を試行します。
[注意]
複数のIdPを連携中の場合、すべてのIdP連携が解除され、Gamebaseユーザーデータが削除されます。
API
Supported Platforms
■ UNREAL_ANDROID ■ UNREAL_IOS ■ UNREAL_WINDOWS
void Withdraw(const FGamebaseErrorDelegate& Callback);
Example
void USample::Withdraw()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->Withdraw(FGamebaseErrorDelegate::CreateLambda([=](const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
UE_LOG(GamebaseTestResults, Display, TEXT("Withdraw succeeded."));
}
else
{
UE_LOG(GamebaseTestResults, Display, TEXT("Withdraw failed. (errorCode: %d, errorMessage: %s)"), Error->Code, *Error->Messsage);
}
}));
}
マッピングは、既にログインしているアカウントに他のIdPのアカウントを連携または、解除する機能です。
多くのゲームが1つのアカウントに複数のIdPを連携(Mapping)できるようにしています。
GamebaseのMapping APIを使用して既にログインしているアカウントに他のIdPのアカウントを連携/解除できます。
このように、1つのGamebaseユーザーIDに多くのIdPアカウントを連携できます。
すなわち、連携中のIdPアカウントでログインを試行すると、常に同じユーザーIDでログインします。
注意する点は、IdPごとに1つのアカウントのみ連携が可能なことです。
例は次のとおりです。
MappingにはMapping追加/解除APIがあります。
マッピングは、次の順序で実装できます。
マッピングは、現在のアカウントにIdPアカウント連携を追加することです。優先的にログインする必要があります。 先にログインAPIを呼び出してログインします。
AddMapping APIを呼び出してマッピングを試行します。
特定IdPにログインした状態で、他のIdPにMappingを試行します。
MappingをしようとするIdPのアカウントがすでに他のアカウントに連携している場合、
AUTH_ADD_MAPPING_ALREADY_MAPPED_TO_OTHER_MEMBER(3302)エラーを返します。
Mappingが成功しても、「現在ログイン中のIdP」が変わりません。すなわち、Googleアカウントでログインした後、FacebookアカウントのMappingが成功したからといって、「現在ログイン中のIdP」がGoogleからFacebookには変更されません。Googleの状態で維持されます。 Mappingは、単純にIdP連携のみ追加します。
API
Supported Platforms
■ UNREAL_ANDROID ■ UNREAL_IOS
void AddMapping(const FString& ProviderName, const FGamebaseAuthTokenDelegate& Callback);
void AddMapping(const FString& ProviderName, const UGamebaseJsonObject& AdditionalInfo, const FGamebaseAuthTokenDelegate& Callback)
Example
void USample::AddMapping(const FString& ProviderName)
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->AddMapping(ProviderName, FGamebaseAuthTokenDelegate::CreateLambda([=](const FGamebaseAuthToken* AuthToken, const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
UE_LOG(GamebaseTestResults, Display, TEXT("AddMapping succeeded."));
}
else
{
UE_LOG(GamebaseTestResults, Display, TEXT("AddMapping failed. (errorCode: %d, errorMessage: %s)"), Error->Code, *Error->Messsage);
}
}));
}
ゲームで直接IdPから提供するSDKで先に認証を行い、発行されたアクセストークンなどを利用して、Gamebase AddMappingを行うことができるインターフェイスです。
keyname | a use | 値種類 |
---|---|---|
GamebaseAuthProviderCredential::ProviderName | IdPタイプ設定 | GamebaseAuthProvider::Google GamebaseAuthProvider::Facebook GamebaseAuthProvider::Naver GamebaseAuthProvider::Twitter GamebaseAuthProvider::Line GamebaseAuthProvider::Hangame GamebaseAuthProvider::AppleId GamebaseAuthProvider::Weibo GamebaseAuthProvider::GameCenter GamebaseAuthProvider::Payco |
GamebaseAuthProviderCredential::AccessToken | IdPログイン後に取得した認証情報(アクセストークン)設定 Google認証時には使用しない |
|
GamebaseAuthProviderCredential::AuthorizationCode | Googleログイン後に取得した認証情報(Authorization Code)設定 |
[TIP]
ゲーム内で外部サービス(Facebookなど)の固有機能を使用する必要がある時に必要な場合があります。
[注意]
外部SDKでサポートを要求する開発事項は、外部SDKのAPIを使用して実装する必要があり、Gamebaseではサポートしません。
API
Supported Platforms
■ UNREAL_ANDROID ■ UNREAL_IOS
void AddMapping(const UGamebaseJsonObject& CredentialInfo, const FGamebaseAuthTokenDelegate& Callback);
Example
void USample::AddMappingWithCredential()
{
UGamebaseJsonObject* CredentialInfo = NewObject<UGamebaseJsonObject>();
// google
//CredentialInfo->SetStringField(GamebaseAuthProviderCredential::ProviderName, GamebaseAuthProvider::Google);
//CredentialInfo->SetStringField(GamebaseAuthProviderCredential::AuthorizationCode, TEXT("google auchorization code"));
// facebook
CredentialInfo->SetStringField(GamebaseAuthProviderCredential::ProviderName, GamebaseAuthProvider::Facebook);
CredentialInfo->SetStringField(GamebaseAuthProviderCredential::AccessToken, TEXT("facebook access token"));
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->AddMapping(*CredentialInfo, FGamebaseAuthTokenDelegate::CreateLambda([=](const FGamebaseAuthToken* AuthToken, const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
UE_LOG(GamebaseTestResults, Display, TEXT("AddMapping succeeded."));
}
else
{
UE_LOG(GamebaseTestResults, Display, TEXT("AddMapping failed. (errorCode: %d, errorMessage: %s)"), Error->Code, *Error->Messsage);
}
}));
}
特定IdPにすでにマッピングされているアカウントがある時、強制的にマッピングを試行します。
強制マッピングを試行する時は、AddMapping APIで取得したForcingMappingTicket
が必要です。
次は、Facebookに強制マッピングを試行する例です。
API
void AddMappingForcibly(const FGamebaseForcingMappingTicket& ForcingMappingTicket, const FGamebaseAuthTokenDelegate& Callback);
// Legacy API
void AddMappingForcibly(const FString& ProviderName, const FString& ForcingMappingKey, const FGamebaseAuthTokenDelegate& Callback);
void AddMappingForcibly(const FString& ProviderName, const FString& ForcingMappingKey, const UGamebaseJsonObject& AdditionalInfo, const FGamebaseAuthTokenDelegate& Callback);
void AddMappingForcibly(const UGamebaseJsonObject& CredentialInfo, const FString& ForcingMappingKey, const FGamebaseAuthTokenDelegate& Callback);
Example
void USample::AddMappingForcibly(const FString& providerName)
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->AddMapping(providerName, FGamebaseAuthTokenDelegate::CreateLambda([=](const FGamebaseAuthToken* AuthToken, const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
UE_LOG(GamebaseTestResults, Display, TEXT("AddMapping succeeded. Gamebase userId is %s"), *AuthToken->Member.UserId);
}
else
{
// まず、addMapping APIを呼び出し、すでに連携されているアカウントでマッピングを試行し、次のようにForcingMappingTicketを取得できます。
if (Error->Code == GamebaseErrorCode::AUTH_ADD_MAPPING_ALREADY_MAPPED_TO_OTHER_MEMBER)
{
// ForcingMappingTicketクラスのFrom()メソッドを利用してForcingMappingTicketインスタンスを取得します。
auto forcingMappingTicket = FGamebaseForcingMappingTicket::From(Error);
if (forcingMappingTicket.IsValid() == false)
{
// Unexpected Error occurred. Contact Administrator.
}
// 強制マッピングを試行します。
Subsystem->AddMappingForcibly(forcingMappingTicket, forcingMappingTicket->forcingMappingKey,
FGamebaseAuthTokenDelegate::CreateLambda([](const FGamebaseAuthToken* innerAuthToken, const FGamebaseError* innerError)
{
if (Gamebase::IsSuccess(Error))
{
// 強制マッピング追加成功
UE_LOG(GamebaseTestResults, Display, TEXT("AddMappingForcibly succeeded."));
}
else
{
// エラーコードを確認し、適切な処理を行います。
UE_LOG(GamebaseTestResults, Display, TEXT("AddMappingForcibly failed. (errorCode: %d, errorMessage: %s)"), Error > Code, *Error > Messsage);
}
}));
}
else
{
// エラーコードを確認し、適切な処理を行います。
UE_LOG(GamebaseTestResults, Display, TEXT("AddMapping failed."));
}
}
}));
}
特定IdPにすでにマッピングされているアカウントがある場合、現在のアカウントからログアウトし、マッピングされたアカウントにログインします。
このとき、AddMapping APIで取得したForcingMappingTicket
が必要です。
Change Login APIの呼び出しが失敗した場合、 Gamebaseログイン状態は既存のUserIDのままです。
API
void ChangeLogin(const FGamebaseForcingMappingTicket& ForcingMappingTicket, const FGamebaseAuthTokenDelegate& Callback);
Example
次はFacebookにマッピング試行後、Facebookにすでにマッピングされたアカウントが存在し、該当アカウントにログインを変更する例です。
void USample::ChangeLoginWithFacebook(const FString& ProviderName)
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->AddMapping(GamebaseAuthProvider::Facebook, FGamebaseAuthTokenDelegate::CreateLambda([=](const FGamebaseAuthToken* AuthToken, const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
UE_LOG(GamebaseTestResults, Display, TEXT("AddMapping succeeded. Gamebase userId is %s"), *AuthToken->Member.UserId);
}
else
{
// まずAddMapping APIの呼び出しと、すでに連動されているアカウントにマッピングを試行して、次のようにForcingMappingTicketを取得できます。
if (Error->Code == GamebaseErrorCode::AUTH_ADD_MAPPING_ALREADY_MAPPED_TO_OTHER_MEMBER)
{
// ForcingMappingTicketクラスのFrom()メソッドを利用してForcingMappingTicketインスタンスを取得します。
auto ForcingMappingTicket = FGamebaseForcingMappingTicket::From(Error);
if (ForcingMappingTicket.IsValid())
{
// 強制マッピングを試行します。
IGamebase::Get().ChangeLogin(ForcingMappingTicket, ForcingMappingTicket->ForcingMappingKey,
FGamebaseAuthTokenDelegate::CreateLambda([](const FGamebaseAuthToken* AuthTokenForcibly, const FGamebaseError* ChangeLoginError)
{
if (Gamebase::IsSuccess(ChangeLoginError))
{
// ログイン変更成功
}
else
{
// ログイン変更失敗
// エラーコードを確認し、適切な処理を行います。
}
}));
}
else
{
// Unexpected Error occurred. Contact Administrator.
}
}
else
{
// エラーコードを確認し、適切な処理を行います。
UE_LOG(GamebaseTestResults, Display, TEXT("AddMapping failed."));
}
}
}));
}
特定IdPの連携を解除します。もし解除するIdが唯一のIdPの場合、失敗を返します。 連携解除後は、Gamebase内部で該当IdPのログアウト処理を行います。
API
Supported Platforms
■ UNREAL_ANDROID ■ UNREAL_IOS
void RemoveMapping(const FString& ProviderName, const FGamebaseErrorDelegate& Callback);
Example
void USample::RemoveMapping(const FString& ProviderName)
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->RemoveMapping(ProviderName, FGamebaseErrorDelegate::CreateLambda([=](const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
UE_LOG(GamebaseTestResults, Display, TEXT("RemoveMapping succeeded."));
}
else
{
UE_LOG(GamebaseTestResults, Display, TEXT("RemoveMapping failed. (errorCode: %d, errorMessage: %s)"), Error->Code, *Error->Messsage);
}
}));
}
ユーザーIDに連携されているIdPリストを返します。
API
Supported Platforms
■ UNREAL_ANDROID ■ UNREAL_IOS
TArray<FString> GetAuthMappingList() const;
Example
void USample::GetAuthMappingList()
{
auto mappingList = IGamebase::Get().GetAuthMappingList();
for (FString provider : MappingList)
{
UE_LOG(GamebaseTestResults, Display, TEXT("GetAuthMappingList - %s"), *provider);
}
}
Gamebaseを通して認証手順を進行した後、アプリを製作する時に必要な情報を取得できます。
Gamebaseで発行したUserIDを取得できます。 API
Supported Platforms
■ UNREAL_ANDROID ■ UNREAL_IOS
FString GetUserID() const;
Example
void USample::GetUserID()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
FString UserID = Subsystem->GetUserID();
}
Gamebaseで発行したアクセストークンを取得できます。
API
Supported Platforms
■ UNREAL_ANDROID ■ UNREAL_IOS
FString GetAccessToken() const;
Example
void USample::GetAccessToken()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
FString AccessToken = Subsystem->GetAccessToken();
}
Gamebaseで最後にログインに成功したProviderNameを取得できます。
API
Supported Platforms
■ UNREAL_ANDROID ■ UNREAL_IOS
FString GetLastLoggedInProvider() const;
Example
void USample::GetLastLoggedInProvider()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
FString LastLoggedInProvider = Subsystem->GetLastLoggedInProvider();
}
[注意]
- 外部IdPの認証情報はセキュリティのためにゲームサーバーで呼び出すことを推奨します。
- IdPによってはアクセストークンの有効期限が短い場合があります。
- 例えばGoogleはログインしてから2時間後にはアクセストークンの有効期限が切れます。
- ユーザー情報が必要な場合はログイン後、すぐにGamebase Server APIを呼び出してください。
- "Gamebase.LoginForLastLoggedInProvider()" APIでログインした場合には認証情報を取得できません。
- ユーザー情報が必要な場合は"Gamebase.LoginForLastLoggedInProvider()"の代わりに、使用したいIDPCodeと同じ{IDP_CODE}をパラメータにして"Gamebase.Login(IDP_CODE, callback)" APIでログインする必要があります。
Gamebase Consoleに制裁中のゲームユーザーで登録する場合、 ログイン試行時、利用制限情報コード(BANNED_MEMBER(7))が表示される場合があり、FGamebaseBanInfo::From APIを利用して制裁情報を確認できます。
ゲストアカウントを他の端末へ移行するためにアカウント移行用のキーを発行する機能です。
このキーをTransferAccountInfoと呼びます。 発行されたTransferAccountInfoは、他の端末でrequestTransferAccountAPIを呼び出してアカウント移行を行えます。
[注意]
TransferAccountInfoは、ゲストログイン状態でのみ発行できます。 TransferAccountInfoを利用したアカウント移行は、ゲストログイン状態またはログインしていない状態でのみ可能です。 ログインしたゲストアカウントがすでに他の外部IdP (Google、Facebook、Paycoなど)アカウントとマッピングされている場合、アカウント移行がサポートされません。
ゲストアカウント移行のためのTransferAccountInfoを発行します。
API
void IssueTransferAccount(const FGamebaseTransferAccountDelegate& Callback);
Example
void USample::IssueTransferAccount()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->IssueTransferAccount(FGamebaseTransferAccountDelegate::CreateLambda([=](const FGamebaseTransferAccountInfo* transferAccountInfo, const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
// Issuing TransferAccount success.
}
else
{
// Issuing TransferAccount failed.
}
}));
}
ゲストアカウント移行のためにすでに発行したTransferAccountInfo情報をGamebaseサーバーに問い合わせます。
API
void QueryTransferAccount(const FGamebaseTransferAccountDelegate& Callback);
Example
void USample::QueryTransferAccount()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->IssueTransferAccount(FGamebaseTransferAccountDelegate::CreateLambda([=](const FGamebaseTransferAccountInfo* TransferAccountInfo, const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
// Querying TransferAccount success.
}
else
{
// Querying TransferAccount failed.
}
}));
}
発行されたTransferAccountInfo情報を更新します。 方法は「自動更新」と「手動更新」があり、「Passwordのみ更新」、「IDとPasswordを更新」などの設定をしてTransferAccountInfo情報を更新できます。
void RenewTransferAccount(const FGamebaseTransferAccountRenewConfiguration& Configuration, const FGamebaseTransferAccountDelegate& Callback);
Example
void USample::RenewTransferAccount(const FString& accountId, const FString& accountPassword)
{
// 手動設定
FGamebaseTransferAccountRenewConfiguration Configuration;
Configuration.AccountId = AccountId;
Configuration.AccountPassword = AccountPassword;
//FGamebaseTransferAccountRenewConfiguration Configuration { AccountPassword };
// 自動設定
//FGamebaseTransferAccountRenewConfiguration Configuration{ type };
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->RenewTransferAccount(Configuration, FGamebaseTransferAccountDelegate::CreateLambda([=](const FGamebaseTransferAccountInfo* TransferAccountInfo, const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
// Renewing TransferAccount success.
}
else
{
// Renewing TransferAccount failed.
}
}));
}));
}
issueTransferAPIで発行されたTransferAccountでアカウントを移行する機能です。 アカウントの移行に成功すると、TransferAccountを発行した端末で移行完了メッセージが表示される場合があり、Guestログイン時に新しいアカウントが作成されます。 アカウント移行が成功した端末では、TransferAccountを発行した端末のゲストアカウントを継続して使用できます。
[注意]
ゲストログインしている状態で移行が成功すると、端末にログインしていたゲストアカウントは消えます。
API
void TransferAccountWithIdPLogin(const FString& AccountId, const FString& AccountPassword, const FGamebaseAuthTokenDelegate& Callback);
Example
void USample::TransferAccountWithIdPLogin(const FString& accountId, const FString& accountPassword)
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->TransferAccountWithIdPLogin(accountId, accountPassword, FGamebaseAuthTokenDelegate::CreateLambda([=](const FGamebaseAuthToken* AuthToken, const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
// Transfering Account success.
// TODO: implements post login process
}
else
{
// Transfering Account failed.
}
}));
}
退会猶予機能です。 一時退会をリクエストすると、即時に退会が行われずに一定の猶予期間が過ぎると退会が行われます。 猶予期間は、コンソールで変更できます。
[注意]
退会猶予機能を使用する場合はWithdraw APIを使用しないでください。 Withdraw APIは、即時にアカウントを退会します。
ログインが成功すると、AuthToken.Member.TemporaryWithdrawalで退会猶予状態のユーザーかを判断できます。
一時退会をリクエストします。 コンソールに指定した期間が過ぎると自動的に退会処理が完了します。
API
void RequestWithdrawal(const FGamebaseTemporaryWithdrawalDelegate& Callback);
Example
void USample::Login()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->Login(GamebaseAuthProvider::Guest, FGamebaseAuthTokenDelegate::CreateLambda([=](const FGamebaseAuthToken* AuthToken, const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
if (AuthToken->Member.TemporaryWithdrawal.IsSet())
{
const auto TemporaryWithdrawal = AuthToken->Member.TemporaryWithdrawal.GetValue();
// GracePeriodDate: epoch time in milliseconds
const FDateTime PeriodDate = FDateTime(1970, 1, 1) + FTimespan::FromMilliseconds(TemporaryWithdrawal.GracePeriodDate);
UE_LOG(GamebaseTestResults, Display, TEXT("User is under temporary withdrawa. GracePeriodDate : %s"), *PeriodDate.ToString());
}
else
{
UE_LOG(GamebaseTestResults, Display, TEXT("Login succeeded. Gamebase userId is %s"), *AuthToken->Member.UserId);
}
}
else
{
UE_LOG(GamebaseTestResults, Display, TEXT("Login failed. (errorCode: %d, errorMessage: %s)"), Error->Code, *Error->Messsage);
}
}));
}
退会猶予を使用するゲームは、AuthToken.Member.TemporaryWithdrawalがnullでない場合、ログイン後に該当ユーザーへ退会進行中という事実を毎回伝える必要があります。
Example
void USample::Login()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->Login(GamebaseAuthProvider::Guest, FGamebaseAuthTokenDelegate::CreateLambda([=](const FGamebaseAuthToken* AuthToken, const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
if (AuthToken->Member.TemporaryWithdrawal.IsSet())
{
const auto TemporaryWithdrawal = AuthToken->Member.TemporaryWithdrawal.GetValue();
// GracePeriodDate: epoch time in milliseconds
const FDateTime PeriodDate = FDateTime(1970, 1, 1) + FTimespan::FromMilliseconds(TemporaryWithdrawal.GracePeriodDate);
UE_LOG(GamebaseTestResults, Display, TEXT("User is under temporary withdrawa. GracePeriodDate : %s"), *PeriodDate.ToString());
}
else
{
UE_LOG(GamebaseTestResults, Display, TEXT("Login succeeded. Gamebase userId is %s"), *AuthToken->Member.UserId);
}
}
else
{
UE_LOG(GamebaseTestResults, Display, TEXT("Login failed. (errorCode: %d, errorMessage: %s)"), Error->Code, *Error->Messsage);
}
}));
}
退会リクエストをキャンセルします。 退会リクエスト後、猶予期間が過ぎて退会が完了すると、キャンセルできません。
API
void CancelWithdrawal(const FGamebaseErrorDelegate& Callback);
Example
void USample::CancelTemporaryWithdrawal()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->GetTemporaryWithdrawal()->CancelTemporaryWithdrawal(FGamebaseErrorDelegate::CreateLambda([=](const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
UE_LOG(GamebaseTestResults, Display, TEXT("CancelTemporaryWithdrawal succeeded."));
}
else
{
UE_LOG(GamebaseTestResults, Display, TEXT("CancelTemporaryWithdrawal failed. (errorCode: %d, errorMessage: %s)"), Error->Code, *Error->Messsage);
}
}));
}
退会猶予期間を無視して即時に退会を行います。 実際の内部動作はWithdraw APIと同じです。
即時退会はキャンセルができないため、ユーザーに実行するかどうかを重ねて確認してください。
API
void WithdrawImmediately(const FGamebaseErrorDelegate& Callback);
Example
void USample::WithdrawImmediately()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->GetTemporaryWithdrawal()->WithdrawImmediately(FGamebaseErrorDelegate::CreateLambda([=](const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error))
{
UE_LOG(GamebaseTestResults, Display, TEXT("WithdrawImmediately succeeded."));
}
else
{
UE_LOG(GamebaseTestResults, Display, TEXT("WithdrawImmediately failed. (errorCode: %d, errorMessage: %s)"), Error->Code, *Error->Messsage);
}
}));
}
Example
void USample::Login()
{
UGamebaseSubsystem* Subsystem = UGameInstance::GetSubsystem<UGamebaseSubsystem>(GetGameInstance());
Subsystem->Login(GamebaseAuthProvider::Guest, FGamebaseAuthTokenDelegate::CreateLambda([=](const FGamebaseAuthToken* AuthToken, const FGamebaseError* Error)
{
if (Gamebase::IsSuccess(Error) == false)
{
// Login failed
return;
}
if (AuthToken->Member.GraceBan.IsSet())
{
const auto GraceBan = AuthToken->Member.raceBan.GetValue();
// GracePeriodDate: epoch time in milliseconds
const FDateTime PeriodDate = FDateTime(1970, 1, 1) + FTimespan::FromMilliseconds(GraceBan.GracePeriodDate);
if (GraceBan.ReleaseRuleCondition.IsSet())
{
const auto ReleaseRuleCondition = GraceBan.ReleaseRuleCondition.GetValue();
// condition type: "AND", "OR"
FString releaseRule = FString::Printf(TEXT("%lld%s %s %dtime(s)"), ReleaseRuleCondition.Amount,
*ReleaseRuleCondition.Currency, *ReleaseRuleCondition.ConditionType, ReleaseRuleCondition.Count);
}
if (GraceBan.PaymentStatus.IsSet())
{
const auto paymentStatus = GraceBan.PaymentStatus.GetValue();
FString paidAmount = FString::Printf(TEXT("%lld%s"), PaymentStatus.Amount, *PaymentStatus.Currency);
FString paidCount = PaymentStatus.count + "time(s)";
}
}
else
{
UE_LOG(GamebaseTestResults, Display, TEXT("Login succeeded. Gamebase userId is %s"), *AuthToken->Member.UserId);
}
}));
}
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 | Guest 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
GamebaseError* gamebaseError = Error; // GamebaseError object via callback
if (Gamebase::IsSuccess(Error))
{
// succeeded
}
else
{
UE_LOG(GamebaseTestResults, Display, TEXT("code: %d, message: %s"), Error->Code, *Error->Messsage);
if (Error->Code == GamebaseErrorCode::AUTH_EXTERNAL_LIBRARY_ERROR)
{
FGamebaseErrorInner moduleError = Error->Error;
if (moduleError.code != GamebaseErrorCode::SUCCESS)
{
UE_LOG(GamebaseTestResults, Display, TEXT("moduleErrorCode: %d, moduleErrorMessage: %s"), moduleError.code, *moduleError.message);
}
}
}