Crossplay Integration Kit
Architecture

Adding a provider

Register catalog metadata and one or more typed UCIK provider roles

Adding a provider

A provider has one open FBetideProviderId and registers only the roles it implements. There is no universal provider interface: an identity source does not need fake lobby methods, and a host does not need fake identity methods.

1. Catalog the provider

Own the canonical constant in your integration module and register metadata during StartupModule without initializing the SDK:

const FBetideProviderId MyProvider(FName(TEXT("Acme.Identity")));

FBetideProviderMetadata Metadata;
Metadata.Id = MyProvider;
Metadata.DisplayName = NSLOCTEXT("Acme", "Provider", "Acme Identity");
Metadata.OwningKit = TEXT("AcmeIntegration");
Metadata.Roles = static_cast<int32>(EBetideProviderRole::IdentitySource)
	| static_cast<int32>(EBetideProviderRole::IdentityAuthority);
Metadata.Platforms = static_cast<int32>(EBetideProviderPlatform::Win64);
Metadata.DocumentationId = TEXT("AcmeIdentity");
Metadata.SettingsId = TEXT("AcmeSettings");
FBetideProviderCatalog::Get().Register(MoveTemp(Metadata), []
{
	FBetideProviderConfiguration Status;
	Status.bConfigured = !GetDefault<UAcmeSettings>()->ClientId.IsEmpty();
	Status.Reason = Status.bConfigured ? NAME_None : FName(TEXT("ClientIdMissing"));
	return Status;
});

Unregister with the same ID and owning-kit name in ShutdownModule. Duplicate registration keeps the first owner and logs both owners.

2. Register a typed role

Implement IUCIKCredentialProvider to produce exact credential kinds and audiences, or IUCIKIdentityProvider to advertise and execute login routes. Register with FUCIKCredentialProviderRegistry or FUCIKIdentityProviderRegistry; the registries reject IDs whose catalog roles do not match.

Credential sources own acquisition, cancellation, and release. Authorities own login, continuation, linking, logout, challenges, refresh state, and authority-specific secrets. A route descriptor connects the two with exact source ID, credential kind, audience, encoding, supported platforms, variable fields, and availability reason.

Gameplay, hosting, matchmaking, progression, social, and transport roles use their own typed registries. The same provider ID may register several roles independently.

3. Prove the contract

Add Automation tests under your module's Private/Tests for:

  • catalog and role registration/unregistration;
  • installed, platform-supported, configured, and runtime-available states;
  • exact credential kind, audience, encoding, cancellation, and release;
  • route validation and explicit account policy;
  • terminal-once operation behavior and challenge ID/expiry validation;
  • redaction of credentials and secret fields;
  • WITH_UCIK=0 compilation for the standalone kit.

Never log credential payloads or surface provider continuation tokens. Every failure must identify role, provider, route, and the missing settings key when known.

On this page