アカウントの仕組み
注釈:本資料はAI技術を用いて翻訳されています。
概要
このガイドでは、プレイヤーがスムーズな体験を得られるよう、AGSアカウントの使用に関する重要な情報を提供します。トピックには以下が含まれます。
- AGSアカウントの作成方法
- IDプロバイダーアカウントのリンク方法
- 一般的なユースケースとベストプラクティス
前提条件
- AGSアカウント構造と主要な概念を理解していること。
AGSアカウントの取得方法
AGSアカウントは、ユーザープロフィール、ゲーム進行状況、ウォレット、エンタイトルメントなど、他のすべてのAccelByte Gaming Servicesへのアクセスを提供します。AGSアカウントは、複数のIDプロバイダーアカウントとリンクすることで、クロスプラットフォームのユーザー体験を実現します。
各AGSアカウントには2つの異なるステータスがあります:
ヘッドレスAGSアカウントを取得する
ヘッドレスアカウントは最も一般的なタイプです。プレイヤーがカスタムデバイスIDまたはPlayStation、Steam、Xboxなどのゲームプラットフォームアカウントで初めてゲームにサインインすると、システムが自動的に作成します。システムがヘッドレスAGSアカウントを作成すると、対応するデバイスIDまたはIDプロバイダーアカウントにリンクします。
ゲームでIDプロバイダーアカウントによるサインインを有効にするには、必要なIDプロバイダー設定を作成する必要があります。詳細については、**認証**セクションを参照してください。
一般的な例から始めて、プロセスの簡単な概要を以下に示します。

あなたのゲームスタジオには、Steamで起動された2つのライブゲーム(game_1とgame_2)があり、両方とも同じAGS環境を使用しています。
プレイヤーとして、これはSteamアカウント(my_steam_account)でSteam上のいずれかのゲーム(例:game_1)にサインインする初めての機会です。
以下のことが起こります:
- これはプレイヤーがこのSteamアカウント(my_steam_account)を使用していずれかのゲームにサインインする初めてのため、AGSはまだ既存のAGSアカウントにリンクしていません。システムは自動的にヘッドレスAGSアカウント(my_ags_account)を作成します。
- 以下が含まれます:
- パブリッシャー名前空間内のパブリッシャーユーザーID(publisher_user_id_1)。
- このゲーム名前空間(game_1)内のゲームユーザーID(game_user_id_1)で、パブリッシャーユーザーID(publisher_user_id_1)にリンクされています。
- このSteamアカウント(my_steam_account)は、AGSアカウント(my_ags_account)に自動的にリンクされます。

プレイヤーは同じSteamアカウント(my_steam_account)を使用して、Steam上の他のゲーム(game_2)に初めてサインインします。
以下のことが起こります:
- このSteamアカウント(my_steam_account)はAGSアカウント(my_ags_account)にリンクされています。システムは新しいAGSアカウントを作成せず、代わりにプレイヤーは直接ゲーム(game_2)にログインします。
- システムはゲーム名前空間(game_2)に新しいゲームユーザーID(game_user_id_2)を作成します。
- その後、プレイヤーのヘッドレスAGSアカウント(my_ags_account)には以下が含まれます:
- パブリッシャー名前空間内のパブリッシャーユーザーID(publisher_user_id_1)。
- ゲーム名前空間(game_1)内のゲームユーザーID(game_user_id_1)で、パブリッシャーユーザーID(publisher_user_id_1)に関連付けられています。
- ゲーム名前空間(game_2)内の別のゲームユーザーID(game_user_id_2)で、パブリッシャーユーザーID(publisher_user_id_1)に関連付けられています。
- リンクされたSteamアカウント(my_steam_account)。

ヘッドレスアカウントの本人確認とサインインの唯一の方法は、リンクされたIDプロバイダーアカウント(またはデバイスID)で認証することです。
プレイヤーがゲームへの投資を開始したら、ヘッドレスアカウントをアップグレードするよう促すことを検討してください。そうすれば、プレイヤーと直接的な関係を築くことができます。
フルAGSアカウントを取得する
フルアカウントは、検証済みのメールアドレス、パスワード、基本的なユーザー情報を含む完全なAccelByteアカウントです。
プレイヤーはフルアカウントから多くのメリットを得ることができます:
- サポートされている任意のIDプロバイダー(Steam、PlayStation、Xboxなど)とのアカウントリンクに使用できます。
- アカウント保護のための2FAメカニズムを有効にできます。
- プロフィールの管理、個人データへのアクセスのリクエストなどができます。
フルアカウントを取得するには2つの方法があります:フルアカウント登録を有効にする方法と、ヘッドレスアカウントをフルアカウントにアップグレードする方法です。
AGS IAM入力検証を使用して、プレイヤーのユーザー名、表示名、パスワード、メールの検証をカスタマイズできます。
従来のフルアカウント登録を有効にする
Player PortalまたはSDKを通じてフルアカウント登録フローを有効にできます。
プロセスの簡単な概要を以下に示します:

Player Portalを通じたフルアカウント登録



App Editorを使用すると、Player Portalの実行中にUIと設定の変更を適用でき、再ビルドや再デプロイの必要がなくなります。
ゲーム内プレイヤー登録
この機能により、プレイヤーはゲーム内でアカウントを登録できます。
- Unreal
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
const FString OriginalEmail = TEXT("originalEmail@example.com");
const FString Username = TEXT("JohnDoe");
const FString Password = TEXT("password");
const FString DisplayName = TEXT("testName");
const FString Country = TEXT("US");
const FString DateOfBirth = TEXT("2000-12-20");
bool bUserAccountCreated = false;
auto ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
auto User = ApiClient->GetUserApi().Pin();
User->Registerv2(OriginalEmail, Username, Password, DisplayName, Country, DateOfBirth,
THandler<FUserData>::CreateLambda([&bUserAccountCreated](const FUserData& Result)
{
UE_LOG(LogAccelByteUserTest, Display, TEXT("Success."));
bUserAccountCreated = true;
}),
FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogAccelByteUserTest, Error, TEXT("Error. Code: %d, Reason: %s"), ErrorCode, *ErrorMessage)
}));
private void OnRegister(Result<RegisterUserResponse> result)
{
if (result.IsError)
{
Debug.Log($"Register failed: {result.Error.Message}");
}
else
{
Debug.Log("Register successful.");
}
}
public static void Main(string[] args)
{
var user = AccelByteSDK.GetClientRegistry().GetApi().GetUser();
string email = "useremail@example.com";
string username = "JohnDoe";
string password = "password";
string displayName = "displayed";
string country = "US";
System.DateTime dateOfBirth = new System.DateTime(year: 1995, month: 12, day: 30);
user.Registerv2(email, username, password, displayName, country, dateOfBirth, OnRegister);
}
string userEmail = "john.doe@example.com";
string userPassword = "pass567$#@";
string displayName = "John Doe";
string userCountry = "US";
string userDob = "2000-12-20";
ModelUserCreateRequestV3 newUser = new ModelUserCreateRequestV3()
{
AuthType = "EMAILPASSWD",
EmailAddress = userEmail,
Password = userPassword,
DisplayName = displayName,
Country = userCountry,
DateOfBirth = userDob
};
ModelUserCreateResponseV3? cuResp = sdk.Iam.Users.PublicCreateUserV3Op
.Execute(newUser, sdk.Namespace);
if (cuResp != null)
{
//do something when success
}
usersV4Service := &iam.UsersV4Service{
Client: factory.NewIamClient(&repository.ConfigRepositoryImpl{}),
TokenRepository: &repository.TokenRepositoryImpl{},
}
namespace := "mygame"
authType := "EMAILPASSWD"
country := "US"
dateOfBirth := "1995-12-30"
displayName := "displayed"
emailAddress := "useremail@example.com"
password := "password"
username := "JohnDoe"
input := &users_v4.AdminCreateUserV4Params{
Body: &iamclientmodels.AccountCreateUserRequestV4{
AuthType: &authType,
EmailAddress: &emailAddress,
Username: &username,
Password: password,
DisplayName: displayName,
Country: &country,
DateOfBirth: dateOfBirth,
UniqueDisplayName: displayName,
},
Namespace: namespace,
}
result, err := usersV4Service.AdminCreateUserV4Short(input)
Users usersWrapper = new Users(sdk);
String userEmail = "john.doe@example.com";
String userPassword = "pass567$#@";
String displayName = "John Doe";
String userCountry = "US";
String userDob = "2000-12-20";
ModelUserCreateRequestV3 body = ModelUserCreateRequestV3.builder()
.authType(AccountCreateUserRequestV4.AuthType.EMAILPASSWD.toString())
.emailAddress(userEmail)
.password(userPassword)
.displayName(displayName)
.country(userCountry)
.dateOfBirth(userDob)
.build();
ModelUserCreateResponseV3 response;
try {
usersWrapper.publicCreateUserV3(PublicCreateUserV3.builder()
.namespace("<namespace>")
.body(body)
.build());
} catch (Exception e) {
// Do something when failed
return;
}
if (response == null) {
// Null response from server
} else {
// Do something when successful
}
import accelbyte_py_sdk.api.iam as iam_service
import accelbyte_py_sdk.api.iam.models as iam_models
result, error = iam_service.public_create_user_v4(
body=iam_models.AccountCreateUserRequestV4()
.with_auth_type(iam_models.AccountCreateUserRequestV4AuthTypeEnum.EMAILPASSWD)
.with_country("US")
.with_date_of_birth("1990-01-01")
.with_display_name("********")
.with_username("********")
.with_password("********")
.with_email_address("********"),
namespace=namespace, # optional, gets the value from the global instance if unspecified
sdk=sdk, # optional, gets the global instance if unspecified
)
if error:
exit(error)
ヘッドレスアカウントをフルアカウントにアップグレードする

有効なメールアドレス、ユーザー名、パスワード、その他の必要な情報がないことが、ヘッドレスアカウントとフルアカウントの唯一の違いです。Player PortalまたはSDKを通じてヘッドレスアカウントをアップグレードすることで、フルアカウントを取得することもできます。
プロセスの簡単な概要を以下に示します:

Player Portalを通じてヘッドレスアカウントをアップグレードする


ゲーム内でヘッドレスアカウントをアップグレードする
この機能により、プレイヤーはゲーム内でヘッドレスアカウントをアップグレードできます。
- Unreal
- Unity
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
const FString OriginalEmail = TEXT("originalEmail@example.com");
const FString Password = TEXT("Password1");
auto ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
auto User = ApiClient->GetUserApi().Pin();
FAccountUserData userData;
User->Upgrade(OriginalEmail, Password,
THandler<FAccountUserData>::CreateLambda([&](const FAccountUserData& Result)
{
userData = Result;
UE_LOG(LogAccelByteUserTest, Display, TEXT("Success."));
}),
FErrorHandler::CreateLambda([&](int32 ErrorCode, const FString& ErrorMessage)
{
UE_LOG(LogAccelByteUserTest, Error, TEXT("Error. Code: %d, Reason: %s"), ErrorCode, *ErrorMessage);
}));
//log out
User->LogoutV3(..);
var user = AccelByteSDK.GetClientRegistry().GetApi().GetUser();
string email = "johnDoe@example.com";
string password = "Password1";
//upgrade v1
Result<UserData> upgradeResult = null;
user.Upgrade(email, password, result =>
{
upgradeResult = result;
});
Result logoutResult = null;
user.Logout(result =>
{
logoutResult = result;
});
string userEmail = "john.doe@example.com";
string userPassword = "pass567$#@";
var response = _Sdk.Iam.Users.PublicVerifyHeadlessAccountV3Op
.Execute(new ModelUpgradeHeadlessAccountV3Request()
{
EmailAddress = userEmail,
Password = userPassword
}, _Sdk.Namespace);
if (response != null)
{
//do something when success
}
usersService := &iam.UsersService{
Client: factory.NewIamClient(&repository.ConfigRepositoryImpl{}),
TokenRepository: &repository.TokenRepositoryImpl{},
}
namespace := "mygame"
emailAddress := "useremail@example.com"
password := "password"
input := &users.PublicVerifyHeadlessAccountV3Params{
Body: &iamclientmodels.ModelUpgradeHeadlessAccountV3Request{
EmailAddress: &emailAddress,
Password: &password,
},
Namespace: namespace,
NeedVerificationCode: &needVerificationCode,
}
result, err := usersService.PublicVerifyHeadlessAccountV3Short(input)
Users usersWrapper = new Users(sdk);
String userEmail = "john.doe@example.com";
String userPassword = "pass567$#@";
ModelUpgradeHeadlessAccountV3Request body = ModelUpgradeHeadlessAccountV3Request.builder()
.emailAddress(userEmail)
.password(userPassword)
.build();
ModelUserResponseV3 response;
try {
response = usersWrapper.publicVerifyHeadlessAccountV3(PublicVerifyHeadlessAccountV3.builder()
.namespace("<namespace>")
.body(body)
.build());
} catch (Exception e) {
// Do something when failed
return;
}
if (response == null) {
// Null response from server
} else {
// Do something when successful
}
import accelbyte_py_sdk.api.iam as iam_service
import accelbyte_py_sdk.api.iam.models as iam_models
result, error = iam_service.public_upgrade_headless_account_v4(
body=iam_models.AccountUpgradeHeadlessAccountRequestV4()
.with_email_address("********")
.with_password("********"),
namespace=namespace, # optional, gets the value from the global instance if unspecified
sdk=sdk, # optional, gets the global instance if unspecified
)
if error:
exit(error)
IDプロバイダーアカウントをリンクする方法
アカウントリンクは、クロスプラットフォーム体験をサポートするための重要な機能です。これは、1つ以上のIDプロバイダーとAGSアカウントの関連付けを表します。リンクされたIDプロバイダーアカウントを使用すると、プレイヤーは本人確認を行い、ゲームプレイデータを維持しながら、プラットフォーム間で体験を継続できます。
IDプロバイダープラットフォームの規定により、アカウントリンクには2つの主な制限があります。
- プレイヤーは1つのIDプロバイダーアカウントを1つのAGSアカウントにのみリンクできます。
- プレイヤーは、プラットフォームごとに1つのIDプロバイダーアカウントのみをAGSアカウントにリンクできます。たとえば、プレイヤーは1つのSteamアカウントのみをAccelByteアカウントにリンクできます。このルールは、プレイヤーが以前のSteamアカウントのリンクを解除してから別のアカウントをリンクしようとした場合でも適用されます。
プロセスの簡単な概要を以下に示します:




一般的なユースケースとベストプラクティス
別の一般的なクロスプラットフォームのユースケースを見てみましょう。
ゲームスタジオとして、SteamとXboxでリリースされた1つのライブゲーム(game_1)があります。
プレイヤーとして、最初にSteamプラットフォームでSteamアカウント(my_steam_account)を使用してgame_1の旅を始めます。
以下のことが起こります:
- プレイヤーはこのSteamアカウント(my_steam_account)を使用してgame_1に初めてサインインしています。つまり、まだAGSアカウントにリンクしていません。システムは自動的に新しいヘッドレスAGSアカウント(my_ags_account)を作成します。
- 以下が含まれます:
- パブリッシャー名前空間内のパブリッシャーユーザーID(publisher_user_id_1)。
- ゲーム名前空間(game_1)内のゲームユーザーID(game_user_id_1)で、パブリッシャーユーザーID(publisher_user_id_1)に関連付けられています。
- さらに、プレイヤーが使用したSteamアカウント(my_steam_account)は、AGSアカウント(my_ags_account)に自動的にリンクされます。

プレイヤーは、XBoxコンソールでXBoxアカウント(my_xbox_account)を使用してgame_1をプレイし、XBoxプラットフォームでSteam上のゲーム進行状況を続けたいと考えています。
ベストプラクティス
この場合の推奨ソリューションは次のとおりです。
- IDプロバイダーアカウント(my_steam_account)を使用して任意のプラットフォーム(Steam)でゲームを初めて試すための、スムーズな体験をプレイヤーに提供します。これにより、システムが自動的にヘッドレスアカウント(my_ags_account)を作成します。
- プレイヤーがゲームへの投資を開始したら、ヘッドレスアカウント(my_ags_account)をフルアカウントにアップグレードするよう促します。
- プレイヤーが新しいプラットフォーム(Xbox)で初めてゲームを開始する前に、既存のAccelByteアカウント(my_ags_account)がある場合は、ゲームプラットフォームアカウント(my_xbox_account)をリンクするオプションをプレイヤーに提供します。
- プレイヤーは、ゲームプレイデータを維持しながら、新しいプラットフォームでゲーム体験を継続できます。
プレイヤーが持っているものは次のとおりです:

もし...
上記のステップ3で、プレイヤーが新しいプラットフォームでゲームを開始する前に、ゲームプラットフォームアカウントを既存のAccelByteアカウントにリンクしなかった場合に何が起こるか気になるかもしれません。
プレイヤーは、Xboxアカウント(my_xbox_account)を既存のAGSアカウント(my_ags_account)にリンクせず、game_1を直接開始することを選択しました。
以下のことが起こります:
- これはプレイヤーがXBoxコンソールでXBoxアカウント(my_xbox_account)を使用してgame_1にサインインする初めてのため、XboxアカウントはまだどのAGSアカウントにもリンクされていません。システムは自動的に別のヘッドレスAGSアカウント(my_ags_account_2)を作成します。
- 以下が含まれます:
- パブリッシャー名前空間内のパブリッシャーユーザーID(publisher_user_id_2)。
- この特定のゲーム名前空間(game_1)内のゲームユーザーID(game_user_id_2)で、パブリッシャーユーザーID(publisher_user_id_2)にリンクされています。
- プレイヤーが使用したXBoxアカウント(my_xbox_account)は、AGSアカウント(my_ags_account_2)にリンクされます。

プレイヤーは、XBoxコンソールでこのgame_1を最初からやり直さなければならないことに気づきます。これは望んでいることではありません。Steamプラットフォームで既に持っているゲームプレイを続けたいと考えています。
ゲーム進行状況はAGSアカウントに保存されているため、この場合、プレイヤーはSteamで作成したゲームプレイを続けるために、XBoxアカウント(my_xbox_account)を以前のAGSアカウント(my_ags_account)にリンクする必要があります。
アカウントリンクの制限に関して、1つのアイデンティティプロバイダーアカウントは一度に1つのAGSアカウントにのみリンクできます。プレイヤーは、まず現在のAGSアカウント(my_ags_account_2)からXBoxアカウント(my_xbox_account)のリンクを解除する必要があります。
この場合、プレイヤーが実行する可能性のある手順は次のとおりです:
- 新しいAGSアカウント(my_ags_account_2)でPlayer Portalにサインインし、まずAGSアカウントからXBoxアカウント(my_xbox_account)のリンクを解除します。
- Player Portalからログアウトし、以前のAGSアカウント(my_ags_account)でサインインして、XBoxアカウント(my_xbox_account)をリンクします。
- これで完了です。次回プレイヤーがSteamまたはXBoxでゲームを起動すると、このAGSアカウント(my_ags_account)で同じゲーム進行状況を共有して続けることができます。
プレイヤーが持っているものは次のとおりです:

孤立したAGSアカウント(my_ags_account_2)では、システムはすべてを通常どおり保持し、何もクリーンアップしません。注意すべき点は、別のサードパーティプラットフォームアカウントをリンクするか、Xboxアカウントのリンクを解除する前にプレイヤーがフルAGSアカウントにアップグレードしない限り、そのプレイヤーがこのAGSアカウントに認証してサインインする方法がなくなるということです。