EOS Integration KitAlpha
v5.0.1

Steam

Authenticate players using their Steam account

Steam authentication lets players log in using their existing Steam account. Uses the Connect Interface - no Epic account required.

Want more from Steam? Steam Integration Kit offers comprehensive Steam platform integration with the latest Steamworks SDK, native Blueprint support for achievements, leaderboards, workshop, inventory, and more. Fully compatible with EOS Integration Kit.

For true crossplay, check out Ultimate Crossplay Integration Kit. It bundles both EIK and SIK with unified nodes that manage sessions across EOS and Steam simultaneously, and much more.

Prerequisites

  • OnlineSubsystemSteam plugin enabled
  • Steam client running on user's machine
  • Steam App ID configured in your project

Steam login uses the Connect Interface, which provides access to EOS game services (lobbies, matchmaking, voice chat) without requiring an Epic Games account.

Setup

1. Enable Steam Subsystem

Add to your DefaultEngine.ini:

[OnlineSubsystem]
DefaultPlatformService=Steam

[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=480

2. Configure EOS for Steam

In Project Settings → Plugins → EOS Integration Kit, ensure your artifact is configured with Steam as an identity provider in the EOS Developer Portal.

Implementation

Use Login Using Connect Interface with Steam Session Ticket type:

  1. Add the Login Using Connect Interface node
  2. Set Login Method to Steam Session Ticket
  3. Leave Token empty (auto-retrieved from Steam)

Leave the Token field empty - EIK automatically retrieves the Steam session ticket from OnlineSubsystemSteam.

The EIKCore abstraction handles Steam ticket retrieval automatically:

#include "Interfaces/IEIKAuth.h"

void UMyClass::LoginWithSteam()
{
    IEIKAuth* Auth = GetIEIKAuth();
    if (!Auth) return;

    // EIKCore can auto-retrieve Steam ticket, or you can provide one
    FEIKLoginCredentials Credentials = FEIKLoginCredentials::SteamLogin();

    Auth->LoginConnect(0, Credentials,
        [this](const TEIKAsyncResult<FEIKLoginResult>& Result)
        {
            if (Result.IsSuccessful())
            {
                UE_LOG(LogTemp, Log, TEXT("Steam login successful! AccountId: %s"),
                    *Result.GetValue().AccountId.ToString());
            }
            else
            {
                UE_LOG(LogTemp, Error, TEXT("Steam login failed: %s"),
                    *Result.GetError().ErrorMessage);
            }
        });
}
Build.cs
PrivateDependencyModuleNames.Add("EIKCore");

Modern approach for UE 5.2+ using the Online Services API:

#include "Online/OnlineServices.h"
#include "Online/Auth.h"

using namespace UE::Online;

void UMyClass::LoginWithSteam()
{
    IOnlineServicesPtr Services = GetServices(EOnlineServices::Epic);
    if (!Services.IsValid()) return;

    IAuthPtr Auth = Services->GetAuthInterface();
    if (!Auth.IsValid()) return;

    FAuthLogin::Params Params;
    Params.PlatformUserId = FPlatformMisc::GetPlatformUserForUserIndex(0);
    Params.CredentialsType = FName(TEXT("EIK_Connect_Steam"));

    Auth->Login(MoveTemp(Params)).OnComplete(
        [this](const TOnlineResult<FAuthLogin>& Result)
        {
            if (Result.IsOk())
            {
                UE_LOG(LogTemp, Log, TEXT("Steam login successful!"));
            }
            else
            {
                UE_LOG(LogTemp, Error, TEXT("Steam login failed: %s"),
                    *Result.GetErrorValue().GetLogString());
            }
        });
}
Build.cs
PrivateDependencyModuleNames.AddRange(new string[] { "OnlineServicesInterface", "OnlineServicesEIK" });

Legacy approach using the Online Subsystem interface:

#include "OnlineSubsystem.h"
#include "Interfaces/OnlineIdentityInterface.h"

void UMyClass::LoginWithSteam()
{
    IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get(FName(TEXT("EIK")));
    if (!OnlineSub) return;

    IOnlineIdentityPtr Identity = OnlineSub->GetIdentityInterface();
    if (!Identity.IsValid()) return;

    // Steam Connect-only login (auto-retrieves ticket)
    FOnlineAccountCredentials Credentials;
    Credentials.Type = TEXT("noeas_+_steam");

    Identity->AddOnLoginCompleteDelegate_Handle(0,
        FOnLoginCompleteDelegate::CreateLambda(
            [](int32 LocalUserNum, bool bSuccess, const FUniqueNetId& UserId, const FString& Error)
            {
                if (bSuccess)
                {
                    UE_LOG(LogTemp, Log, TEXT("Steam login successful!"));
                }
                else
                {
                    UE_LOG(LogTemp, Error, TEXT("Steam login failed: %s"), *Error);
                }
            }));

    Identity->Login(0, Credentials);
}
Build.cs
PrivateDependencyModuleNames.AddRange(new string[] { "OnlineSubsystem", "OnlineSubsystemEIK", "OnlineSubsystemSteam" });

Manual Token Retrieval

If you need to manually retrieve the Steam session ticket (for custom flows):

#include "OnlineSubsystem.h"
#include "Interfaces/OnlineIdentityInterface.h"

void UMyClass::GetSteamTicket()
{
    IOnlineSubsystem* SteamSub = IOnlineSubsystem::Get(FName(TEXT("Steam")));
    if (!SteamSub) return;

    IOnlineIdentityPtr SteamIdentity = SteamSub->GetIdentityInterface();
    if (!SteamIdentity.IsValid()) return;

    SteamIdentity->GetLinkedAccountAuthToken(0, TEXT("Session"),
        IOnlineIdentity::FOnGetLinkedAccountAuthTokenCompleteDelegate::CreateLambda(
            [](int32 LocalUserNum, bool bSuccess, const FExternalAuthToken& AuthToken)
            {
                if (bSuccess)
                {
                    FString TicketString = AuthToken.TokenString;
                    // Use TicketString with EOS login
                }
            }));
}

Troubleshooting

IssueSolution
Steam not detectedEnsure Steam client is running and OnlineSubsystemSteam is enabled
Invalid credentialsVerify Steam App ID matches your EOS Developer Portal configuration
Login timeoutCheck internet connection and EOS service status

On this page