Repository navigation
User Manual v6.1.0
PureAuth is an authentication plugin for Minecraft servers running Paper or Purpur. It provides password and PIN login, registration, sessions, CAPTCHA, 2FA, recovery questions, Premium Auto-Login, administrative tools, backend-switch synchronization, backups, Discord webhooks and optional PlaceholderAPI integration.
This manual covers every PureAuth 6.1.0 module:
- Paper/Purpur backend
- BungeeCord proxy
- Velocity proxy
The Paper/Purpur module performs authentication and provides all player commands and GUI screens. The BungeeCord and Velocity modules synchronize an already authenticated player when they switch backend servers. A proxy jar does not replace the Paper jar.
- Requirements and compatibility
- Files and module selection
- Dependencies
- Installation
- Updating from 6.0.0
- Authentication flow
- PIN authentication
- Player commands
- Two-Factor Authentication
- Account recovery
- Administrative commands
- Permissions
- Paper/Purpur configuration
- BungeeCord configuration
- Velocity configuration
- Network synchronization
- PlaceholderAPI
- Recommended configurations
- Troubleshooting
- Security recommendations
- Quick reference
| Component | PureAuth 6.1.0 requirement |
|---|---|
| Minecraft server line | 26.2 |
| API used by the plugin | Paper API 26.2.build.36-alpha
|
api-version |
26.2 |
| Recommended server software | Paper or Purpur compatible with the 26.2 API line |
| Java bytecode target | Java 25 |
| Effective backend Java requirement | Java 25 for the supported Paper/Purpur 26.2 server line |
server.properties |
online-mode=false |
The backend module uses Paper-specific APIs. Spigot, Bukkit and Folia are not supported targets.
PureAuth checks the backend's online mode. Players are rejected by the fail-safe when the backend runs with online-mode=true, because PureAuth is designed to handle authentication itself.
| Component | PureAuth 6.1.0 requirement |
|---|---|
| Proxy API used to build the module | BungeeCord API 1.21-R0.4
|
| Java bytecode target | Java 21 |
| Recommended network Java | Java 25, matching the backend runtime |
Use a current BungeeCord-compatible proxy that supports the API line above. The Paper/Purpur servers behind it still follow the Paper requirements.
| Component | PureAuth 6.1.0 requirement |
|---|---|
| Proxy API used to build the module | Velocity API 3.5.0-SNAPSHOT
|
| Java bytecode target | Java 21 |
| Recommended network Java | Java 25, matching the backend runtime |
Use a current Velocity 3.5-compatible build. The Paper/Purpur servers behind it still follow the Paper requirements.
For a standalone backend:
online-mode=falseFor a proxy network, the proxy is the public entry point and each backend running PureAuth must use:
online-mode=falseProtect backend ports so players cannot bypass the proxy. Configure BungeeCord or Velocity forwarding according to that proxy's official documentation.
PureAuth 6.1.0 is distributed as three jars:
pureauth-paper-6.1.0-R.jar
pureauth-bungee-6.1.0-R.jar
pureauth-velocity-6.1.0-R.jar
Install only:
pureauth-paper-6.1.0-R.jar
Install:
pureauth-paper-6.1.0-R.jar -> every authenticated Paper/Purpur backend
pureauth-bungee-6.1.0-R.jar -> BungeeCord proxy
Install:
pureauth-paper-6.1.0-R.jar -> every authenticated Paper/Purpur backend
pureauth-velocity-6.1.0-R.jar -> Velocity proxy
Do not install both proxy jars on one proxy. Use the jar matching the proxy software.
PureAuth is standalone for its normal authentication functions. It does not require another Minecraft plugin to start or to provide password, PIN, 2FA, recovery, database or proxy synchronization features.
PlaceholderAPI is optional and is used only for PureAuth placeholders:
%pureauth_logged%
%pureauth_has_2fa%
If PlaceholderAPI is absent, PureAuth continues to work and only the placeholders are unavailable.
The release jars include or load the database, connection-pool and password-hashing libraries required by their module. Server owners do not install these as separate plugins.
- MySQL/MariaDB is required only when
MYSQLis selected. - Mojang's profile API is contacted when a player enables Premium Auto-Login with
/premium. - A Discord webhook is contacted only when Discord integration is enabled.
- Redis fields are reserved for future synchronization and are not an active Redis implementation in 6.1.0.
- Stop the server.
- Put
pureauth-paper-6.1.0-R.jarin the server'spluginsdirectory. - Set
online-mode=falseinserver.properties. - Start the server once to generate
plugins/PureAuth/config.yml. - Stop the server and review the generated configuration.
- Start the server again.
- Confirm that the console reports PureAuth enabled without database errors.
SQLite is the simplest standalone choice:
database:
type: "SQLITE"- Stop the proxy and all backend servers.
- Put
pureauth-bungee-6.1.0-R.jarin the BungeeCordpluginsdirectory. - Put
pureauth-paper-6.1.0-R.jarin thepluginsdirectory of every authenticated Paper/Purpur backend. - Set every backend to
online-mode=false. - Start the proxy and backends once so both modules create their data directories.
- Configure all PureAuth instances to use the same MySQL/MariaDB database and table prefix.
- Keep
network.mode: "LOCAL". - Restart the entire network.
- Authenticate, switch to another backend and verify that authentication is synchronized.
- Stop the proxy and all backend servers.
- Put
pureauth-velocity-6.1.0-R.jarin the Velocitypluginsdirectory. - Put
pureauth-paper-6.1.0-R.jarin thepluginsdirectory of every authenticated Paper/Purpur backend. - Set every backend to
online-mode=false. - Configure Velocity forwarding and secure the backend ports.
- Start the proxy and backends once to generate configuration files.
- Configure all PureAuth instances to use the same MySQL/MariaDB database and table prefix.
- Keep
network.mode: "LOCAL". - Restart the entire network.
- Authenticate, switch to another backend and verify that authentication is synchronized.
SQLite must not be shared between separate servers. Use MySQL/MariaDB for a proxy network.
- Stop every PureAuth server and proxy instance.
- Back up the existing database and all PureAuth configuration files.
- Replace each 6.0.0 jar with the corresponding 6.1.0 jar.
- Do not mix 6.0.0 and 6.1.0 modules on the same network.
- Start the Paper/Purpur backend so PureAuth can add the PIN database fields and new configuration defaults.
- Compare the generated 6.1.0 config with your customized config, especially
settings.pinand the new PIN message keys. - Start the proxy and remaining backends.
- Test password login, PIN setup/login, 2FA, recovery and a backend switch.
PureAuth stores PIN data in additional account columns. Existing password hashes remain intact, so existing accounts continue to use password login until a PIN is set.
- Optional primary PIN authentication through a 54-slot GUI.
- Configurable PIN length, defaulting to six digits.
- Player-head number buttons for digits 0–9.
- Two-entry PIN confirmation during setup.
- PIN login automatically opens when a PIN-enabled player joins.
-
/loginis blocked for PIN-enabled accounts while PIN support is active. -
/changepassopens a PIN change flow for PIN-enabled accounts. -
/rempinrestores password login. - Recovery can remove a forgotten PIN while setting a new password.
- Administrative
setpin,changepinandrempinoperations. -
/paalias for/pureauth. - Configurable PIN GUI items, textures, sounds, status text and notifications.
Join -> registration or /login -> optional 2FA -> authenticated
Join -> PIN GUI -> optional 2FA -> authenticated
PIN is the primary credential for a PIN-enabled account, but it does not replace 2FA. If 2FA is enabled, the player must complete it after the correct PIN.
For an account with an active PIN, PureAuth requires the PIN GUI before Premium Auto-Login or session restoration. This prevents a configured PIN from being bypassed by a session or IP-based Premium mode.
Before authentication, PureAuth blocks normal gameplay actions, including interaction, dropping items, taking damage, breaking/placing blocks and inventory manipulation. Chat is intercepted when it is used by an active 2FA or recovery flow.
Commands are restricted before login. Only the command required by the current authentication or recovery flow is accepted:
-
/registerfor an unregistered account without an active or halted PIN flow -
/loginfor a password account without an active or halted PIN flow -
/recovery ...when recovery is enabled -
/2fa recovery <code>while waiting for 2FA login
Other commands are cancelled.
Wrong PIN login attempts use the same strike and lock mechanism as wrong password attempts:
-
settings.max_attemptscontrols attempts before a kick. -
settings.security.account_lock_enabledenables persistent locking. -
settings.security.kicks_before_lockcontrols how many failed-attempt kicks occur before the account is locked. -
/pureauth unlock <player>unlocks an account.
PIN authentication is new in PureAuth 6.1.0.
The player must first log in normally, then run:
/setpin
The GUI opens and the player:
- Clicks the configured number heads to enter the new PIN.
- Enters the same PIN a second time.
- Receives confirmation after the PIN is securely saved.
By default, a PIN contains exactly six digits. The supported configured length range is 1–9. Invalid configured values safely fall back to six.
When a PIN-enabled player joins, the PIN window opens automatically. The entry is submitted automatically when the required number of digits has been clicked.
Available controls:
- digit heads 0–9
- backspace
- clear
- visual filled/empty input indicators
- a status item showing the current flow stage
The entered digits are not sent as a chat command.
For PIN accounts, this command is blocked while PIN support is enabled:
/login <password>
A logged-in PIN user runs:
/changepass
No arguments are accepted for this PIN flow. The GUI asks for:
- Current PIN.
- New PIN.
- New PIN again for confirmation.
If the server owner changes the configured PIN length, an existing PIN is still verified using its stored length. The replacement PIN uses the current configured length.
A logged-in player runs:
/rempin
The PIN is removed and future logins use the account's existing password again.
Closing the PIN login inventory with Escape or another inventory-closing action stops that login attempt. PureAuth:
- marks the PIN login as halted;
- stops normal login reminders;
- displays a configurable title and chat message;
- blocks
/login,/registerand unrelated commands for the rest of that connection; - tells the player to reconnect;
- offers
/recovery startonly when recovery is enabled and configured for the account.
Closing a setup or change GUI cancels only that PIN operation.
If a player forgets a PIN and has configured recovery:
/recovery start
After answering the recovery question correctly:
/recovery pass <new_password> <new_password>
PureAuth atomically saves the new password and removes the forgotten PIN. Future logins use the new password. If the database operation fails, neither change is applied.
Set:
settings:
pin:
enabled: falseWhen disabled:
- no PIN login GUI is required;
- existing password hashes remain usable;
-
/loginbecomes the normal login method again; -
/setpinand administrative PIN setting/changing are unavailable; -
/rempinand administrative PIN removal can still remove stored PIN data.
All player commands are provided by the Paper/Purpur module.
Registers a new account.
/register <password> <password>
/register <password> <password> <captcha> # when CAPTCHA is enabled
Requirements:
- account is not already registered;
- both passwords match;
- password meets
settings.min_password_length; - IP account limit is not exceeded;
- CAPTCHA matches when enabled.
Logs into a password account.
/login <password>
This command is blocked for a PIN-enabled account while settings.pin.enabled is true.
For a password account:
/changepass <old_password> <new_password> <new_password>
For a PIN-enabled account:
/changepass
The PIN form requires the current PIN and the new PIN twice.
/setpin
Enables PIN authentication through the GUI. The player must be logged in and must not already have a PIN.
/rempin
Removes the player's PIN and restores password login. The player must be logged in.
/premium
Checks the player's name through Mojang's profile API and enables IP-trust Premium Auto-Login. The player must be logged in and settings.premium_login.enabled must be enabled.
The API connection and read timeouts are five seconds. Premium mode is not Mojang session authentication and does not require ProtocolLib.
/cracked
Disables Premium Auto-Login for the logged-in player.
/2fa setup
/2fa remove
/2fa recovery <backup_code>
See Two-Factor Authentication.
/recovery setup
/recovery remove
/recovery start
/recovery pass <new_password> <new_password>
See Account recovery.
Player commands do not require explicit permission nodes.
/2fa setup
- PureAuth generates a secret key.
- The player adds it to a compatible authenticator application.
- The player enters the current six-digit code in chat.
- PureAuth enables 2FA and generates backup codes.
The player must already be logged in and must not already have 2FA enabled.
For a password account:
password -> 2FA -> complete login
For a PIN account:
PIN GUI -> 2FA -> complete login
The PIN system does not disable, replace or bypass 2FA.
/2fa remove
The player enters a valid authenticator code in chat to confirm removal.
/2fa recovery <backup_code>
This works when the player is logged in or is currently waiting for 2FA during login. A successful recovery disables 2FA and invalidates the previous backup-code set.
When enabled, accounts with this permission must configure 2FA:
pureauth.admin.guard
Configuration:
settings:
admin_guard:
enabled: trueIf an affected administrator removes 2FA, Admin Guard requires setup again on the next login.
Recovery must be enabled in the Paper config:
settings:
recovery:
enabled: true/recovery setup
The logged-in player chooses a configured question and enters an answer. The answer is hashed before storage.
/recovery remove
The player must be logged in and have recovery configured.
/recovery start
The unauthenticated player answers the configured question in chat. After successful verification:
/recovery pass <new_password> <new_password>
The recovery session expires, so the password command must be used within the active verified flow.
For an account using a PIN, successful password recovery also removes the forgotten PIN and restores password login.
Recovery question order matters. Accounts store the question ID. Reordering existing questions can make an older account display a different question.
The administrative command and its alias are:
/pureauth
/pa
The alias supports all the same subcommands, for example /pa reload.
| Command | Description | Permission | Safe mode |
|---|---|---|---|
/pureauth |
Shows plugin name and version | none | no |
/pureauth reload |
Reloads config, backup scheduling and PIN GUI items | pureauth.admin.reload |
no |
/pureauth stats |
Shows user/config statistics; console only | pureauth.admin.stats |
no |
/pureauth info <player> |
Shows stored account information | pureauth.admin.info |
no |
/pureauth accounts <IP> |
Lists accounts registered from an IP | pureauth.admin.accounts |
no |
/pureauth location <login|register> |
Saves current player location as auth spawn | pureauth.admin.location |
no |
| Command | Description | Permission | Safe mode |
|---|---|---|---|
/pureauth unlock <player> |
Unlocks an account | pureauth.admin.unlock |
yes |
/pureauth unregister <player> |
Deletes the registered account | pureauth.admin.unregister |
yes |
/pureauth register <player> <password> |
Registers an account manually | pureauth.admin.register |
yes |
/pureauth forcelogin <player> |
Completes login for an online player | pureauth.admin.forcelogin |
yes |
/pureauth setpassword <player> <new_password> |
Replaces the stored password | pureauth.admin.setpassword |
yes |
/pureauth setpin <player> <pin> |
Enables PIN for an account that has none | pureauth.admin.pin |
yes |
/pureauth changepin <player> <pin> |
Replaces an existing PIN | pureauth.admin.pin |
yes |
/pureauth rempin <player> |
Removes an existing PIN | pureauth.admin.pin |
yes |
When settings.safe_mode: true, sensitive commands can be run only from the console.
Administrative PIN values must contain exactly the configured number of digits. setpin refuses an account that already has a PIN; use changepin. changepin and rempin require an existing PIN.
If an administrator changes PIN state for an online player:
- an authenticated player receives a notice that the change applies on the next login;
- an unauthenticated player is disconnected and told to rejoin safely.
Passwords and PINs are redacted from PureAuth's administrative command audit log.
pureauth.admin
pureauth.admin.reload
pureauth.admin.stats
pureauth.admin.unlock
pureauth.admin.unregister
pureauth.admin.register
pureauth.admin.forcelogin
pureauth.admin.info
pureauth.admin.setpassword
pureauth.admin.accounts
pureauth.admin.location
pureauth.admin.pin
pureauth.admin.guard
pureauth.admin is declared as the general administrator permission, but command handling checks the specific sub-permission for each operation. Assign the specific nodes or configure parent/child inheritance in your permissions plugin.
pureauth.admin.guard is different from command access. It marks an account as requiring 2FA when Admin Guard is enabled, and defaults to false.
File:
plugins/PureAuth/config.yml
database:
type: "SQLITE" # SQLITE or MYSQL
pool:
maximum_pool_size: -1
minimum_idle: -1
connection_timeout_ms: 10000
idle_timeout_ms: 600000
max_lifetime_ms: 1800000
mysql:
host: "localhost"
port: 3306
database: "minecraft"
username: "root"
password: "password"
table_prefix: "pureauth_"-
SQLITEstores data locally inplugins/PureAuth/database.db. -
MYSQLuses MySQL/MariaDB and is recommended for production networks. - Default pool sizing with
-1: SQLite uses one connection; MySQL uses up to 16 with up to four idle. - Keep SQLite's maximum pool size at one.
-
connection_timeout_msis how long a task waits for a connection. -
idle_timeout_msretires unused connections. -
max_lifetime_msprevents stale long-lived connections. -
table_prefixmay contain letters, numbers and underscores.
Use a dedicated database user instead of MySQL root in production.
performance:
async:
database_threads: 8
crypto_threads: 4
network_threads: 4
queue_size: 512Database, BCrypt and external-network work runs through bounded worker queues to avoid blocking the main server thread.
-
database_threads: account/database operations. -
crypto_threads: password, PIN, answer and backup-code hashing/checking. -
network_threads: Mojang API and other network work. -
queue_size: upper bound for queued tasks per worker group.
Do not configure many more database workers than the database pool can serve. Do not make crypto_threads excessively high; BCrypt is intentionally CPU-intensive.
network:
mode: "LOCAL"
redis:
host: "localhost"
port: 6379
password: ""
database: 0
channel: "pureauth:network"Use LOCAL in PureAuth 6.1.0. REDIS and its connection fields are reserved for future multi-proxy shared state and do not provide complete Redis synchronization in this release.
settings:
safe_mode: false
language: "EN"
blindness_effect: true-
safe_mode: makes sensitive admin commands console-only. -
language:ENorPL. -
blindness_effect: adds blindness while the player is in unauthenticated ghost mode.
settings:
pin:
enabled: true
length: 6
gui:
title: "6DAF4&lPureAuth &8| &dPIN"
digit_material: "PLAYER_HEAD"
filler:
material: "GRAY_STAINED_GLASS_PANE"
name: " "
input:
filled:
material: "LIME_STAINED_GLASS_PANE"
name: "&a&l●"
empty:
material: "BLACK_STAINED_GLASS_PANE"
name: "&8○"
status_material: "NETHER_STAR"status:
login: "&b&lENTER PIN"
setup_new: "&a&lSET A NEW PIN"
setup_confirm: "&e&lCONFIRM YOUR PIN"
change_current: "&6&lENTER CURRENT PIN"
change_new: "&a&lENTER NEW PIN"
change_confirm: "&e&lCONFIRM NEW PIN"
complete: "&a&lCOMPLETE"
status_lore:
- "&7Click the number heads below."
- "&7The entry submits automatically."controls:
backspace:
material: "ARROW"
name: "&e&lBACKSPACE"
lore: ["&7Remove the last digit."]
texture: ""
clear:
material: "BARRIER"
name: "&c&lCLEAR"
lore: ["&7Clear all entered digits."]
texture: ""Each digit from "0" through "9" accepts its own Base64 texture, display name and lore:
digits:
"0":
texture: "<Base64 texture value>"
name: "&b&l0"
lore: ["&7Click to enter 0."]The default config already contains textures for all ten number heads. If a material or texture is invalid, PureAuth uses safe item fallbacks rather than crashing the plugin.
sounds:
enabled: true
open: "minecraft:block.ender_chest.open"
click: "minecraft:ui.button.click"
step: "minecraft:block.note_block.pling"
success: "minecraft:entity.player.levelup"
error: "minecraft:entity.villager.no"Use namespaced sound keys supported by the installed Paper/Purpur version. Set enabled: false to disable all PIN GUI sounds.
Run /pureauth reload after editing GUI options. Reload rebuilds cached PIN GUI items for future windows.
settings:
premium_login:
enabled: true
require_same_ip: trueKeeping require_same_ip: true is safer. A PIN-enabled account still requires its PIN before this feature can complete authentication.
settings:
backup:
enabled: true
interval_hours: 24
max_backups: 10PureAuth backs up the SQLite database or exports MySQL data according to the selected database mode. Older files beyond max_backups are removed.
settings:
recovery:
enabled: true
questions:
- "What is your mother's maiden name?"
- "What was the name of your first pet?"
- "What is your favorite color?"Questions may be translated, but avoid changing their order after players have configured recovery.
settings:
discord:
enabled: false
webhook_url: "YOUR_WEBHOOK_HERE"
events:
server_lifecycle: true
user_login: false
user_register: true
user_changepass: true
user_premium_toggle: true
failed_attempts: true
account_locked: true
admin_usage: true
admin_sensitive: truePIN updates use the change-password event category for player activity and the sensitive-admin category for administrative PIN changes.
settings:
security:
account_lock_enabled: true
kicks_before_lock: 3
captcha:
enabled: true
length: 5
characters: "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
login_timeout: 60
max_attempts: 3
min_password_length: 4
max_accounts_per_ip: 3-
login_timeout: seconds available for registration/login. -
max_attempts: wrong password or PIN attempts before kick. -
kicks_before_lock: failed-attempt kicks before persistent account locking. -
min_password_length: minimum registration/change/recovery password length. -
max_accounts_per_ip: registration limit per IP.
settings:
sessions:
enabled: true
time_minutes: 1Sessions allow a recent password account to reconnect without entering the password. Active PIN accounts require the PIN GUI and do not bypass it through a stored session.
settings:
admin_guard:
enabled: true
update_checker: true
message_interval: 10message_interval is the number of seconds between login/register reminder messages.
settings:
locations:
spawn_login: ""
spawn_register: ""Set locations in game instead of editing the serialized values:
/pureauth location login
/pureauth location register
Messages are stored under:
messages:
en:
...
pl:
...Select a section with:
settings:
language: "EN" # EN or PLAll PIN notifications, halted-login titles and recovery hints are configurable. PIN-specific keys include:
pin_login_open
pin_login_reminder
pin_setup_open
pin_change_open
pin_confirm_prompt
pin_mismatch
pin_current_success
pin_current_wrong
pin_login_success
pin_saved
pin_removed
pin_not_set
pin_already_set
pin_disabled
pin_invalid
pin_database_error
pin_gui_cancelled
pin_command_no_args
pin_login_command_blocked
pin_changepass_gui_only
pin_admin_changed_notice
pin_admin_rejoin
pin_halted_title
pin_halted_subtitle
pin_halted_subtitle_recovery
pin_halted_chat
pin_halted_chat_recovery
recovery_pin_removed
admin_pin_set
admin_pin_changed
admin_pin_removed
admin_pin_already_set
admin_pin_not_set
admin_usage_setpin
admin_usage_changepin
admin_usage_rempin
Useful placeholders inside messages include %length%, %player%, %attempts%, %max%, %time%, %code%, %question%, %current% and %new%, depending on the key.
File:
plugins/PureAuth/config.yml
Default structure:
database:
type: MYSQL
pool:
maximum_pool_size: 16
minimum_idle: 4
connection_timeout_ms: 10000
idle_timeout_ms: 600000
max_lifetime_ms: 1800000
mysql:
host: "localhost"
port: 3306
database: "pureauth"
username: "root"
password: ""
table_prefix: "pureauth_"
settings:
language: "EN"
network:
mode: "LOCAL"
redis:
host: "localhost"
port: 6379
password: ""
database: 0
channel: "pureauth:network"Use the same MySQL database credentials and table_prefix as the Paper backends. Keep LOCAL in 6.1.0.
The BungeeCord module registers the pureauth:sync plugin-message channel, remembers authenticated UUIDs while connected, forwards authentication success on a backend switch and removes session state when the player disconnects.
It does not display the PIN GUI and does not register /login, /setpin or the other Paper commands.
File:
plugins/pureauth/config.yml
Default structure:
database:
driver: "MYSQL"
pool:
maximum_pool_size: 16
minimum_idle: 4
connection_timeout_ms: 10000
idle_timeout_ms: 600000
max_lifetime_ms: 1800000
host: "localhost"
port: "3306"
database: "pureauth"
username: "root"
password: ""
prefix: "pureauth_"
network:
mode: "LOCAL"
redis:
host: "localhost"
port: 6379
password: ""
database: 0
channel: "pureauth:network"Velocity uses database.driver and database.prefix, while the Paper and Bungee configs use database.type and database.mysql.table_prefix. Point every module at the same database and equivalent prefix.
The Velocity module registers pureauth:sync, remembers authenticated UUIDs while connected, sends authentication success after a backend switch and clears session state on disconnect.
It does not display the PIN GUI and does not register /login, /setpin or the other Paper commands.
The Paper module sends this internal event to the proxy after authentication:
PLAYER_LOGIN:<uuid>
When the same player switches backend, the proxy sends:
AUTH_SUCCESS:<uuid>
The receiving Paper backend completes the synchronized authentication flow.
- matching PureAuth 6.1.0 modules;
- Paper module on every protected backend;
- exactly one appropriate proxy module;
- the
pureauth:syncplugin-message channel must not be blocked; - shared UUID identity through correct proxy forwarding;
- shared MySQL/MariaDB account storage and matching table prefix;
- backend ports protected from direct connections.
Authenticated UUIDs are held in the proxy module's memory for the active connection. They are removed on disconnect. LOCAL is appropriate for one proxy instance. Complete multi-proxy Redis session state is not implemented in 6.1.0.
PlaceholderAPI is a soft dependency of the Paper module.
Returns:
true
false
Shows whether the player is currently authenticated on that Paper server.
Returns:
true
false
Shows the cached 2FA-enabled state. The cache avoids a database query during every placeholder request.
database:
type: "SQLITE"
pool:
maximum_pool_size: 1
minimum_idle: 1
performance:
async:
database_threads: 2
crypto_threads: 2
network_threads: 2
queue_size: 128
network:
mode: "LOCAL"
settings:
pin:
enabled: true
length: 6database:
type: "MYSQL"
pool:
maximum_pool_size: 16
minimum_idle: 4
performance:
async:
database_threads: 4
crypto_threads: 4
network_threads: 4
queue_size: 256
network:
mode: "LOCAL"Paper backends:
database:
type: "MYSQL"
pool:
maximum_pool_size: 16
minimum_idle: 4
connection_timeout_ms: 10000
idle_timeout_ms: 600000
max_lifetime_ms: 1800000
performance:
async:
database_threads: 8
crypto_threads: 4
network_threads: 4
queue_size: 512
network:
mode: "LOCAL"Configure the matching proxy module with the same MySQL server, database and table prefix.
Tune pools only after measuring load. Setting very large pool, thread or queue values can increase database and CPU pressure instead of improving login performance.
Set on every Paper/Purpur backend:
online-mode=falseThen restart the backend. Do not expose its port publicly.
Check:
settings:
pin:
enabled: trueConfirm the account actually has a PIN and the Paper module is 6.1.0. The proxy module alone cannot open a GUI.
This is expected for an account with a PIN while PIN support is enabled. Use the automatically opened PIN GUI. If it was closed during login, reconnect. If configured for that account, use /recovery start.
Existing PINs store their own length and should continue to use that length. New or changed PINs use the currently configured length. Administrative commands must use the current configured length.
The login was deliberately halted for that connection. Reconnect. Recovery remains available only if it is enabled and the account has configured a question.
This is intended. Recovery sets a new password and removes the forgotten PIN so the account cannot remain locked behind an unknown primary credential.
This is intended. PIN is the primary credential; 2FA is the second factor.
CAPTCHA may be enabled. Use:
/register <password> <password> <captcha>
Do not share SQLite across proxy/backends. Configure MySQL/MariaDB on all modules.
Check all of the following:
- correct BungeeCord or Velocity jar is running on the proxy;
- Paper 6.1.0 runs on both source and destination backend;
- plugin-message forwarding is working;
- UUID forwarding is consistent;
- player did not disconnect from the proxy between switches;
- database credentials and table prefix match.
Velocity's keys differ from Paper/Bungee. Use driver, flat host/port fields and prefix exactly as shown in the Velocity section.
Check settings.premium_login.enabled, the saved IP requirement and access to Mojang's profile API. PIN-enabled accounts intentionally require their PIN first.
Install a compatible PlaceholderAPI build on the Paper/Purpur backend. PureAuth itself does not require it for authentication.
Assign the exact sub-permission. pureauth.admin alone is not automatically treated by command code as every specific permission unless your permissions system provides inheritance.
Use valid Paper material names, valid Base64 head textures and namespaced sound keys. Run /pureauth reload. PureAuth uses safe GUI item fallbacks for invalid material/texture configuration.
Check host, port, credentials, database name, table prefix, firewall and pool timeout. PureAuth reports save failure instead of treating an unsuccessful PIN/recovery write as successful.
- Keep Paper/Purpur backends in
online-mode=false, but firewall them so only the proxy can connect. - Use a dedicated MySQL/MariaDB user with access only to the PureAuth database.
- Use strong player passwords even if PIN login is enabled; the password is the safe fallback when PIN is disabled or removed.
- Keep the default six-digit PIN or increase it within the supported 1–9 range when appropriate.
- Enable 2FA for administrators and assign
pureauth.admin.guardto staff accounts. - Enable safe mode so sensitive administrative changes are console-only.
- Keep account locking and failed-attempt limits enabled.
- Encourage players to configure recovery before they need it.
- Keep recovery answers private and difficult to guess.
- Save 2FA backup codes outside Minecraft.
- Keep Premium Auto-Login's same-IP requirement enabled.
- Never publish database passwords, webhook URLs or complete config files containing secrets.
- Back up the database before updates and test restoration periodically.
/register <password> <password> [captcha]
/login <password>
/changepass <old> <new> <new> # password account
/changepass # PIN account
/setpin
/rempin
/premium
/cracked
/2fa setup
/2fa remove
/2fa recovery <code>
/recovery setup
/recovery remove
/recovery start
/recovery pass <new> <new>
/pureauth
/pa
/pureauth reload
/pureauth stats
/pureauth unlock <player>
/pureauth unregister <player>
/pureauth register <player> <password>
/pureauth forcelogin <player>
/pureauth info <player>
/pureauth setpassword <player> <new_password>
/pureauth setpin <player> <pin>
/pureauth changepin <player> <pin>
/pureauth rempin <player>
/pureauth accounts <IP>
/pureauth location <login|register>
Standalone: Paper jar on Paper/Purpur
Bungee: Paper jar on every backend + Bungee jar on proxy
Velocity: Paper jar on every backend + Velocity jar on proxy
Backend online-mode=false
Protected backend ports
Shared MySQL for networks
network.mode=LOCAL
Matching PureAuth 6.1.0 modules
PureAuth 6.1.0 is developed by SzymeX Dev Studio.