> ## 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.

# Authenticating Users

> Documentation for Unreal SDK API to manage sessions for the Sequence infrastructure stack for web3 gaming.

<Warning>
  The examples below apply to versions 2.x.x.
  If you’re using version 3, use the SequenceEmbeddedWalletBP (Blueprints) and SequenceEmbeddedWallet (C++) classes instead.
</Warning>

## Requirements

* Make sure you have enabled your required login methods on [Sequence Builder](https://sequence.build/)
* Visit our [Platform Requirements](/sdk/unreal/advanced/platforms) page for detailed information on setting up and ensuring
  that the authentication methods you choose are properly configured in your Unreal project.

## Start Email Login

Sign in users with any email, and they will receive a one-time password in their inbox.
Listen for the Email Requires Code event.

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-6461-checkout-updates/fuxzxrnijIqsaqej/images/unreal/start_email_login.png?fit=max&auto=format&n=fuxzxrnijIqsaqej&q=85&s=7d715590db8869042d26fe9c4f26c4c7" width="2242" height="1184" data-path="images/unreal/start_email_login.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const TFunction<void()> OnApiSuccess = [] { };
    const FFailureCallback OnApiFailure = [](const FSequenceError& Error) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->StartEmailLogin(Email, OnApiSuccess, OnApiFailure);
    ```
  </Tab>
</Tabs>

## Confirm Email Login with Code

Sign in users with any email, and they will receive a one-time password in their inbox.
Listen for the Email Requires Code event.

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-6461-checkout-updates/4PRtyLeWilf2Q8cz/images/unreal/confirm_email_login.png?fit=max&auto=format&n=4PRtyLeWilf2Q8cz&q=85&s=709a025405f69aa334348b40c7a71e02" width="2242" height="1184" data-path="images/unreal/confirm_email_login.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const FString Code = "123456";

    const TFunction<void()> OnApiSuccess = [] { };
    const FFailureCallback OnApiFailure = [](const FSequenceError& Error) { };
    const TFunction<void(FFederationSupportData)> OnApiFederationRequired = [this](const FFederationSupportData& FederationData) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->ConfirmEmailLoginWithCode(Code, OnApiSuccess, OnApiFailure, OnApiFederationRequired);
    ```
  </Tab>
</Tabs>

## Sign In as a Guest

You can sign in users as guests. However, note that they will lose access to their wallet if they uninstall the app or sign out.
Leverage our [account federation feature](/sdk/unreal/wallets/embedded-wallet/onboarding/authentication#account-federation) to link the wallet to another email or social account to keep access.

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-6461-checkout-updates/fuxzxrnijIqsaqej/images/unreal/start_guest_session.png?fit=max&auto=format&n=fuxzxrnijIqsaqej&q=85&s=930be7f86b444b7a3450fab55755a1e4" width="2242" height="1184" data-path="images/unreal/start_guest_session.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const TFunction<void()> OnApiSuccess = [] { };
    const FFailureCallback OnApiFailure = [](const FSequenceError& Error) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->StartGuestSession(OnApiSuccess, OnApiFailure);
    ```
  </Tab>
</Tabs>

## Social Sign In

To initiate SSO-based authentication on desktop, you need to navigate to a browser to obtain the necessary id\_token.
On mobile, our SDK handles this process for you using integrated plugins.

On desktop platforms, listen for the `Sign in Web View Required` event and open the returned `Sign In URL`.
On mobile platforms, listen for the `Id Token Received` event.

When you call the `Sign In` functions, listen for the `Session Established` event on the `SequenceSessionsBP` subsystem
to know when the sign in request was successful. Listen for `Session Creation Failure` when something went wrong.

### Get Google Id Token

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-6461-checkout-updates/MzDODqIFHAG7aopt/images/unreal/get_google_token.png?fit=max&auto=format&n=MzDODqIFHAG7aopt&q=85&s=bdebe14b9c82f163830b92037b172c55" width="2242" height="1184" data-path="images/unreal/get_google_token.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    if (Sessions->IsBrowserRequired)
        const FString Url = this->Sessions->GetGoogleSignInUrl();
    else
        Sessions->GetGoogleTokenId(this);
    ```
  </Tab>
</Tabs>

### Get Apple Id Token

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-6461-checkout-updates/MzDODqIFHAG7aopt/images/unreal/get_apple_token.png?fit=max&auto=format&n=MzDODqIFHAG7aopt&q=85&s=a0b803fe7ec674c385b3883b4555a602" width="2242" height="1184" data-path="images/unreal/get_apple_token.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    if (Sessions->IsBrowserRequired)
        const FString Url = this->Sessions->GetAppleSignInUrl();
    else
        Sessions->GetAppleTokenId(this);
    ```
  </Tab>
</Tabs>

### Sign In with Google

Sign In with a valid Google Id Token. You get this from the [Get Google Id Token](/sdk/unreal/wallets/embedded-wallet/onboarding/authentication#get-google-id-token) node.

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-6461-checkout-updates/fuxzxrnijIqsaqej/images/unreal/signin_google.png?fit=max&auto=format&n=fuxzxrnijIqsaqej&q=85&s=b365bcb84e43213e63c33ebc8b3b6c05" width="2242" height="1184" data-path="images/unreal/signin_google.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const FString IdToken = "ey1234";

    const TFunction<void()> OnApiSuccess = []() { };
    const FFailureCallback OnApiFailure = [](const FSequenceError& Error) { };
    const TFunction<void(FFederationSupportData)> OnApiFederationRequired = [](const FFederationSupportData& FederationData) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->StartOidcSession(IdToken, OnApiSuccess, OnApiFailure, OnApiFederationRequired);
    ```
  </Tab>
</Tabs>

### Sign In with Apple

Sign In with a valid Apple Id Token. You get this from the [Get Apple Id Token](/sdk/unreal/wallets/embedded-wallet/onboarding/authentication#get-apple-id-token) node.

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-6461-checkout-updates/fuxzxrnijIqsaqej/images/unreal/signin_apple.png?fit=max&auto=format&n=fuxzxrnijIqsaqej&q=85&s=7fbebf9977e872235d5be10b00dac515" width="2242" height="1184" data-path="images/unreal/signin_apple.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const FString IdToken = "ey1234";

    const TFunction<void()> OnApiSuccess = []() { };
    const FFailureCallback OnApiFailure = [](const FSequenceError& Error) { };
    const TFunction<void(FFederationSupportData)> OnApiFederationRequired = [](const FFederationSupportData& FederationData) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->StartOidcSession(IdToken, OnApiSuccess, OnApiFailure, OnApiFederationRequired);
    ```
  </Tab>
</Tabs>

### Sign In with Epic

Sign In with a valid Epic Games Id Token. Checkout the [EOS Plugin for Unreal](https://dev.epicgames.com/documentation/en-us/unreal-engine/online-subsystem-eos-plugin-in-unreal-engine)

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-6461-checkout-updates/fuxzxrnijIqsaqej/images/unreal/signin_epic.png?fit=max&auto=format&n=fuxzxrnijIqsaqej&q=85&s=bfe14932a4080e83ed62f9b462b6a188" width="2242" height="1184" data-path="images/unreal/signin_epic.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const FString IdToken = "ey1234";

    const TFunction<void()> OnApiSuccess = []() { };
    const FFailureCallback OnApiFailure = [](const FSequenceError& Error) { };
    const TFunction<void(FFederationSupportData)> OnApiFederationRequired = [](const FFederationSupportData& FederationData) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->StartOidcSession(IdToken, OnApiSuccess, OnApiFailure, OnApiFederationRequired);
    ```
  </Tab>
</Tabs>

### Start Session with OIDC Id Token

Use this method to start a session using a valid Id token from Google, Apple or Epic Games.

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-6461-checkout-updates/fuxzxrnijIqsaqej/images/unreal/signin_oidc.png?fit=max&auto=format&n=fuxzxrnijIqsaqej&q=85&s=24fc4f29341760c867a5366548076fbb" width="2242" height="1184" data-path="images/unreal/signin_oidc.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const FString IdToken = "ey1234";

    const TFunction<void()> OnApiSuccess = []() { };
    const FFailureCallback OnApiFailure = [](const FSequenceError& Error) { };
    const TFunction<void(FFederationSupportData)> OnApiFederationRequired = [](const FFederationSupportData& FederationData) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->StartOidcSession(IdToken, OnApiSuccess, OnApiFailure, OnApiFederationRequired);
    ```
  </Tab>
</Tabs>

## PlayFab

You will need to include your PlayFab Title ID in the `SequenceConfig.ini` file
during [Configuration](/sdk/unreal/wallets/embedded-wallet/setup) and [configure PlayFab in the Builder](/solutions/builder/embedded-wallet/playfab-configuration).

### PlayFab Registration

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-6461-checkout-updates/fuxzxrnijIqsaqej/images/unreal/playfab_registration.png?fit=max&auto=format&n=fuxzxrnijIqsaqej&q=85&s=31ad4b5cd68c7bc92f6788bd814ba719" width="2242" height="1184" data-path="images/unreal/playfab_registration.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const TFunction<void()> OnApiSuccess = [this, OnSuccess]() { };
    const FFailureCallback OnApiFailure = [this, OnFailure](const FSequenceError& Error) { };
    const TFunction<void (FFederationSupportData)> OnApiFederationRequired = [this](const FFederationSupportData& FederationData) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->PlayFabRegistration(UsernameIn, EmailIn, PasswordIn, OnApiSuccess, OnApiFailure, OnApiFederationRequired);
    ```
  </Tab>
</Tabs>

### PlayFab Login

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-6461-checkout-updates/fuxzxrnijIqsaqej/images/unreal/playfab_login.png?fit=max&auto=format&n=fuxzxrnijIqsaqej&q=85&s=5b3b7a7f1e053910814c3768f1b412f2" width="2242" height="1184" data-path="images/unreal/playfab_login.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const TFunction<void()> OnApiSuccess = [this, OnSuccess]() { };
    const FFailureCallback OnApiFailure = [this, OnFailure](const FSequenceError& Error) { };
    const TFunction<void (FFederationSupportData)> OnApiFederationRequired = [this](const FFederationSupportData& FederationData) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->PlayFabLogin(UsernameIn, PasswordIn, OnApiSuccess, OnApiFailure, OnApiFederationRequired);
    ```
  </Tab>
</Tabs>

### PlayFab Authenticate with Session Ticket

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-6461-checkout-updates/fuxzxrnijIqsaqej/images/unreal/playfab_session_ticket.png?fit=max&auto=format&n=fuxzxrnijIqsaqej&q=85&s=13b4b8e038347a2f6e0c1e7417b5d939" width="2242" height="1184" data-path="images/unreal/playfab_session_ticket.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const TFunction<void()> OnApiSuccess = [this, OnSuccess]() { };
    const FFailureCallback OnApiFailure = [this, OnFailure](const FSequenceError& Error) { };
    const TFunction<void (FFederationSupportData)> OnApiFederationRequired = [this](const FFederationSupportData& FederationData) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->PlayFabAuthenticateWithSessionTicket(SessionTicket, OnApiSuccess, OnApiFailure, OnApiFederationRequired);
    ```
  </Tab>
</Tabs>

## Account Federation

To link another account to your wallet, simply re-use the same authentication methods.
The SDK will check if [there's an existing session stored](/sdk/unreal/wallets/embedded-wallet/onboarding/manage_sessions#check-existing-session) and will
automatically attempt to link that account.
