Table of Contents

Class BaseServerAuthenticator

Namespace
FishMMO.Server.Implementation
Assembly
FishMMO.Server.dll

Abstract base MonoBehaviour authenticator that routes FishNet transport callbacks to an engine-independent BaseAuthenticatorCore<TConnection> instance. All handshake, TTL, rate-limit, and worker logic lives in the core; this class bridges FishNet lifecycle events (broadcasts, connection state) to the core.

public abstract class BaseServerAuthenticator : Authenticator, IServerAuthenticator
Inheritance
Object
Component
Behaviour
MonoBehaviour
Authenticator
BaseServerAuthenticator
Implements
Derived
Inherited Members
Authenticator.Initialized
Authenticator.NetworkManager
Authenticator.OnRemoteConnection(NetworkConnection)
MonoBehaviour.IsInvoking()
MonoBehaviour.CancelInvoke()
MonoBehaviour.StopCoroutine(Coroutine)
MonoBehaviour.StopAllCoroutines()
MonoBehaviour.destroyCancellationToken
MonoBehaviour.useGUILayout
MonoBehaviour.didStart
MonoBehaviour.didAwake
MonoBehaviour.runInEditMode
Behaviour.enabled
Behaviour.isActiveAndEnabled
Component.GetComponent<T>()
Component.TryGetComponent<T>(out T)
Component.GetComponentInChildren<T>()
Component.GetComponentsInChildren<T>()
Component.GetComponentInParent<T>()
Component.GetComponentsInParent<T>()
Component.GetComponents<T>()
Component.GetComponentIndex()
Component.CompareTag(TagHandle)
Component.transform
Component.transformHandle
Component.gameObject
Component.tag
Object.GetEntityId()
Object.GetInstanceID()
Object.GetHashCode()
Object.InstantiateAsync<T>(T)
Object.InstantiateAsync<T>(T, Transform)
Object.InstantiateAsync<T>(T, Vector3, Quaternion)
Object.InstantiateAsync<T>(T, Transform, Vector3, Quaternion)
Object.Instantiate(Object, Vector3, Quaternion)
Object.Instantiate(Object, Vector3, Quaternion, Transform)
Object.Instantiate(Object)
Object.Instantiate(Object, Scene)
Object.Instantiate<T>(T, InstantiateParameters)
Object.Instantiate<T>(T, Vector3, Quaternion, InstantiateParameters)
Object.Instantiate(Object, Transform)
Object.Instantiate<T>(T)
Object.Instantiate<T>(T, Vector3, Quaternion)
Object.Instantiate<T>(T, Vector3, Quaternion, Transform)
Object.Instantiate<T>(T, Transform)
Object.Destroy(Object)
Object.DestroyImmediate(Object)
Object.DontDestroyOnLoad(Object)
Object.DestroyObject(Object)
Object.FindObjectsOfType<T>()
Object.FindObjectsByType<T>(FindObjectsSortMode)
Object.FindObjectsByType<T>(FindObjectsInactive, FindObjectsSortMode)
Object.FindObjectOfType<T>()
Object.FindFirstObjectByType<T>()
Object.FindAnyObjectByType<T>()
Object.FindFirstObjectByType<T>(FindObjectsInactive)
Object.FindAnyObjectByType<T>(FindObjectsInactive)
Object.FindObjectsByType<T>()
Object.FindObjectsByType<T>(FindObjectsInactive)
Object.ToString()
Object.name
Object.hideFlags

Fields

workerCts

CancellationTokenSource for async workers. Created in InitializeWorkers, cancelled in ShutdownWorkers.

protected CancellationTokenSource workerCts

Field Value

CancellationTokenSource

Properties

Core

The engine-independent authenticator core. Created by InitializeCoreInstance().

protected abstract BaseAuthenticatorCore<NetworkConnection> Core { get; }

Property Value

BaseAuthenticatorCore<NetworkConnection>

LogPrefix

Display name used in log messages. Defaults to the concrete class name.

protected virtual string LogPrefix { get; }

Property Value

string

Server

The server instance providing access to AccountManager and other infrastructure.

public IServer<INetworkManagerWrapper, NetworkConnection, IServerBehaviour> Server { get; set; }

Property Value

IServer<INetworkManagerWrapper, NetworkConnection, IServerBehaviour>

ShutdownToken

Exposed to subclasses so fire-and-forget async operations (e.g. renewal token issuance) can cooperatively cancel during server shutdown rather than accessing disposed database handles after FishMMO.Server.Implementation.Server.PerformShutdown() completes.

protected CancellationToken ShutdownToken { get; }

Property Value

CancellationToken

Methods

AreWorkersDrained()

Returns true when all bounded channels are empty and no worker tasks are still running. Used by the server shutdown coroutine to poll for completion without blocking the main thread.

public virtual bool AreWorkersDrained()

Returns

bool

CreateAccountManager()

Creates the appropriate IAccountManager<TConnection> for this authenticator type. SRP authenticators return an SrpAccountManager, token authenticators return a TokenAccountManager.

public abstract IAccountManager<NetworkConnection> CreateAccountManager()

Returns

IAccountManager<NetworkConnection>

EnqueueMainThreadAction(Action)

Thread-safe enqueue of an action to be executed on the main Unity thread.

protected void EnqueueMainThreadAction(Action action)

Parameters

action Action

InitializeCoreInstance()

Creates the protocol-specific core instance. Called at the start of InitializeWorkers() before workers are started. Subclasses must create and store their typed core reference here.

protected abstract void InitializeCoreInstance()

InitializeOnce(NetworkManager)

Initializes this script for use.

public override void InitializeOnce(NetworkManager networkManager)

Parameters

networkManager NetworkManager

InitializeWorkers()

Creates the core instance and starts async workers. Called after Server is assigned.

public void InitializeWorkers()

InvokeClientAuthenticationResult(NetworkConnection, bool)

Invokes the client authentication result event for post-authentication logic.

protected void InvokeClientAuthenticationResult(NetworkConnection conn, bool authenticated)

Parameters

conn NetworkConnection
authenticated bool

IsConnectionAwaitingQueueAdmission(NetworkConnection)

Whether this connection is waiting for login-queue admission, and so should be exempt from the handshake timeout. Only the Login Server has a queue; the default is false everywhere else.

protected virtual bool IsConnectionAwaitingQueueAdmission(NetworkConnection conn)

Parameters

conn NetworkConnection

Returns

bool

OnAuthSweep()

Override for subclass-specific periodic auth state cleanup. Called every frame; implementations should use bounded scan/remove to stay cheap.

protected virtual void OnAuthSweep()

OnAuthentication(NetworkConnection, bool)

Invokes the authentication result event for a connection. On success, the stale-auth sweep no longer purges this connection.

public virtual void OnAuthentication(NetworkConnection conn, bool authenticated)

Parameters

conn NetworkConnection
authenticated bool

OnConnectionStopped(NetworkConnection)

Override to release subclass-owned per-connection state when a remote connection stops. Called before the core purges its own auth state for the connection.

protected virtual void OnConnectionStopped(NetworkConnection conn)

Parameters

conn NetworkConnection

The connection that stopped.

OnUpdate()

Override for subclass-specific per-frame logic (e.g., additional rate-limit sweeps).

protected virtual void OnUpdate()

RegisterProtocolHandlers(NetworkManager)

Registers protocol-specific broadcast handlers (e.g., SRP or token auth). Called once during InitializeOnce(NetworkManager).

protected abstract void RegisterProtocolHandlers(NetworkManager networkManager)

Parameters

networkManager NetworkManager

ResolveRateLimitKey(NetworkConnection)

Resolves the real client IP for rate limiting. Requires the IP to have been recovered from a verified connection token or auth token. Returns null if the real IP is not yet available — callers MUST disconnect the client. Never falls back to proxy IP or ClientId.

protected string? ResolveRateLimitKey(NetworkConnection conn)

Parameters

conn NetworkConnection

Returns

string

Remarks

Every game server (Login, World and Scene alike) sits behind the same L4 UDP proxy and binds to loopback, so conn.GetAddress() is 127.0.0.1 for every client on every server type. Falling back to it would put all pre-authentication clients in one rate-limit bucket; falling back to ClientId would hand each reconnect a fresh bucket and disable per-IP limiting altogether. The real IP comes only from the IPFetch-issued connection token.

ShutdownWorkers()

Shuts down async workers, disposes resources, and drains the main-thread queue.

public virtual void ShutdownWorkers()

TryMintConnectionToken(NetworkConnection, out string)

Mints a connection token for conn's next hop, binding the real IP this server already verified for it.

protected bool TryMintConnectionToken(NetworkConnection conn, out string token)

Parameters

conn NetworkConnection
token string

Returns

bool

True when a token was minted; false when the real IP or key is unavailable.

Remarks

Lets the server a client is currently authenticated to hand it a token for the server it is about to connect to (Login → World, World → Scene). Every game server sits behind the same L4 UDP proxy, so the next hop needs a token to learn the client's real IP, and only a party that already knows that IP can issue one.

The IPFetch-issued token cannot be reused for this: it is spent on the first handshake and expires after 60 seconds, long before a player finishes character select. Minting per hop also avoids a second HTTP round-trip to IPFetch and works no matter how long the client sat in the login queue.

Format is byte-identical to IPFetch's (see LoginServerController): payload realIp|expiryUnix, HMAC-SHA256 over the payload with the shared key, both halves base64url-encoded. Uses the "shared" key so the no-keyId verification path resolves it.

UnregisterProtocolHandlers(NetworkManager)

Unregisters broadcast handlers and event subscriptions that were registered in InitializeOnce(NetworkManager). Subclasses overriding RegisterProtocolHandlers(NetworkManager) should override this method to unregister their protocol-specific handlers as well. Called during FishMMO.Server.Implementation.BaseServerAuthenticator.OnDestroy() to prevent handler accumulation if the authenticator is destroyed and re-initialized.

protected virtual void UnregisterProtocolHandlers(NetworkManager networkManager)

Parameters

networkManager NetworkManager

Events

OnAuthenticationResult

Event triggered when server authentication completes for a connection.

public override event Action<NetworkConnection, bool> OnAuthenticationResult

Event Type

Action<NetworkConnection, bool>

OnClientAuthenticationResult

Event triggered for custom post-authentication logic in server behaviours.

public event Action<NetworkConnection, bool> OnClientAuthenticationResult

Event Type

Action<NetworkConnection, bool>