> ## Documentation Index
> Fetch the complete documentation index at: https://sequence-0fb8d9e6-shop-docs.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.

## 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://mintlify.s3.us-west-1.amazonaws.com/sequence-0fb8d9e6-shop-docs/images/unreal/start_email_login.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp
    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://mintlify.s3.us-west-1.amazonaws.com/sequence-0fb8d9e6-shop-docs/images/unreal/confirm_email_login.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp
    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/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://mintlify.s3.us-west-1.amazonaws.com/sequence-0fb8d9e6-shop-docs/images/unreal/start_guest_session.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp
    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://mintlify.s3.us-west-1.amazonaws.com/sequence-0fb8d9e6-shop-docs/images/unreal/get_google_token.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp
    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://mintlify.s3.us-west-1.amazonaws.com/sequence-0fb8d9e6-shop-docs/images/unreal/get_apple_token.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp
    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/onboarding/authentication#get-google-id-token) node.

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintlify.s3.us-west-1.amazonaws.com/sequence-0fb8d9e6-shop-docs/images/unreal/signin_google.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp
    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/onboarding/authentication#get-apple-id-token) node.

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintlify.s3.us-west-1.amazonaws.com/sequence-0fb8d9e6-shop-docs/images/unreal/signin_apple.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp
    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://mintlify.s3.us-west-1.amazonaws.com/sequence-0fb8d9e6-shop-docs/images/unreal/signin_epic.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp
    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://mintlify.s3.us-west-1.amazonaws.com/sequence-0fb8d9e6-shop-docs/images/unreal/signin_oidc.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp
    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/getting_started) and [configure PlayFab in the Builder](/solutions/builder/embedded-wallet/playfab-configuration).

### PlayFab Registration

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintlify.s3.us-west-1.amazonaws.com/sequence-0fb8d9e6-shop-docs/images/unreal/playfab_registration.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp
    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://mintlify.s3.us-west-1.amazonaws.com/sequence-0fb8d9e6-shop-docs/images/unreal/playfab_login.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp
    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://mintlify.s3.us-west-1.amazonaws.com/sequence-0fb8d9e6-shop-docs/images/unreal/playfab_session_ticket.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp
    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/onboarding/manage_sessions#check-existing-session) and will
automatically attempt to link that account.
