Repository navigation
User Manual v6.0.0
# PureAuth 6.0.0 - User Manual
PureAuth is an advanced authentication plugin for Minecraft servers running on Paper/Purpur.
It provides registration, login, sessions, CAPTCHA, 2FA, recovery questions, Premium Auto-Login, admin tools, proxy sync, backups, Discord webhooks and PlaceholderAPI support.
---
## 1. Requirements
### Server software
PureAuth Paper module requires:
- Paper-compatible server
- Recommended: Paper or Purpur
- Not supported:
- Spigot
- Bukkit
- Folia
Why not Spigot?
PureAuth uses Paper-specific API, including Paper chat events. Because of that, the backend jar is named:
```text
pureauth-paper-6.0.0.jarPureAuth 6.0.0 requires:
Java 25
The plugin is compiled for Java 21 but it requires Java 25 to be installed!
PureAuth Paper uses:
api-version: '26.2'Use a Paper/Purpur version compatible with this API line.
Your backend Paper server must have:
online-mode=falsePureAuth has a fail-safe check. If online-mode=true, the plugin will disable itself.
This is required because PureAuth handles authentication itself.
PureAuth 6.0.0 produces three main jars:
pureauth-paper-6.0.0.jar
pureauth-bungee-6.0.0.jar
pureauth-velocity-6.0.0.jar
Use only:
pureauth-paper-6.0.0.jar
Use:
pureauth-paper-6.0.0.jar
pureauth-bungee-6.0.0.jar
Put pureauth-paper on backend Paper servers.
Put pureauth-bungee on the BungeeCord proxy.
Use:
pureauth-paper-6.0.0.jar
pureauth-velocity-6.0.0.jar
Put pureauth-paper on backend Paper servers.
Put pureauth-velocity on the Velocity proxy.
- Stop your server.
- Put
pureauth-paper-6.0.0.jarinto thepluginsfolder. - Make sure
server.propertiescontains:
online-mode=false- Start the server.
- Edit the generated config.
- Restart the server after changing important database settings.
For a small standalone server:
database:
type: "SQLITE"For a larger server or network:
database:
type: "MYSQL"For networks, MySQL/MariaDB is strongly recommended.
PureAuth includes:
- Player registration
- Player login
- Password changing
- CAPTCHA
- Login timeout
- Maximum login attempts
- Account locking
- Sessions
- Premium Auto-Login
- Cracked mode toggle
- Two-Factor Authentication
- 2FA backup codes
- Recovery questions
- Admin Guard
- Ghost mode before login
- Login/register spawn locations
- Discord webhooks
- Automatic backups
- PlaceholderAPI support
- BungeeCord and Velocity sync
- SQLite and MySQL/MariaDB support
Registers a new account.
Usage without CAPTCHA:
/register <password> <password>
Usage with CAPTCHA enabled:
/register <password> <password> <captcha>
Example:
/register mySecret123 mySecret123 A8K2P
Requirements:
- Player must not already be logged in.
- Player must not already be registered.
- Passwords must match.
- Password must meet
settings.min_password_length. - IP must not exceed
settings.max_accounts_per_ip. - If CAPTCHA is enabled, the correct CAPTCHA code must be provided.
Permission:
None
Logs into an existing account.
Usage:
/login <password>
Example:
/login mySecret123
Requirements:
- Player must be registered.
- Account must not be locked.
- Password must be correct.
- If 2FA is enabled, the player must also complete 2FA.
Permission:
None
Changes the player's password.
Usage:
/changepass <old_password> <new_password> <new_password>
Example:
/changepass oldPass123 newPass456 newPass456
Requirements:
- Player must be logged in.
- Old password must be correct.
- New passwords must match.
- New password must meet minimum length.
Permission:
None
Enables Premium Auto-Login for the player.
Usage:
/premium
What it does:
- Checks the player's Minecraft username using Mojang API.
- If the name belongs to a premium account, Premium mode is enabled.
- Future logins can be automatic if the IP matches, depending on config.
Requirements:
- Player must be logged in.
-
settings.premium_login.enabledmust betrue.
Permission:
None
Important:
Premium Auto-Login in PureAuth is IP-trust based. It does not replace Mojang authentication and does not require ProtocolLib.
Disables Premium Auto-Login for the player.
Usage:
/cracked
Requirements:
- Player must be logged in.
- Player must currently have Premium mode enabled.
Permission:
None
Main command:
/2fa <setup|remove|recovery>
Starts 2FA setup.
Usage:
/2fa setup
What happens:
- PureAuth generates a secret key.
- Player adds the key to an authenticator app.
- Player types the 6-digit code in chat.
- If the code is correct, 2FA is enabled.
- Backup codes are generated.
Requirements:
- Player must be logged in.
- Player must not already have 2FA enabled.
Permission:
None
Starts 2FA removal.
Usage:
/2fa remove
What happens:
- Player is asked to enter a 2FA code in chat.
- If the code is correct, 2FA is disabled.
Requirements:
- Player must be logged in.
- Player must have 2FA enabled.
Permission:
None
Uses a 2FA backup code to disable 2FA.
Usage:
/2fa recovery <backup_code>
Example:
/2fa recovery A1B2C3D4
Requirements:
- Player must be logged in or currently waiting for 2FA during login.
- Backup code must be valid.
Permission:
None
Important:
After successful recovery, previous backup codes become invalid.
Main command:
/recovery <setup|remove|start|pass>
Recovery system must be enabled:
settings:
recovery:
enabled: trueSets up a recovery question.
Usage:
/recovery setup
What happens:
- Player selects one of the configured questions.
- Player types an answer.
- Answer is hashed and saved.
Requirements:
- Player must be logged in.
- Recovery must not already be configured.
Permission:
None
Removes recovery questions from the account.
Usage:
/recovery remove
Requirements:
- Player must be logged in.
- Recovery must already be configured.
Permission:
None
Starts account recovery.
Usage:
/recovery start
What happens:
- Player is asked their configured recovery question.
- Player types the answer in chat.
- If correct, they can set a new password using
/recovery pass.
Requirements:
- Player must not be logged in.
- Recovery must be configured.
Permission:
None
Sets a new password after successful recovery verification.
Usage:
/recovery pass <new_password> <new_password>
Example:
/recovery pass newPass123 newPass123
Requirements:
- Player must have completed
/recovery start. - Recovery answer must be verified.
- Passwords must match.
- Password must meet minimum length.
Permission:
None
Main admin command:
/pureauth
Running /pureauth with no arguments displays basic plugin information.
Important:
Although pureauth.admin exists, the current command checks specific permissions for each subcommand.
If you use a permissions plugin, give admins the specific permissions listed below or configure inheritance yourself.
Reloads the config and restarts the backup task.
Usage:
/pureauth reload
Permission:
pureauth.admin.reload
Shows plugin statistics.
Usage:
/pureauth stats
Permission:
pureauth.admin.stats
Important:
This command is console-only.
Unlocks a locked account.
Usage:
/pureauth unlock <player>
Example:
/pureauth unlock Steve
Permission:
pureauth.admin.unlock
Affected by safe mode:
settings:
safe_mode: trueIf safe mode is enabled, this command can only be used from console.
Deletes a player's registered account.
Usage:
/pureauth unregister <player>
Example:
/pureauth unregister Steve
Permission:
pureauth.admin.unregister
Affected by safe mode:
settings:
safe_mode: trueIf safe mode is enabled, this command can only be used from console.
Manually registers an account for a player.
Usage:
/pureauth register <player> <password>
Example:
/pureauth register Steve strongPassword123
Permission:
pureauth.admin.register
Affected by safe mode:
settings:
safe_mode: trueIf safe mode is enabled, this command can only be used from console.
Forcefully logs in an online player.
Usage:
/pureauth forcelogin <player>
Example:
/pureauth forcelogin Steve
Permission:
pureauth.admin.forcelogin
Affected by safe mode:
settings:
safe_mode: trueIf safe mode is enabled, this command can only be used from console.
Shows account information for a player.
Usage:
/pureauth info <player>
Example:
/pureauth info Steve
Permission:
pureauth.admin.info
Shows information such as:
- UUID
- IP
- Last login
- Registration date
- Premium mode
- Locked status
- Recovery status
- 2FA status
Sets a new password for a player.
Usage:
/pureauth setpassword <player> <new_password>
Example:
/pureauth setpassword Steve newPassword123
Permission:
pureauth.admin.setpassword
Affected by safe mode:
settings:
safe_mode: trueIf safe mode is enabled, this command can only be used from console.
Shows accounts registered from an IP address.
Usage:
/pureauth accounts <IP>
Example:
/pureauth accounts 127.0.0.1
Permission:
pureauth.admin.accounts
Sets login or register spawn location.
Usage:
/pureauth location <login|register>
Examples:
/pureauth location login
/pureauth location register
Permission:
pureauth.admin.location
Requirements:
- Sender must be a player.
- Player's current location is saved.
pureauth.admin
Description:
General admin permission defined in plugin.yml.
Important:
Current command logic checks specific sub-permissions.
Recommended: assign the permissions below directly.
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.guard
Default:
false
What it does:
Players with this permission are forced to enable 2FA if Admin Guard is enabled.
Config:
settings:
admin_guard:
enabled: trueIf a player with pureauth.admin.guard logs in without 2FA, PureAuth will force them into 2FA setup.
PureAuth supports PlaceholderAPI if PlaceholderAPI is installed.
Soft dependency:
softdepend: [PlaceholderAPI]Available placeholders:
Returns:
true
false
Description:
Shows whether the player is currently logged in.
Returns:
true
false
Description:
Shows whether the player has 2FA enabled according to PureAuth cache.
Important:
This placeholder uses cached data for performance. It is designed to avoid direct database queries from PlaceholderAPI calls.
Main config file:
plugins/PureAuth/config.yml
database:
type: "SQLITE" # Options: SQLITE, 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_"This section controls where PureAuth stores accounts, passwords, 2FA data, sessions data, recovery data and account information.
type: "SQLITE"Available options:
SQLITE
MYSQL
Uses a local database file:
plugins/PureAuth/database.db
Good for:
- small servers
- testing
- simple standalone setups
Not recommended for:
- large networks
- multiple backend servers
- multiple proxy instances
Uses MySQL or MariaDB.
Recommended for:
- production servers
- networks
- many players
- multiple backend servers
- BungeeCord/Velocity setups
The pool controls how many database connections PureAuth can keep open and reuse.
A connection pool is like a queue of ready database connections.
Instead of opening a new database connection every time a player logs in, PureAuth reuses existing ones.
This improves performance, especially when many players log in at once.
maximum_pool_size: -1Controls the maximum number of database connections.
-1 means:
Use PureAuth default
PureAuth defaults:
SQLite: 1
MySQL/MariaDB: 16
Recommended values:
maximum_pool_size: 1SQLite works best with one database writer.
Do not set this high for SQLite.
maximum_pool_size: 8maximum_pool_size: 16maximum_pool_size: 16-32Do not randomly set this to 100.
More connections are not always better. Too many connections can overload MySQL.
minimum_idle: -1Controls how many database connections should stay ready even when the server is calm.
-1 means:
Use PureAuth default
PureAuth default:
SQLite: 1
MySQL/MariaDB: up to 4
Recommended values:
minimum_idle: 1minimum_idle: 4For very large networks:
minimum_idle: 8connection_timeout_ms: 10000How long PureAuth waits for a database connection before failing.
Value is in milliseconds.
10000 ms = 10 seconds
Recommended:
connection_timeout_ms: 10000If your database is remote or sometimes slow:
connection_timeout_ms: 15000If this timeout is reached, it usually means:
- database is offline,
- database is overloaded,
- pool is too small,
- network connection to database is slow,
- too many login operations are happening at once.
idle_timeout_ms: 600000How long an unused database connection can stay open before the pool closes it.
Value is in milliseconds.
600000 ms = 10 minutes
Recommended:
idle_timeout_ms: 600000Usually you do not need to change this.
max_lifetime_ms: 1800000Maximum lifetime of a database connection.
Value is in milliseconds.
1800000 ms = 30 minutes
Recommended:
max_lifetime_ms: 1800000This helps prevent old/stale MySQL connections from staying open forever.
This section is used only when:
database:
type: "MYSQL"host: "localhost"Database host.
Examples:
host: "localhost"
host: "127.0.0.1"
host: "mysql.example.com"port: 3306MySQL/MariaDB port.
Default:
3306
database: "minecraft"Name of the MySQL/MariaDB database.
Example:
database: "pureauth"username: "root"Database username.
Recommended:
Do not use root in production.
Create a separate database user for PureAuth.
password: "password"Database password.
Use a strong password.
table_prefix: "pureauth_"Prefix added before PureAuth table names.
Default table:
pureauth_users
Useful when multiple plugins or multiple PureAuth instances share one database.
Allowed characters:
letters, numbers, underscores
Example:
table_prefix: "lobby_auth_"performance:
async:
database_threads: 8
crypto_threads: 4
network_threads: 4
queue_size: 512This section controls PureAuth internal async workers.
PureAuth does heavy operations outside the main server thread, for example:
- database reads/writes,
- BCrypt password hashing,
- Mojang API checks,
- network-related tasks.
This helps avoid lag when many players log in at the same time.
database_threads: 8How many worker threads can process database tasks.
Examples of database tasks:
- checking if player is registered,
- loading account snapshot,
- updating login IP,
- saving 2FA status,
- saving recovery data,
- saving logout location.
Recommended:
database_threads: 2database_threads: 4database_threads: 8Important:
This should make sense with your database pool.
Example:
database_threads: 8
database:
pool:
maximum_pool_size: 16That is reasonable.
Bad example:
database_threads: 32
database:
pool:
maximum_pool_size: 4That creates too many database tasks waiting for too few connections.
crypto_threads: 4How many worker threads can process password hashing/checking.
PureAuth uses BCrypt, which is intentionally CPU-heavy.
This is good for security, but it must be controlled.
Used for:
- checking
/loginpassword, - hashing
/registerpassword, - changing passwords,
- recovery answers,
- backup codes.
Recommended:
crypto_threads: 2crypto_threads: 4crypto_threads: 4-8Do not set this too high.
If your CPU has 6 cores and you set this to 32, login attempts can overload your CPU.
network_threads: 4How many worker threads can process network/API tasks.
Used mainly for:
- Premium Auto-Login Mojang API checks,
- external network operations.
Recommended:
network_threads: 2-4For most servers, 4 is enough.
queue_size: 512Maximum number of queued async tasks per worker group.
This prevents unlimited task creation.
Example:
If 200 players all type /login at once, PureAuth will queue work instead of spawning unlimited threads.
Recommended:
queue_size: 128queue_size: 256queue_size: 512Very large networks can use:
queue_size: 1024Do not set this absurdly high unless you know why.
A giant queue can hide overload instead of solving it.
network:
mode: "LOCAL"
redis:
host: "localhost"
port: 6379
password: ""
database: 0
channel: "pureauth:network"This section is for network/proxy behavior.
mode: "LOCAL"Available values:
LOCAL
REDIS
Default mode.
Use this when:
- you have one standalone Paper server,
- or one proxy instance,
- or one normal backend network path.
In LOCAL mode, PureAuth uses normal plugin messaging and local memory/session state.
This is the currently active production mode.
Reserved for future multi-proxy shared session state.
Important:
In PureAuth 6.0.0, Redis config exists, but Redis sync is not fully implemented yet.
That means:
Do not enable REDIS expecting full multi-proxy Redis synchronization yet.
For now, keep:
mode: "LOCAL"unless Redis support is finished in a future release.
This section prepares connection details for Redis.
Current status:
Prepared in config, not fully active yet.
host: "localhost"Redis server host.
Example:
host: "127.0.0.1"port: 6379Default Redis port.
password: ""Redis password.
Empty means no password.
Example:
password: "myStrongRedisPassword"database: 0Redis database index.
Default:
0
channel: "pureauth:network"Redis pub/sub channel name planned for PureAuth network messages.
Recommended to leave unchanged.
settings:
safe_mode: false
language: "EN"
blindness_effect: truesafe_mode: falseIf enabled, sensitive admin commands can only be used from console.
Affected commands:
/pureauth unlock
/pureauth unregister
/pureauth register
/pureauth forcelogin
/pureauth setpassword
Recommended for public production servers:
safe_mode: trueThis protects against compromised admin accounts.
language: "EN"Available:
EN
PL
Example:
language: "PL"blindness_effect: trueIf enabled, unauthenticated players get blindness effect during ghost mode.
Ghost mode is used before login/register to prevent players from interacting normally before authentication.
premium_login:
enabled: true
require_same_ip: trueenabled: trueEnables /premium.
If disabled, players cannot enable Premium Auto-Login.
require_same_ip: trueIf enabled, Premium Auto-Login only works when the player's IP matches the last saved IP.
Recommended:
require_same_ip: trueThis is safer.
If disabled:
require_same_ip: falsePremium players may auto-login even if their IP changes.
backup:
enabled: true
interval_hours: 24
max_backups: 10Enables automatic backups.
enabled: trueHow often backups are created.
interval_hours: 24This means once every 24 hours.
Maximum number of backup files to keep.
max_backups: 10Older backups are removed automatically.
recovery:
enabled: true
questions:
- "What is your mother's maiden name?"
- "What was the name of your first pet?"Enables or disables /recovery.
enabled: trueList of available recovery questions.
Players choose one question during /recovery setup.
You can translate or customize them.
Example:
questions:
- "Jak miał na imię twój pierwszy zwierzak?"
- "W jakim mieście się urodziłeś?"
- "Jaki jest twój ulubiony kolor?"Important:
Do not reorder/remove questions carelessly if players already configured recovery.
The plugin stores question ID, so changing order may make old accounts display a different question.
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: trueEnables Discord webhook notifications.
enabled: trueDiscord webhook URL.
webhook_url: "https://discord.com/api/webhooks/..."Controls which events are sent.
Examples:
user_register: true
failed_attempts: true
account_locked: true
admin_sensitive: trueRecommended:
Keep sensitive admin actions enabled if you want audit logs.
security:
account_lock_enabled: true
kicks_before_lock: 3If enabled, accounts can be locked after too many failed attempts/kicks.
account_lock_enabled: trueHow many failed login kick events are allowed before account is locked.
kicks_before_lock: 3If a player repeatedly fails login and reaches this limit, account becomes locked and must be unlocked by admin.
Admin unlock command:
/pureauth unlock <player>
captcha:
enabled: true
length: 5
characters: "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"If enabled, registration requires CAPTCHA.
enabled: trueThen players must use:
/register <password> <password> <captcha>
If disabled:
/register <password> <password>
Length of generated CAPTCHA.
length: 5Characters used for CAPTCHA generation.
characters: "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"login_timeout: 60
max_attempts: 3
min_password_length: 4
max_accounts_per_ip: 3How many seconds player has to login/register before being kicked.
login_timeout: 60How many wrong login attempts are allowed before kick.
max_attempts: 3Minimum password length.
min_password_length: 4Recommended:
min_password_length: 6or higher.
Maximum number of accounts from the same IP.
max_accounts_per_ip: 3Useful against account spam.
sessions:
enabled: true
time_minutes: 1If enabled, players can reconnect without logging in again for a short time.
enabled: trueHow long the session lasts.
time_minutes: 1Example:
time_minutes: 5Means session is valid for 5 minutes after logout.
admin_guard:
enabled: trueIf enabled, players with this permission:
pureauth.admin.guard
must enable 2FA.
Recommended:
Give pureauth.admin.guard to owners, admins and staff accounts.
update_checker: trueChecks for plugin updates.
message_interval: 10How often login/register reminder messages are sent.
Value is in seconds.
message_interval: 10locations:
spawn_login: ""
spawn_register: ""Do not edit manually unless you know the format.
Use commands:
/pureauth location login
/pureauth location register
messages:
en:
...
pl:
...PureAuth supports English and Polish messages.
Set language here:
settings:
language: "EN"or:
settings:
language: "PL"You can edit all messages manually.
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"database:
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"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"For very large networks, you may test:
maximum_pool_size: 32
database_threads: 8
crypto_threads: 8
queue_size: 1024But do this only after checking CPU and database usage.
For BungeeCord/Velocity networks:
- Use MySQL/MariaDB.
- Install
pureauth-paperon backend Paper servers. - Install
pureauth-bungeeorpureauth-velocityon proxy. - Keep backend servers in
online-mode=false. - Keep
network.mode: "LOCAL"for now. - Redis config is reserved for future multi-proxy shared state.
Check:
online-mode=falsePureAuth will disable itself if backend server is in online mode.
Check if CAPTCHA is enabled:
captcha:
enabled: trueIf CAPTCHA is enabled, command is:
/register <pass> <pass> <captcha>
SQLite is not recommended for proxy networks.
Use:
database:
type: "MYSQL"Check:
premium_login:
enabled: true
require_same_ip: trueIf require_same_ip is true, player must connect from the same IP as before.
Also make sure Mojang API is reachable.
Make sure PlaceholderAPI is installed.
Available placeholders:
%pureauth_logged%
%pureauth_has_2fa%
Give the specific permission.
Example:
pureauth.admin.reload
pureauth.admin.unlock
pureauth.admin.setpassword
Do not rely only on pureauth.admin unless your permissions plugin is configured to inherit children.
/register <password> <password> [captcha]
/login <password>
/changepass <old> <new> <new>
/premium
/cracked
/2fa setup
/2fa remove
/2fa recovery <code>
/recovery setup
/recovery remove
/recovery start
/recovery pass <new> <new>
/pureauth
/pureauth reload
/pureauth stats
/pureauth unlock <player>
/pureauth unregister <player>
/pureauth register <player> <password>
/pureauth forcelogin <player>
/pureauth info <player>
/pureauth setpassword <player> <newpass>
/pureauth accounts <IP>
/pureauth location <login|register>
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.guard