
AuthCore
Standalone login and registration, fully configurable in game.

AuthCore locks an offline mode server behind a password without dragging in a login plugin from a decade ago. Players register once, log in when they join, and every screen they see is editable in game.
It knows the difference between a paid account and a name somebody typed. When a name belongs to a paid account, AuthCore has Mojang prove that this player really owns it, the same check an online mode server runs, even though your server stays in offline mode. The owner gets in instantly as themselves, with their real id and skin and no password, and nobody else ever gets that account's id: a cracked player who happens to use a paid account's name plays as *Name and registers like any other cracked player. Players who were already on your server before AuthCore keep their inventory, permissions and everything else.
How the password is asked for depends on the server. On Paper 1.21.6 and newer it is a form on the loading screen, before the player exists in the world. Everywhere else the loading screen cannot show a form, so the player joins and is locked: held on the spot, blinded, hidden, and unable to chat, run a command or touch anything until they type /login or /register. Both are the real login, not one of them a fallback. A player on an older game joining a new server through ViaVersion cannot see the form either, so they are let into the lock and log in with the command instead of waiting on a loading screen that never changes.
Staff can sort out any login without knowing the password: log a stuck player in, give a name its first password, change or clear one, log somebody out, erase one account or every account nobody has used in months. And the passwords players type never end up in the server log.
What it does
Installation
- Drop AuthCore.jar into your server's plugins folder.
- Restart the server. The plugin writes its own configuration on first start.
- Run /auth admin hub in game to set everything up. There is no file editing step.
Optional integrations
All of these are soft dependencies. AuthCore loads and runs with none of them installed.
| Plugin | What it adds |
|---|---|
| PlaceholderAPI | Registers the placeholder expansion listed below. |
| ViaVersion | Optional integration. |
Commands
Generated from the plugin's own command registry at version 1.4.3, so this list cannot drift out of date.
Requires authcore.login
| Usage | Permission | Description |
|---|---|---|
| /login <password> | none | Log in |
Requires authcore.register
| Usage | Permission | Description |
|---|---|---|
| /register <password> <password again> | none | Register this name |
Requires authcore.changepassword
| Usage | Permission | Description |
|---|---|---|
| /changepassword <current> <new> | none | Change your password |
Requires authcore.logout
| Usage | Permission | Description |
|---|---|---|
| /logout | authcore.logout | Log out |
Requires authcore.admin
| Usage | Permission | Description |
|---|---|---|
| /auth | authcore.admin | AuthCore administration |
| Usage | Permission | Player only | Description |
|---|---|---|---|
| /auth admin <action> [player] [value] | authcore.admin | no | Administration |
| Usage | Permission | Description |
|---|---|---|
| /auth admin hub | authcore.admin | Open the admin hub |
| /auth admin accounts | authcore.admin | Open the account list |
| /auth admin status | authcore.admin | Show what the plugin is doing |
| /auth admin info <player> | authcore.admin | Everything recorded about one account |
| /auth admin recent [count] | authcore.admin | Who joined most recently |
| /auth admin forcelogin <player> | authcore.admin.forcelogin | Log somebody in without their password, in the world or on the loading screen |
| /auth admin forcelogout <player> | authcore.admin.forcelogout | Log somebody out, so they have to log in again to keep playing |
| /auth admin forceregister <player> <password> | authcore.admin.forceregister | Give a password to a name that has none, and let them in if they are waiting |
| /auth admin setpassword <player> <password> | authcore.admin.setpassword | Change the password on somebody else's account |
| /auth admin reset <player> | authcore.admin.reset | Clear somebody's password |
| /auth admin delete <player> | authcore.admin.delete | Erase one account and everything recorded about it |
| /auth admin purge <days> [confirm] | authcore.admin.purge | Erase every account nobody has joined on in that many days, confirm to go through with it |
| /auth admin alts <player> | authcore.admin.alts | Accounts sharing an address |
| /auth admin premium <player> | authcore.admin.premium | Ask whether a name is a paid account |
| /auth admin spawns | authcore.admin.spawns | Open the spawn points screen |
| /auth admin events | authcore.admin.events | Open the event commands screen |
| /auth admin setspawn <spot> [world] [x] [y] [z] | authcore.admin.spawns | Set a spawn point to where you stand, or to a world and coordinates |
| /auth admin clearspawn <spot> | authcore.admin.spawns | Clear a spawn point so nobody is sent there |
| /auth admin spawn <spot> | authcore.admin.spawns | Teleport to a spawn point |
| /auth admin menus | authcore.admin.menus | Edit any menu in game |
| /auth admin settings | authcore.admin.settings | Edit the settings in game |
| /auth admin messages | authcore.admin.settings | Edit any player facing message |
| /auth admin updates | authcore.admin | Say what version this is and whether a newer one is out |
| /auth admin reload | authcore.admin.reload | Reload the configuration |
Permissions
everyone is granted to all players, operator only to ops, and nobody must be granted explicitly by a permissions plugin.
| Node | Default | Description |
|---|---|---|
| authcore.* | operator | Grants every authcore permission |
| authcore.admin | operator | Administration |
| authcore.admin.alts | operator | See which accounts share an address |
| authcore.admin.delete | operator | Erase one account and everything recorded about it |
| authcore.admin.events | operator | Edit the commands that run when somebody joins, logs in or logs out |
| authcore.admin.forcelogin | operator | Log somebody in without their password |
| authcore.admin.forcelogout | operator | Log somebody out |
| authcore.admin.forceregister | operator | Give a password to a name that has none |
| authcore.admin.menus | operator | Edit the menus in game |
| authcore.admin.premium | operator | Ask whether a name is a paid account |
| authcore.admin.purge | operator | Erase every account not seen in a while |
| authcore.admin.reload | operator | Reload the configuration |
| authcore.admin.reset | operator | Clear somebody's password |
| authcore.admin.setpassword | operator | Change the password on somebody else's account |
| authcore.admin.settings | operator | Edit the settings in game |
| authcore.admin.spawns | operator | Set, clear and visit the spawn points players log in around |
| authcore.changepassword | everyone | Change your own password |
| authcore.login | everyone | Log in |
| authcore.logout | everyone | Log yourself out |
| authcore.register | everyone | Register a name |
Placeholders
Requires PlaceholderAPI. AuthCore registers the identifier authcore on start and says so in the log. Without PlaceholderAPI installed nothing here resolves and the plugin still works.
No placeholder ever returns an address. A placeholder ends up in scoreboards, tab lists and chat formats that everybody can read, and who else plays from this house is not something a server should print to the room.
Per player
Each of these needs a player and resolves to nothing when asked without one.
| Placeholder | Notes |
|---|---|
| %authcore_registered% | true when this name has a password set |
| %authcore_logged_in% | true when they are past the lock and playing |
| %authcore_session% | true when a remembered session is open for the name |
| %authcore_addresses% | how many addresses this account has connected from |
| %authcore_alts% | how many other accounts share an address with this one |
| %authcore_last_seen% | when they last logged in, as a millisecond timestamp |
Server wide
These answer with or without a player, which is what makes them usable on a lobby board.
| Placeholder | Notes |
|---|---|
| %authcore_accounts% | how many accounts exist |
| %authcore_registered_count% | how many of them have a password |
| %authcore_pending% | how many players are sitting at the lock right now |
| %authcore_required% | true when the lock is active, false on an online mode server |
| %authcore_hashing% | argon2id or pbkdf2, whichever this server ended up with |
Worth knowing
The last seen key is raw so you can feed it to whatever date formatter your other plugins already use. The account screens format it themselves.
The hashing key is worth putting on an admin board once. If it ever reads pbkdf2 on a server that should have Argon2, the library did not download and the log will say so.
There is deliberately no address, ip or ip hash placeholder. The addresses themselves live in the admin screens behind authcore.admin.alts, and even there they are only ever the truncated hash.