AuthCore Server Admin Guide
A step-by-step guide for server owners, from first install to a fully secured server. AuthCore is an authentication framework for offline/cracked servers: it forces every player to register with a password and log in before they can play, with 2FA/MFA, a web admin panel, a honeypot, anti-bot protection and network-wide single sign-on.
β¨ AuthCore runs out of the box with zero configuration (SQLite database, no Redis, no email). Every database and service below is optional, enable only what you need.
π§© The same jar is your server mod and your BungeeCord/Velocity proxy plugin, install it once wherever AuthCore should run.
What you'll learn here
| Step | What it covers |
|---|---|
| 1. Pick the right jar | Which of the 7 jars fits your server |
| 2. Install | Drop-in install, config files, startup banner |
| 3. The first player experience | How register/login/lobby actually work |
| 4. settings.conf, the important parts | The ~10 settings you'll actually change |
| 5. Admin commands | Every /authcore command |
| 6. Security checklist | Make your server hard to break |
| 7. Troubleshooting | Fix the common problems |
| 8. Learning path, go deeper | Links to the advanced docs per topic |
1. Pick the right jar
AuthCore ships range jars, one jar covers a whole Minecraft version range. Pick the row matching your server's Minecraft version AND loader:
| Jar | Minecraft versions | Loader |
|---|---|---|
authcore-1.16-1.18-fabric-<v>.jar |
1.16.0 - 1.18.2 | Fabric |
authcore-1.16-1.18-forge-<v>.jar |
1.16.0 - 1.18.2 | Forge |
authcore-1.19-1.21-fabric-<v>.jar |
1.19.0 - 1.21.11 | Fabric |
authcore-1.19-1.21-forge-<v>.jar |
1.19.0 - 1.21.11 | Forge |
authcore-1.19-1.21-neoforge-<v>.jar |
1.19.0 - 1.21.11 | NeoForge |
authcore-26.1-26.3-fabric-<v>.jar |
26.1 - 26.3 | Fabric |
authcore-26.1-26.3-neoforge-<v>.jar |
26.1 - 26.3 | NeoForge |
π‘ Which loader? Use the loader your server already runs, every range ships all supported loaders. Fabric needs Fabric API installed alongside the jar; Forge and NeoForge need nothing extra. All three drop the jar into
mods/.
Download from: Modrinth or GitHub Releases.
π§ Newbie question: "why are there so many jars?", Because Minecraft changed its code format at 26.1, one jar cannot work on every version. Each range jar is tested on every version of its range before release. More background: docs/26x.md.
2. Install
- Download the jar that matches your Minecraft version and loader (Fabric/Forge/NeoForge).
- Put it in the
mods/folder of your server. - Start the server once. AuthCore creates its files automatically:
config/authcore/ βββ settings.conf β the main configuration (explained in section 4) βββ messages.conf β every message players see (translations included) βββ ip-rules.conf β per-IP allow/deny rules βββ security.log β all security events βββ backups/ β automatic database backups βββ database/ β the SQLite database (or your chosen DB)
What you should see in the console (the startup banner):
AuthCore - The Fortress Framework for Minecraft Servers
Version : 1.0.0
Minecraft : 1.21.11
...
Security Summary:
- Password Hashing : argon2
- 2FA (TOTP) : disabled
- Sessions : enabled
If the banner shows a warning about an untested version, the mod still works, it just means the version wasn't in the officially tested set yet. If the server crashes or won't start, jump to section 7 (Troubleshooting).
3. The first player experience (how it works)
This is the flow your players will see, understanding it makes every setting below obvious:
- A player joins β they land in the lobby (spawn): no chat, no commands, no movement (all configurable), blindness/invisibility if configured.
- Premium (paid) accounts are detected automatically - on online-mode servers
the server itself verifies every session; on offline-mode servers AuthCore re-runs the
vanilla encryption handshake and verifies with the server's own Mojang session service
(never blocking the server thread). Verified players are auto-logged-in with a null
password (no generated password is stored), including auto-retrying while the
session API is temporarily unreachable. A player who chose password login
(
/account set-mode offline) is never auto-logged-in. - Offline-mode players run
/register <password> <confirm>. - They run
/login <password>. - If 2FA is enabled, they are asked for their TOTP code (from their authenticator app) or an email code.
- They are released into the world. On their next join, their session resumes automatically (same IP), no password needed until the session expires.
π§ Newbie question: "do my players need to install anything?", No. Plain vanilla players just type
/registerand/loginin chat.
4. settings.conf, the important parts
All settings live in config/authcore/settings.conf (HOCON format). Reload changes with
/authcore reload, no restart needed.
β οΈ Recommended values, not defaults. The snippets below show what to set for a secure setup. Defaults differ (e.g. 2FA is off by default). The full reference with every default is docs/CONFIG.md, bookmark it.
4.1 Server mode & authentication
The server's online/offline mode is always taken automatically from
server.properties (the online-mode line) - there is no
server-mode setting anymore. Premium auto-login is on by default and works the
same on online and offline-mode servers:
session {
authentication {
allow-totp-support = true # 2FA with an authenticator app (default: false)
email-otp-support = false # 2FA via email code (requires SMTP, see 4.5)
require-mfa-for-sensitive = true # players with 2FA must verify it before /account set-password
max-login-attempts = 8 # wrong-password attempts before kick (default: 8)
block-duplicate-session = true # the same account cannot be online twice
premium-auto-login = true # verified Mojang accounts log in automatically (default: true)
allow-offline-players = true # offline (cracked) players may join and register/login
allow-proxy-users = false # block players coming through proxies/VPNs
}
account-lock {
enabled = true # lock the account after repeated failures
max-failed-logins = 8 # failures before locking (default: 8)
lock-duration-ms = 600000 # lock length (10 minutes)
}
enable-sessions = true # remember logins (auto resume on rejoin)
session-from-same-ip-only = true # sessions only resume from the same IP
timeout-ms = 3600000 # session lifetime (1 hour)
cooldown-after-kick-ms = 120000 # wait time after being kicked
}
What to expect: with 2FA on, every login needs password + authenticator code. The
recovery codes (shown at /account codes) can be used once each when the phone
is lost.
Hybrid servers - offline players can join BOTH server modes: with
allow-offline-players = true (the default), offline (cracked) players can join and
register/login on online-mode servers too - AuthCore intercepts the login of
offline-UUID clients on online-mode servers and runs them through vanilla's offline accept
flow (online-mode players still use their real UUID and the normal Mojang session check).
Set allow-offline-players = false to make the server online-mode-only everywhere:
offline-mode players are kicked on arrival (and on online-mode servers vanilla rejects them
at login). On online-mode servers keep enable-secure-profile=false in
server.properties so clients without a secure chat profile (cracked/modded players)
can still join and chat.
How it decides who is online-mode: only the server's own session verification counts
(on online servers vanilla checks every real-UUID profile; on offline servers AuthCore
re-runs the vanilla encryption handshake and verifies with the server's Mojang session
service - no external API calls). The premium-auto-login config is always respected
regardless of the server mode (on by default): verified players are signed in automatically
and are never given a generated password (their stored password stays null). If
auto-login is turned off, those players are treated like any standard account - since their
password is null they are asked to /register on their next re-auth (their online-mode
status is preserved, so auto-login resumes when the config is re-enabled). Everyone else is
asked to /register or /login.
Players can switch their own login style with /account set-mode online
(automatic login) or /account set-mode offline (password login - players who
already have a password simply log in with it; auto-login accounts with no password are
asked to register with /register on their next join). Admins can
force either mode with /authcore set-mode online|offline <player>.
4.2 Lobby (the waiting area)
lobby {
allow-chat = false # can players chat before logging in?
allow-commands = false # can they use commands? (whitelist below)
whitelisted-commands = ["login", "account", "register"]
use-whitelist-as-blacklist = false # true = block only the listed commands
allow-movement = false # lock players in place
allow-item-drop = false # no dropping items in the lobby
allow-item-pickup = false
allow-item-use = false
allow-block-interaction = false
max-lobby-users = 50 # lobby size limit (kicks extra joiners)
captcha { enabled = true } # human verification: physical task for bot-like players
announcements = ["Welcome! Register with /register <password> <confirm>"]
}
4.3 ClientGuard (anti-bot / anti-bypass)
AuthCore profiles every player's behavior and raises a risk score when something looks automated. Signals: missing client settings, ghost clients (no chat/auth), movement/click/ chat/payload floods, tab-completion probing, fake companion clients, confusable names.
session {
client-guard {
enabled = true
ghost-kick-after-sec = 45 # kick silent bots after 45s idle in the lobby
settings-timeout-sec = 20 # flag clients that never send their settings
move-packet-rate-per-sec = 120
lobby-click-rate-per-sec = 12
payload-rate-per-sec = 15
lobby-chat-rate-per-sec = 3
risk-alert-threshold = 40 # log + webhook alert
risk-kick-threshold = 70 # kick from the lobby
risk-2fa-threshold = 50 # high-risk players must complete 2FA
re-challenge-interval-sec = 30 # periodic companion attestation
challenge-timeout-sec = 10
companion-spoof-risk = 40
concurrent-login-policy = "kick-new" # "allow" | "kick-new" | "kick-old"
allowed-name-regex = "^[A-Za-z0-9_]{3,16}$"
detect-confusable-names = true # flag StΠ΅vΠ΅ (lookalike) names
require-token-for-resume = true
vanilla-resume-risk = 10
max-payload-bytes = 8192
}
}
Vanilla players are never locked out. Every check is risk-based; the normal chat login always works.
4.4 Network-wide single sign-on (SSO)
With Redis enabled, a player who logs in on one server of your network is trusted on all of them:
session {
sso {
enabled = true # requires database.redis.enabled = true
session-ttl-min = 30 # how long a login is honoured network-wide
trust-vanilla = false # also trust vanilla clients when a remote session exists
}
}
4.5 Email (for email 2FA + recovery)
email {
enabled = true
host = "smtp.gmail.com"
port = 587
username = "you@gmail.com"
password = "your-app-password"
from = "you@gmail.com"
}
4.6 Web admin panel
session {
web-panel {
enabled = true
host = "127.0.0.1" # keep local, tunnel it (or bind 0.0.0.0 with a token)
port = 25570
token = "change-me-long-random-token"
# https-enabled = true # optional HTTPS (self-signed keystore)
}
honeypot { enabled = true; port = 25571 } # traps and logs port scanners
}
The panel rejects requests without a token (401), with a wrong token (401) and locks out
brute force after repeated failures (429). A readonly-token exists for status-only access.
How to use the panel: docs/WEBPANEL.md.
4.7 Databases (all optional)
database {
sqlite { file = "authCore-db.sqlite" } # default: zero-config
# mysql { enabled = true; host = "..."; ... }
# postgres { enabled = true; ... }
redis { enabled = false; host = "localhost"; port = 6379 } # sessions sync, SSO, bans, event bus
}
π§ Newbie question: "which database should I use?", Start with SQLite (zero setup). Move to MySQL/PostgreSQL only when you run several servers on one account database, and add Redis when you want network-wide sessions/SSO.
4.8 Feature-by-feature setup (every feature, with scenarios)
This section explains every feature AuthCore ships: what it protects, the exact config
to enable it, and a real-world scenario showing when you want it. All settings live in
config/authcore/*.conf and hot-reload with /authcore reload.
4.8.1 Human verification (action captcha)
What it does. AuthCore's single human-verification method. After every login or
register it observes the player for a short window and scores the session across many
independent signals: ghost pattern (no look/move/click/chat/settings), ClientGuard risk,
instant login (password typed within seconds of joining - bots use stored credentials),
failed attempts before success, missing 2FA on a TOTP account, fresh account age, and fast
reconnect loops. Trust signals (premium, valid session token, previously trusted account,
already passed the challenge) subtract from the score. Only when the total reaches
bot-score-threshold is the player challenged with a physical task: sneak for N
seconds, jump N times, or look up at the sky - things only a real client can do.
lobby {
captcha {
enabled = true # the whole verification system (default: true)
observation-window-sec = 45 # how long we watch before deciding (default: 45)
auto-challenge-ghosts = true # zero-behavior players are always challenged
trigger-risk-threshold = 60 # ClientGuard risk that alone justifies a challenge
bot-score-threshold = 60 # total score needed to challenge (default: 60)
# signal weights (bot signals ADD, trust signals SUBTRACT)
instant-login-sec = 5 # login within 5s of joining = +25 score
failed-attempt-score = 10 # 2+ wrong passwords this session
missing-mfa-score = 20 # TOTP account logged in without the code
fresh-account-hours = 24 # account younger than a day = +15
fast-rejoin-sec = 20 # reconnect within 20s = +20
trusted-score = 20 # previously trusted account = -20
premium-score = 20 # Mojang-verified = -20
session-token-score = 20 # valid companion token resume = -20
already-verified-score = 50 # passed earlier this session = -50
action-ttl-ms = 60000 # time to finish the task (default: 60s)
action-sneak-seconds = 3 # sneak challenge length
action-jump-count = 5 # jump challenge count
action-look-up-seconds = 3 # look-up challenge length
disable-when-tps-below = 0 # skip during lag spikes (0 = never)
}
}
Scenario - public survival server. Every login is scored. A returning player types
their password slowly, moves, looks around and chats - they score 0 and never see the
captcha. A bot that joins with a stolen password, logs in in 2 seconds and then stands
still scores: instantLogin +25, ghost +40, freshAccount +15 = 80 > 60 and is challenged
(and kicked if it cannot sneak/jump/look up). To make verification stricter, raise
bot-score-threshold to 80; to catch more bots, lower it to 40.
4.8.2 MFA / 2FA (TOTP, email OTP, recovery codes)
What it does. Adds a second factor after the password. TOTP uses an authenticator
app (Google Authenticator, Aegis, Authy); email OTP sends a one-time code via SMTP;
recovery codes are single-use backups shown at /account codes. Sensitive actions
(password change, unregister) can require MFA again (step-up).
session {
authentication {
allow-totp-support = true # authenticator-app 2FA (default: false)
email-otp-support = false # email-code 2FA (needs SMTP, see 4.5)
require-mfa-for-sensitive = true # step-up before /account set-password
}
}
email { enabled = true; host = "smtp.gmail.com"; port = 587; username = "you@gmail.com"; password = "app-password"; from = "you@gmail.com" }
Scenario - staff accounts. Turn TOTP on and tell staff to scan the QR code shown at
first join. Even if a staff password leaks in a credential dump, the attacker cannot
answer the TOTP code. missing-mfa-score in the human verification then also flags
password-only logins on these accounts as suspicious.
4.8.3 Brute force & account lock
What it does. Caps wrong-password attempts per session, applies an exponential kick cooldown for repeat offenders and can lock the account entirely after N failures (the lock is persisted and survives restarts).
session {
authentication { max-login-attempts = 8 }
cooldown-after-kick-ms = 120000
progressive-punishment { enabled = true; base-cooldown-ms = 5000; multiplier = 3.0; max-cooldown-ms = 300000 }
account-lock { enabled = true; max-failed-logins = 8; lock-duration-ms = 600000 }
}
Scenario - credential-stuffing wave. An attacker tries leaked passwords against many accounts from one IP. Each failure counts; after 8 failures the account locks for 10 minutes and the IP gets blocked by AuthIntelligence (see 4.8.6), so the wave burns itself out without ever succeeding.
4.8.4 Sessions & trusted players
What it does. Successful logins create a server-side session (token rotated every
login, IP-bound by default) so players do not re-type their password every rejoin. The
account is also marked "trusted" for bypass-captcha-hours - which now only reduces
the verification score (it never bypasses it entirely).
session {
enable-sessions = true
session-from-same-ip-only = true
timeout-ms = 3600000
trusted {
enabled = true
bypass-captcha-hours = 24
}
}
Scenario - minigame network with hub transfers. A player logs in once, then hops between hub and minigame servers. Sessions make every hop instant; on a Redis-backed network, SSO (4.8.8) extends the same trust across the whole network.
4.8.5 ClientGuard (anti-bot / anti-bypass)
What it does. Builds a per-player behavioral profile from packet-level signals (brand anomaly, missing settings, ghost behavior, move/click/chat/payload floods, tab probing, fake companion attestation, confusable names) and converts them into a 0-100 risk score with a decision matrix: alert β require 2FA β kick.
session {
client-guard {
enabled = true
ghost-kick-after-sec = 45
settings-timeout-sec = 20
risk-alert-threshold = 40
risk-2fa-threshold = 50
risk-kick-threshold = 70
concurrent-login-policy = "kick-new"
detect-confusable-names = true
require-token-for-resume = true
}
}
Scenario - lobby flooders. A client joins, never sends its settings packet, spams movement packets and probes commands. Each signal adds weight; at risk 70 the lobby kicks it - before it can even attempt a login. The same risk score feeds the human-verification scoring from 4.8.1.
4.8.6 AuthIntelligence (login intelligence)
What it does. Detects attacks on the login process itself: password spraying (one password against many accounts), per-IP login floods, 2FA brute force (right password + wrong code = compromised password), guess-then-success, mass registration (bot farms), session-token replay and post-login account takeover (new network + fast password change). Each detection writes a security log + webhook alert and can block the IP.
session {
auth-intelligence {
password-spray { enabled = true; window-min = 10; max-accounts = 8 }
login-flood { enabled = true; window-min = 10; max-failures-per-ip = 10; block-minutes = 30 }
totp-bruteforce { enabled = true; window-min = 10; max-failures = 5 }
success-after-failures { enabled = true; min-failures = 3 }
registration-farm { enabled = true; window-min = 10; max-accounts-per-ip = 3; block-minutes = 30 }
session-replay { enabled = true }
ato-pattern { enabled = true; window-min = 30 }
}
}
Scenario - bought-account reseller. A script tries one freshly bought password against
hundreds of accounts: password-spray fires the webhook after 8 accounts. Later, one
succeeds and the script immediately changes the password from a new IP: ato-pattern
alerts that the account was taken over.
4.8.7 Rate limits & IP rules
What it does. Per-IP join/login rate limits stop bot floods before they reach the auth logic; ip-rules.conf allows or denies specific IPs/networks outright.
session {
rate-limit {
enabled = true
max-joins-per-window = 5
window-ms = 60000
command-cooldown-ms = 1000
alert-on-fast-rejoin = true
fast-rejoin-window-ms = 500
}
}
# config/authcore/ip-rules.conf
# allow = ["127.0.0.1", "192.168.0.0/16"]
# deny = ["45.155.0.0/16"]
Scenario - DDoS-grade join flood. Attackers cycle thousands of fake connections per
minute. max-joins-per-window caps each IP; alert-on-fast-rejoin flags the
disconnect-rejoin loop; a known abusive range goes straight to deny in ip-rules.conf.
4.8.8 SSO & Redis network features
What it does. With Redis enabled: network-wide single sign-on (login on one server = trusted on all), duplicate-session blocking across servers, remote bans and a cross-server security event bus.
database { redis { enabled = true; host = "localhost"; port = 6379 } }
session {
sso { enabled = true; session-ttl-min = 30; trust-vanilla = false }
}
Scenario - 3-server network. A player logs in on the lobby server. Without SSO they re-type the password on each game server; with SSO the lobby broadcasts the login via Redis and the game servers trust it instantly. A ban on one server propagates to all.
4.8.9 Web panel & honeypot
What it does. The web panel is a token-protected admin dashboard (player lists,
lookups, actions, metrics) with brute-force lockout (429 after 5 wrong tokens). The
honeypot opens a decoy port that logs any connection as HONEYPOT_HIT - perfect for
spotting port scanners before they find the real game port.
session {
web-panel {
enabled = true
host = "127.0.0.1"
port = 25570
token = "change-me-long-random-token"
# readonly-token = "..."
# https-enabled = true
}
honeypot { enabled = true; port = 25571 }
}
Scenario - hosting a server for strangers. Bind the panel to 127.0.0.1 and tunnel it over SSH; enable HTTPS with the self-signed keystore for remote admin. The honeypot on a random port logs every probe, so you see attackers 'knocking' before they ever reach 25565.
4.8.10 Online-mode accounts & proxy support
What it does. Premium (paid) accounts are auto-verified through the server's own
Mojang session service (outage-proof, no API calls) and auto-login - on online and
offline-mode servers, with no server-mode setting needed (it's always read from
server.properties). Auto-login players keep a null password; they can switch to
password login with /account set-mode offline (admins: /authcore set-mode
offline <player>). Proxy support parses BungeeCord-style or Velocity-modern
forwarding (HMAC-verified) so the real client IP is used for every check; the proxy plugin
can even block unauthenticated players before they reach the backend.
session {
authentication {
premium-auto-login = true
}
proxy-support { enabled = true; protocol = "auto" } # auto | bungeecord | velocity-modern
}
Scenario - network behind Velocity. Enable proxy-support with the Velocity shared
secret; every GeoIP, rate limit, session and intelligence check then uses the real player
IP, and proxy-side auth (velocity-plugin) rejects unauthenticated joins at the proxy
itself - the backend never even sees them.
4.8.11 Maintenance, shadow-ban, auto-whitelist & announcements
What it does. /authcore maintenance on blocks all joins with a custom message.
Shadow-ban hides security blocks behind a generic "connection lost" so attackers cannot
tell they were detected. Auto-whitelist adds every registered account to the vanilla
whitelist. Rotating announcements greet authenticated players.
session {
maintenance { enabled = false; kick-message = "Server under maintenance." }
shadow-ban { enabled = false }
auto-whitelist { enabled = true }
}
lobby {
announcements = ["Welcome, %player%!"]
announcement-interval-sec = 300
}
Scenario - launching a new map. Flip maintenance on while uploading the world, then off. Shadow-ban keeps bot operators blind to your detection while you gather intel. Auto-whitelist keeps the server invite-only after a closed beta.
4.8.12 Backups, Discord linking & locales
What it does. Automatic database backups (SQLite file copy, rotating) run on an
interval; Discord account linking connects in-game accounts to Discord via a code flow;
7 built-in locales plus custom messages-<lang>.conf files localize every message.
session {
backup { interval-hours = 24; keep = 10 }
discord-link { enabled = true }
}
language = "de" # or en, es, fr, pt, ru, zh, or a custom messages-<lang>.conf
Scenario - community server ops. Backups run nightly and keep 10 copies, so a bad
config or a deleted account is recoverable. Discord linking gives staff a way to recover
accounts through the linked Discord ID. German players get language = "de" with the
bundled translation.
5. Admin commands
All admin commands need OP 3+, a LuckPerms node, or console access:
| Command | What it does |
|---|---|
/authcore reload |
Reload settings.conf + messages.conf |
/authcore validate |
Dry-run check of your config |
/authcore list players |
All registered players |
/authcore list online-players / offline-players |
Online/offline only |
/authcore whois <player> |
Full info including the ClientGuard profile (risk score + signals) |
/authcore history <player> |
Last 10 logins with risk scores |
/authcore delete player <name> |
Delete an account |
/authcore destroy-session <player> |
Force-logout a player |
/authcore set-password <player> <new> (alias resetpw) |
Reset a password |
/authcore set-mode online|offline <player> |
Force automatic login / password login per account (offline mode clears the password - the player registers a new one) |
/authcore set-spawn limbo <x> <y> <z> |
Set the lobby spawn point |
/authcore backup |
Create a database backup (also automatic) |
/authcore export |
Export all accounts as JSON |
/authcore maintenance on/off |
Maintenance mode (blocks joins) |
Player commands: /register, /login, /account set-password, /account codes
(recovery codes), /account email, /account nickname, /account logout,
/account set-mode online|offline, /account unregister, /account recover,
/discord link, /discord unlink.
6. Security recommendations (checklist)
- The server's mode is always read from
server.properties(there is noserver-modesetting anymore) - it needs no configuration; on online-mode servers keepenable-secure-profile=falseinserver.propertiesso clients without a secure chat profile can still join and chat. - Enable 2FA (
allow-totp-support = true), recovery codes are single-use. - Keep
password-hash-algorithm = "argon2"(nevermd5). - Put a long random token on the web panel and keep it on 127.0.0.1 (tunnel it).
- Keep ClientGuard defaults on; check
/authcore whois+security.logfor signals. - Use a proxy (Velocity/BungeeCord) with modern forwarding for networks; enable SSO with Redis when you run multiple servers.
- Backups are automatic (
session.backup.interval-hours), store them off-server. - When something looks wrong, share the error code from the console
(format
AC-<hex>-<hex>-<hex>-<hex>) with the mod author, it pinpoints the exact failure without exposing internals.
π§ Want the why behind each item? The full threat model lives in docs/SECURITY.md.
7. Troubleshooting
| Symptom | Likely cause / fix |
|---|---|
| "Players are not asked to register" | The account was auto-detected as premium (the server's session verification passed) - that is the intended auto-login; to force password login, the player runs /account set-mode offline (or an admin runs /authcore set-mode offline <player>). On online-mode servers keep enable-secure-profile=false in server.properties so cracked/modded clients can still join. |
| 2FA prompt but no TOTP setup link | 2FA secret is generated on first lobby join, have the player re-register or /authcore whois to inspect the account |
| Sessions always ask for password | enable-sessions off, or session-from-same-ip-only with a changing IP |
| Web panel unreachable | Panel binds 127.0.0.1 by default, connect from the same machine or tunnel it (WEBPANEL.md) |
| "Mod requires fabric-api" | Install Fabric API alongside the jar (Fabric loader only, Forge/NeoForge need nothing extra) |
Console shows AC-7-3-1-... |
Database connection failure (module 7 = DATABASE, kind 3 = connection), send the code to the author |
| Server won't start on a newer version | Use the matching range jar; a newer stable may not be covered yet, the weekly compat scan catches these automatically |
| Something behaves oddly after an update | Run /authcore validate, then /authcore reload, config migrations run automatically |
| Players on proxies/VPNs are blocked | That's allow-proxy-users = false (section 4.1), disable it to allow them |
| "PACKET_SEQUENCE_ANOMALY in security.log" | A client sent packets in an unexpected order during login (e.g. SETTINGS before HELLO). This is a bot signal - vanilla clients always follow the HELLO β SETTINGS β READY sequence. If false positives occur, check for modded clients that send extra packets early. |
| "CONCURRENT_FARM in security.log" | Three or more distinct usernames connected from the same IP within 5 seconds. This flags bot-farm login bursts. Whitelist the IP in ip-rules.conf if it's a shared network (e.g. school, LAN event). |
| "LOOK_PATTERN_BOT in security.log" | A player's camera movement has near-zero variance (perfectly still or perfectly regular). Bots often don't look around naturally. Human players have natural-looking variation in their look deltas. |
| "LOGIN_TIMING_BOT in security.log" | Multiple accounts from the same IP logged in with near-identical timestamps (low variance). This indicates synchronized bot-farm timers. The detection uses a 60-second window and requires at least 3 login events. |
| "Web panel returns CORS errors" | The panel now sends Access-Control-Allow-Origin: * headers and handles OPTIONS preflight. If your browser still blocks requests, ensure the panel URL matches the host config and the token header is set correctly. |
8. Learning path, go deeper
This guide intentionally keeps things simple. When you're ready, each topic links to its full documentation:
| Topic | Read this | Why it matters for you |
|---|---|---|
| Every config option (~180 settings, defaults, use-cases) | π Configuration Reference | The single source of truth for settings.conf |
| Putting AuthCore behind Velocity / BungeeCord | π Proxy Support | Real client IPs, modern forwarding, proxy-side auth |
| Web panel API & HTTPS setup | π Web Panel | Automate bans, player lookup, curl examples |
| Threat model (OWASP + Minecraft) | π‘οΈ Security Model | Understand what AuthCore defends against |
| 26.1-26.3 range jars & architecture | π¦ 26.1-26.3 Builds | Why multiple jars exist, how they're verified |
| Building from source / contributing | βοΈ Development | For developers, not server admins |
| Integrating other plugins with AuthCore | π Developer API | AuthCoreApi for plugin authors |
| Release history | π Changelog | What changed between versions |
π§ Suggested order for a newbie: read this guide β read FLOWS.md to see exactly what happens on join, register, login and premium verification β skim CONFIG.md once β then read PROXY.md and WEBPANEL.md only when you set those up.
9. Getting help
- Bugs & ideas: open an issue on GitHub
- Questions: Discussions
- Discord / webhook alerts: see section 4.6 and WEBPANEL.md
- When reporting a bug: include the console error code (
AC-...) and the version from the startup banner, it pinpoints the failure without exposing internals.