コンテンツにスキップ

マルチアカウントログイン管理

**マルチアカウントログイン管理**は、ログインまたはログアウト時にアカウント情報を保存し、ユーザーが将来のログインのために保存されたアカウント情報を再読み込みできる機能です。これにより、以前に認証されたアカウント情報を利用することで、より迅速で便利なログイン体験が提供されます。


操作の流れと制限

マルチアカウントログイン管理機能を実装する前に、操作の流れと制限について説明しましょう。

各機能のための以下の操作フローは、マルチアカウントログイン管理を実装する際の参考となる例シナリオです。開発環境によっては、フローの順序やアカウント情報の保存方法がこれらのシナリオと異なる場合があります。

ログイン中のアカウント情報の保存

このシナリオは、明示的なログインを完了した後にユーザーがログイン中にアカウント情報を保存することを説明しています。

このシナリオの結果として、後で保存されたアカウント情報を使用した再ログインまたはアカウント削除を実装できます。

※ アカウント情報の保存および取り扱い方法は、ゲームクライアントの実装によって異なる場合があります。


ログアウト時のアカウント情報の保存

このシナリオは、ログイン中のユーザーがログアウトする際にアカウント情報を保存することを説明しています。

このシナリオの結果として、後で保存されたアカウント情報を使用して再ログインまたはアカウント削除を実装できます

※ アカウント情報の保存および取り扱い方法は、ゲームクライアントの実装によって異なる場合があります。


保存されたアカウント情報を使用して再ログインまたは削除する

これは、保存されたアカウント情報を使用して再ログインするか、取得したリストから特定のアカウント情報を削除するフローであり、マルチアカウントログイン管理の実際の実装シナリオです。

ゲーム内で実装されたPlayerIDリストUIからユーザーがアカウントを選択するステップでは、ユーザーが現在ログインしているかどうかによって動作が異なります。

※ ゲームクライアントで実装されたPlayerIDリストのUI設定方法は、ゲーム開発環境によって異なる場合があります。

操作制限

マルチアカウントログイン管理を実装する前に、以下の運用制限を考慮してください。

  • アカウント情報は**ログインしている場合のみ**保存できます。
  • 保存されたアカウント情報を使用してPlayerIDリストを表示したり、保存されたアカウント情報を削除したりすることは、ログイン状況に関係なく行えます。
  • PlayerIDリストを表示した後に保存されたアカウント情報で再ログインすることは、ログアウトしている場合のみ可能です

実装ガイド

このガイドでは、SDKを使用してマルチアカウントログイン管理機能を実装する方法について説明します。

SDKによって提供されたAPIを次の順序で呼び出すことによって、機能を段階的に実装してください:

  1. ログインが完了したら、現在のログインアカウント情報を保存する
  2. 保存されたアカウントでログインするか、保存されたアカウント情報を削除するには、保存されたアカウント情報を取得する (PlayerIDリスト)
  3. 取得した保存されたアカウント情報を使用して、ユーザーが**マルチアカウントログイン管理**をクリックしたときにPlayerIDリストUIを表示する機能を実装します
  4. PlayerIDリストUIでは、保存されたアカウントでログインする (PlayerID) または 保存されたアカウントを削除する (PlayerID)を実装します

1. 現在ログイン中のアカウント情報を保存する

現在ログインしているアカウント情報を保存します。保存されたアカウント情報を使用することで、次回以降のログイン時に別途認証プロセスなしでより速くログインできます。

ゲームクライアントでは、ユーザーがログインしている場合、アカウント設定メニューにUI要素を提供して、ユーザーがいつでも現在のログインアカウントを保存できるようにし、ユーザーがアカウント保存機能を有効にしたときにアカウント保存APIを呼び出します。関連するフローについては、上記のログイン中のアカウント情報の保存シナリオを参照してください。

現在ログイン中のアカウントを保存するためのUI実装の例は次のとおりです。

図1. ログイン中に現在のログインアカウントを保存する実装の例

また、ログアウトする際に、ユーザーがログインしていてログアウトを選択した場合に、アカウントを保存するかどうかを尋ねるポップアップが表示されるフローを実装できます。そして、ユーザーが**保存してログアウト**をクリックすると、現在ログインしているアカウント情報を保存するためにアカウント保存APIが呼び出され、その後ログアウトします。関連するフローについては、上記のログアウト時のアカウント情報の保存シナリオを参照してください。

図2. ログアウト時に現在ログインしているアカウントを保存する実装の例

現在ログインしているアカウントを保存するためのAPIを呼び出す例のコードは以下の通りです。

AuthV4.storeCurrentPlayerId((ResultAPI result)=>{
    if (result.isSuccess()) {
        // API call succeeded
    }
});
FHiveAuthV4::StoreCurrentPlayerId(FHiveAuthV4OnStoreCurrentPlayerIdDelegate::CreateLambda([this](const FHiveResultAPI& Result) {
    if (Result.IsSuccess()) {
        // API call succeeded
    } 
}));
AuthV4::storeCurrentPlayerId([=](ResultAPI const & result) {
    if (result.isSuccess()) {
        // API call succeeded
    }
});
AuthV4.storeCurrentPlayerId(object : AuthV4.AuthV4StorePlayerIdListener {
    override fun onAuthV4StorePlayerId(result: ResultAPI) {
        if (result.isSuccess) {
            // API call succeeded
        }
    }
})
AuthV4.storeCurrentPlayerId(new AuthV4.AuthV4StorePlayerIdListener() {
    @Override
    public void onAuthV4StorePlayerId(ResultAPI result) {
        if (result.isSuccess()) {
            // API call succeeded
        }
    }
});
AuthV4Interface.storeCurrentPlayerId { (result) in
    if result.isSuccess() {
        // API call succeeded
    }
}
[HIVEAuthV4 storeCurrentPlayerId: ^(HIVEResultAPI * result) {
    if([result isSuccess]){
        // API call succeeded
    }
}];


2. 保存されたアカウント情報の取得(PlayerIDリスト)

SDKおよび認証サーバーから保存されたアカウント情報(PlayerIDリスト)を取得します。ゲームクライアントは、取得したPlayerIDリストを使用して別のPlayerIDリストUIを実装できます。

APIを呼び出して保存されたアカウント情報(PlayerIDリスト)を取得するための例コードは以下の通りです。

AuthV4.getStoredPlayerIdList((ResultAPI result, List<long> playerIdList) =>
{
    if (result.isSuccess())
    {
        foreach (long playerId in playerIdList) {
            // API call succeeded
            // playerId: player ID
        }
    }
});
FHiveAuthV4::GetStoredPlayerIdList(FHiveAuthV4OnGetStoredPlayerIdListDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TArray<int64>& PlayerIdList) {
    if (Result.IsSuccess()) {
        for (int64 PlayerId : PlayerIdList) {
            // API呼び出しに成功しました
            // playerId: プレイヤーID
        }
    }
}));
AuthV4::getStoredPlayerIdList([=](ResultAPI const & result, std::vector<PlayerID> const& playerIdList) {
    if (result.isSuccess()) {
        for (auto playerId : playerIdList) {
            // API call succeeded
            // playerId: player ID
        }
    }
});
AuthV4.getStoredPlayerIdList(object : AuthV4.AuthV4PlayerIdListListener {
    override fun onAuthV4GetPlayerIdList(result: ResultAPI, playerIdList: ArrayList<Long>?) {
        if (result.isSuccess) {
            playerIdList?.let {
                for (playerId in it) {
                    // API call succeeded
                            // playerId: player ID
                }
            }
        }
    }
})
AuthV4.getStoredPlayerIdList(new AuthV4.AuthV4PlayerIdListListener() {
    @Override
    public void onAuthV4GetPlayerIdList(ResultAPI result, ArrayList<Long> playerIdList) {
        if (result.isSuccess()) {
            if(playerIdList != null) {
                for(Long playerId : playerIdList) {
                    // API call succeeded
                            // playerId: player ID
                }
            }
        }
    }
});
AuthV4Interface.getStoredPlayerIdList { (result, playerIdList) in
    if result.isSuccess() {
        for playerId in playerIdList {
                            // API call succeeded
                            // playerId: player ID
        }
    }
}
[HIVEAuthV4 getStoredPlayerIdList: ^(HIVEResultAPI * result, NSArray<NSNumber *> * playerIdList) {
    if([result isSuccess]){
        for (NSNumber* playerId in playerIdList) {
            // API call succeeded
            // playerId: player ID
        }
    }
}];


3. 保存されたアカウント (PlayerID) でログイン

ログアウト中にマルチアカウントログイン管理機能を通じて保存されたアカウント(PlayerID)で迅速にログインします。

保存されたアカウントでログインするための実装手順は次のとおりです。

  1. ユーザーがログアウトし、再度ログインしようとすると、ログイン画面で**マルチアカウントログイン管理**をクリック → 保存されたアカウント情報(PlayerIDリスト)を取得するためにAPIを呼び出します
  2. 前のステップで実装されたPlayerIDリストUIを表示します
    図3. **マルチアカウントログイン管理**を通じて保存されたアカウントでログインする例

  3. ユーザーはPlayerIDリストUIから特定のアカウントを選択し、ログインします → '保存されたアカウント情報(PlayerID)'でログインするためにAPIを呼び出します
    '保存されたPlayerIDでログインするためのAPIを呼び出す例コード'は以下の通りです:

    AuthV4.signInWithStoredPlayerId(playerId, useAutoSignIn, (ResultAPI result, AuthV4.PlayerInfo playerInfo)=>{
        if (result.isSuccess()) {
            // 認証に成功しました
            // playerInfo: 認証されたユーザー情報
    
            // 例: メール情報を取得する
            foreach (KeyValuePair<AuthV4.ProviderType, AuthV4.ProviderInfo> entry in playerInfo.providerInfoData) {
    
                AuthV4.ProviderInfo providerInfo = entry.Value;
                if(providerInfo.providerEmail != null && providerInfo.providerEmail != "") {
                    string email = providerInfo.providerEmail;
                    break;
                }
            }
        }
        else if (result.needExit()) {
            // TODO: アプリの終了機能を実装する
            // e.g.) Application.Quit();
        }
    });
    
    FHiveAuthV4::SignInWithStoredPlayerId(playerId, useAutoSignIn, FHiveAuthV4OnSignInDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHivePlayerInfo& PlayerInfo) {
        if (Result.IsSuccess()) {
            // 認証に成功しました (PlayerInfo: 認証されたユーザー情報)
    
            // 例: メール情報を取得する
            for (const auto& ProviderInfoEntry : PlayerInfo.ProviderInfoData) {
                FHiveProviderInfo ProviderInfo = ProviderInfoEntry.Value;
                FString Email = ProviderInfo.ProviderEmail;
            }
        } else if (Result.NeedExit()) {
            // TODO: アプリ終了機能を実装する
            // 例) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
        }
    }));
    
    AuthV4::signInWithStoredPlayerId(playerId, useAutoSignIn, [=](ResultAPI const & result, PlayerInfo const & playerInfo) {
        if (result.isSuccess()) {
            // 認証に成功しました
            // playerInfo: 認証されたユーザー情報
    
            // 例: メール情報を取得する
            for(auto it = playerInfo.providerInfoData.begin(); it != playerInfo.providerInfoData.end(); ++it) {
                hive::ProviderInfo providerInfo = it->second;
                if(!providerInfo.providerEmail.empty()) {
                    std::string email = providerInfo.providerEmail;
                    break;
                }
            }
        }
        else if (result.needExit()) {
            // TODO: アプリ終了機能を実装する
            // Cocos2d-xエンジンのユーザー
            // 例) exit(0);
            // Unrealエンジンのユーザー
            // 例) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
        }
    });
    
        AuthV4.signInWithStoredPlayerId(playerId, useAutoSignInState, object : AuthV4.AuthV4SignInListener {
                override fun onAuthV4SignIn(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
                        if (result.isSuccess) {
                                // 認証に成功しました
                                // playerInfo: 認証されたユーザー情報
    
                                // 例: メール情報を取得する
                                playerInfo?.let {
                                        for ((key, value) in it.providerInfoData) {
                                                var providerInfo: AuthV4.ProviderInfo = value
                                                if(providerInfo.providerEmail.isNotEmpty()) {
                                                        val email = providerInfo.providerEmail
                                                        break
                                                }
                                        }
                                }
                        } else if (result.needExit()) {
                                // TODO: アプリの終了機能を実装する
                                // 例) exitProcess(
    

4. 保存されたアカウント (PlayerID) の削除

ログアウト中にマルチアカウントログイン管理機能を通じて保存されたアカウント (PlayerID) を削除します。

表示されたPlayerIDリストUIでは、ユーザーはログインする代わりに保存されたアカウント(PlayerID)を削除することを選択できます。

図4. マルチアカウントログイン管理を通じて保存されたアカウントを削除する例


保存されたアカウント(PlayerID)を削除するためのAPIを呼び出す例のコードは以下の通りです。

AuthV4.deleteStoredPlayerId(playerId, (ResultAPI result)=>{
    if (result.isSuccess()) {
        // API call succeeded
    }
});
FHiveAuthV4::DeleteStoredPlayerId(playerId, FHiveAuthV4OnDeleteStoredPlayerIdDelegate::CreateLambda([this](const FHiveResultAPI& Result) {
    if (Result.IsSuccess()) {
        // API call succeeded
    } 
}));
AuthV4::deleteStoredPlayerId(playerId, [=](ResultAPI const & result) {
    if (result.isSuccess()) {
        // API call succeeded
    }
});
AuthV4.deleteStoredPlayerId(playerId, object : AuthV4.AuthV4DeletePlayerIdListener {
    override fun onAuthV4DeletePlayerId(result: ResultAPI) {
        if (result.isSuccess) {
            // API call succeeded
        }
    }
})
AuthV4.deleteStoredPlayerId(playerId, new AuthV4.AuthV4DeletePlayerIdListener() {
    @Override
    public void onAuthV4DeletePlayerId(ResultAPI result) {
        if (result.isSuccess()) {
            // API call succeeded
        }
    }
});
AuthV4Interface.deleteStoredPlayerId(playerId) { (result) in
    if result.isSuccess() {
        // API call succeeded
    }
}
[HIVEAuthV4 deleteStoredPlayerId: playerId handler:^(HIVEResultAPI *result) {
    if([result isSuccess]){
        // API call succeeded
    }
}];


エラーコード

このセクションでは、マルチアカウントログイン管理機能の実装中にSDKによって送信されるエラーコードについて説明します。

エラーコード メッセージ 説明
NEED_INITIALIZE AuthV4NotInitialized SDKのセットアップが完了していない場合 (AuthV4.setup)
IN_PROGRESS AuthV4InProgress 応答を受け取る前にAPIが再度呼び出された場合
INVALID_SESSION AuthV4SessionNotExist 要求されたPlayerIDがリストに存在しない場合
INVALID_SESSION AuthV4SessionProcessingFail セッションの保存/削除に失敗しました

 


実装ノート

マルチアカウントログイン管理機能を実装する際は、以下の点に注意してください。

  • APIの連続呼び出し制限

    インターフェース呼び出しの後に応答を受け取る前にAPIを繰り返し呼び出すと、正常な応答を受け取れない場合があります。次のAPIを呼び出す前に、必ず応答を待ってください。

  • ログインセッションストレージメソッドに注意

    ログインセッションは、デバイスではなく、ログインしているアカウントに基づいて保存されます。したがって、実装方法によっては、同じデバイスを使用している他のユーザーにログイン情報が公開される可能性があります。セキュリティを必要とするサービスのログインセッションストレージ機能を使用する際は注意してください。

  • COPPA適用のためのマルチアカウントログイン管理機能の使用禁止 (ageGateU13 = true)

    マルチアカウントログイン管理機能は、アカウント情報を保存することで迅速なログインを可能にします。ただし、COPPAの対象となる人々に対しては、アカウント情報が保存されず、セッションベースのログインが提供されないようにマルチアカウントログイン管理機能を制限してください。

    SDKはマルチアカウントログイン管理機能の使用を自動的に制限しないため、別途対応が必要です。また、COPPAは13歳未満のユーザーの個人情報の収集、使用、共有を制限しているため、セッション情報を含む関連データの保存を避けることをお勧めします。