> ## Documentation Index
> Fetch the complete documentation index at: https://sequence-0fb8d9e6-codex-update-discord-invite.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-codex-update-discord-invite/WI2CxbnlYZro4UIi/images/unreal/start_email_login.png?fit=max&auto=format&n=WI2CxbnlYZro4UIi&q=85&s=267b842993d954928712719f1c16e3e9" 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-codex-update-discord-invite/FTpX4UAFpHQ_Qb4p/images/unreal/confirm_email_login.png?fit=max&auto=format&n=FTpX4UAFpHQ_Qb4p&q=85&s=5412b681a6f4f439b64b7fbc19ec5f91" 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-codex-update-discord-invite/WI2CxbnlYZro4UIi/images/unreal/start_guest_session.png?fit=max&auto=format&n=WI2CxbnlYZro4UIi&q=85&s=687b14ee4f95ab7f956bc389e540e822" 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-codex-update-discord-invite/FTpX4UAFpHQ_Qb4p/images/unreal/get_google_token.png?fit=max&auto=format&n=FTpX4UAFpHQ_Qb4p&q=85&s=1a172c912fe82fddae418d43f790c79b" 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-codex-update-discord-invite/FTpX4UAFpHQ_Qb4p/images/unreal/get_apple_token.png?fit=max&auto=format&n=FTpX4UAFpHQ_Qb4p&q=85&s=02769532374d6791adab40986254dfb8" 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-codex-update-discord-invite/WI2CxbnlYZro4UIi/images/unreal/signin_google.png?fit=max&auto=format&n=WI2CxbnlYZro4UIi&q=85&s=616877401d99c4a80ef4f4836ff4881f" 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-codex-update-discord-invite/WI2CxbnlYZro4UIi/images/unreal/signin_apple.png?fit=max&auto=format&n=WI2CxbnlYZro4UIi&q=85&s=e00433655616022edd9297a4ed609cc2" 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-codex-update-discord-invite/WI2CxbnlYZro4UIi/images/unreal/signin_epic.png?fit=max&auto=format&n=WI2CxbnlYZro4UIi&q=85&s=4bd424b80fa0eea235a6328e8bf63c5d" 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-codex-update-discord-invite/WI2CxbnlYZro4UIi/images/unreal/signin_oidc.png?fit=max&auto=format&n=WI2CxbnlYZro4UIi&q=85&s=d5643bf3d5d3627c32407dfdf4ac3bca" 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-codex-update-discord-invite/WI2CxbnlYZro4UIi/images/unreal/playfab_registration.png?fit=max&auto=format&n=WI2CxbnlYZro4UIi&q=85&s=deb1d2912b86ebbc61e7ad84d0f49aeb" 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-codex-update-discord-invite/WI2CxbnlYZro4UIi/images/unreal/playfab_login.png?fit=max&auto=format&n=WI2CxbnlYZro4UIi&q=85&s=f529e30f4327a5662b7b4f0106499b50" 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-codex-update-discord-invite/WI2CxbnlYZro4UIi/images/unreal/playfab_session_ticket.png?fit=max&auto=format&n=WI2CxbnlYZro4UIi&q=85&s=c4b9bbfe47e9f74d8befe14527e5d0e5" 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.
