> ## Documentation Index
> Fetch the complete documentation index at: https://sequence-0fb8d9e6-6461-checkout-updates.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# フェデレーテッドアカウント

デフォルトでは、WaaS APIはメールアドレスごとに1つのアカウントのみ許可しています。ユーザーが以前と同じメールアドレスで異なる方法でログインしようとすると、`EmailAlreadyInUse` エラーが返されます。

例：ユーザーがGoogleサインインでアカウントを作成し、その後同じメールアドレスでメール＋OTPサインインを試みた場合、このエラーが発生します。

デフォルト（`SequenceLoginWindow`を使用している場合）では、SDKは自動的に`SequenceFrontend > Prefabs > FederatedAuthPopupPanel`にある`FederatedAuthPopupPanel`プレハブを開きます。このプレハブは自由にカスタマイズしたり、[SequenceLoginWindow](/sdk/unity/bootstrap_game#login)プレハブ内で差し替えたりできます。このパネルは、ユーザーに重複したログイン方法が許可されていないことを説明し、ログイン画面に戻って関連付けられたログイン方法（または別のメールアドレス）でサインインするよう促します。

<Info>もし `SequenceConfig` で `EnableMultipleAccountsPerEmail` が有効になっている場合、`FederatedAuthPopupPanel` でユーザーが同じメールアドレスに別のアカウントを作成できるオプションが表示されます。</Info>

ユーザーがアカウントにログインすると、SDKは自動的に `FederateAccount` リクエスト（`SequenceLogin` 参照）を実行します。これにより、失敗したログイン方法もそのメールアドレスに紐付けられ、今後はどちらの方法でもサインインできるようになります。上記の例では、ユーザーはGoogleサインインまたはメール＋OTPのどちらでもアカウントにログインできるようになります。

## アカウントの手動フェデレーション

アプリにボタンを追加して、ユーザーが自身のメールアドレスに別のログイン方法を紐付けられるようにしたい場合（特にゲストログインを利用している場合など）、`SequenceLogin` の参照を取得し、該当するログイン方法の `FederateAccount` メソッドを呼び出してください。

```csharp theme={null}
SequenceLogin login = SequenceLogin.GetInstanceToFederateAuth(walletAddress);

// PlayFab
login.FederateAccountPlayFab(titleId, sessionTicket, email, walletAddress);

// OIDC (Social)
login.FederateAccountSocial(idToken, loginMethod, walletAddress);

// Guest
login.FederateAccountGuest(walletAddress);

// Email
login.Login(email);
// Later ... Once you've received the OTP code from the user
login.FederateAccountEmail(email, code, walletAddress); 
```

ここで walletAddress は、ユーザー認証後に取得した `SequenceWallet` のアドレスです。

### ログインウィンドウのひな型を再利用する

デフォルトの LoginPanel を使ってユーザーが手動でアカウントをフェデレート／リンクできるようにするには、`SequenceLogin` インスタンスで `SetConnectedWalletAddress` を呼び出すか、現在認証されているウォレットアドレスを指定して `SequenceLogin.GetInstanceToFederateAuth` を呼び出してください。

```csharp theme={null}
SequenceLogin login = SequenceLogin.GetInstance();
login.SetConnectedWalletAddress(authenticatedSequenceWalletAddress);

// or

SequenceLogin.GetInstanceToFederateAuth(authenticatedSequenceWalletAddress);
```

これにより、SequenceLogin インスタンスが新しいセッションを作成するのではなく、アカウントのフェデレーションを行うように設定されます。

<Tip>ユーザーがログアウトした後は、必ず `RemoveConnectedWalletAddress()` を呼び出し、SequenceLogin を再設定して新しいセッションを作成できるようにしましょう。</Tip>

例：

```csharp theme={null}
private void OnDropSessionCompleteHandler(string sessionId) {
    if (sessionId == Wallet.SessionId)
    {
        SequenceLogin.GetInstance().RemoveConnectedWalletAddress();
        SceneManager.LoadScene("LoginScene"); // Re-open your scene or UI to allow the user to log back in and create a new session here
    }
}
```

## フェデレーテッドアカウントの削除

フェデレーテッドアカウントの関連付けを削除したい場合は、`IWallet.RemoveFederatedAccount` メソッドで実行できます。

```csharp theme={null}
_wallet.OnFederatedAccountRemovedComplete += (accountIdString, success) => {
    if (success) 
    {
        Debug.Log($"Successfully removed {accountIdString} as a login method");
        // Do something
    }else 
    {
        // Handle failure
    }
};

bool success = await _wallet.RemoveFederatedAccount(account);
```
