Official Documentation

CraftersLogin

A high-performance, autonomous authentication plugin for premium, offline, and hybrid Minecraft networks. Built to outperform the competition โ€” zero friction for players, maximum security for admins.

v3.0 โ€” The nLogin Killer

Overview

CraftersLogin is the authentication layer of the Crafters ecosystem โ€” a high-performance, autonomous plugin that handles player registration, login, sessions, and security for offline-mode (cracked) and hybrid Minecraft networks running on Paper / Spigot 1.13+.

๐Ÿ›ก๏ธ BCrypt Hashing

All passwords are hashed with BCrypt (cost 12). Plaintext passwords are never stored or transmitted.

๐Ÿš€ Redis Sessions

Shared session state across multiple proxy servers. Players don't re-login when switching sub-servers.

๐Ÿ•ต๏ธ Auto Proxy Detection

The plugin detects BungeeCord / Velocity automatically by reading server config files. Zero configuration required.

โ›๏ธ Bedrock Support

Silent Reflection-based GeyserMC detection. Bedrock players skip the login screen automatically with zero dependency conflicts.

๐Ÿ“ฑ Sign GUI Login

Native Minecraft sign editor interface. Players type their password using the keyboard โ€” completely bypasses chat. Defeats chat-logger hacked clients. Powered by ProtocolLib.

๐Ÿ”‘ Google 2FA

Staff members can protect their accounts with TOTP (Google Authenticator / Authy) for a second authentication factor.

Installation & Requirements

Required

  • Paper or Spigot 1.13 โ€“ 1.20.x
  • Java 17+ (Java 21 recommended for best compatibility)
  • ProtocolLib (required for SIGN mode and for CraftersFastAuth premium login)

Optional but Recommended

  • CraftersFastAuth โ€” enables Mojang premium account auto-login
  • PlaceholderAPI โ€” exposes %crafterslogin_*% placeholders for scoreboards and chat plugins
  • CraftersStaff โ€” activates the staff bridge (vanish/staff-mode state sync)
  • Redis โ€” required only if you use network-sessions.storage: REDIS

Installation Steps

  1. Download CraftersLogin-3.0.jar from an official source (Modrinth, SpigotMC, or Discord).
  2. Place it in your server's plugins/ folder.
  3. Restart the server. All configuration files are generated automatically.
  4. Open plugins/CraftersLogin/config.yml and configure your database, security settings, and desired features.
  5. Run /cl reload after any configuration change (no restart needed).
plugins/ CraftersLogin.jar CraftersLogin/ config.yml โ† Main configuration (database, security, sessions, spawns) messages.yml โ† All player-facing messages and titles spawns.yml โ† Spawn location data (auto-managed, do not edit manually)

Security & Session System

Unauthenticated players are fully isolated: they cannot move, chat, use items, drop items, take damage, interact with entities, or see other players until they successfully log in.

Smart Sessions: When a player reconnects from the same IP within the session window, CraftersLogin auto-authenticates them โ€” no password required. This dramatically improves the experience for regular players without reducing security.

Brute-Force Protection: After 3 failed attempts, staff are notified. After 5 failures, a temporary IP ban is applied. After 10 consecutive failures, a permanent ban can be triggered automatically.

Authentication Modes

ModeHow it worksBest for
CHAT Player types /login <password> in chat Any server. Simplest setup, compatible with all clients.
SIGN Running /login or /register opens a native Minecraft Sign editor. The player types their full password using the keyboard โ€” no chat interaction. The sign is never placed in the world (ProtocolLib packets only) and the block is restored instantly after submission. Servers concerned about chat-logger hacked clients that intercept keystrokes. Supports letters, numbers, and special characters. Requires ProtocolLib.

Have I Been Pwned (HIBP) Integration

When enabled, CraftersLogin checks every new password against the HaveIBeenPwned API using k-Anonymity: only the first 5 characters of the SHA-1 hash are sent โ€” the full password is never transmitted to any external service. If the password has appeared in any known data breach, registration is blocked and the player is asked to choose a different password.

Google Authenticator 2FA (for Staff)

Staff members with the crafterslogin.2fa permission can enable TOTP-based two-factor authentication using any standard authenticator app (Google Authenticator, Authy, etc.).

# Staff setup flow: /2fa start โ† Generates a QR code / secret key in chat /2fa confirm <code> โ† Confirm with the first code from your app # On every login (after 2FA is enabled): /2fa verify <code> โ† Enter the 6-digit rotating code from your app

Player Commands

CommandAliasDescription
/register <pass> <confirmPass>/regCreates a new account. Both passwords must match and pass complexity rules.
/login <pass>/lAuthenticates the player using their registered password.
/changepassword <old> <new> <confirm>/cpChanges your password. The current password is required as verification.
/unregister <password>/unregPermanently deletes your account. Requires your current password as confirmation.
/premiumโ€”Links your account to Mojang for automatic login on future joins. Requires CraftersFastAuth.
/offlineโ€”Switches your account back to password authentication (removes the Mojang link).
/recovery set <email>โ€”Registers your email address for password recovery.
/recovery requestโ€”Sends a one-time recovery code to your registered email address.
/recovery confirm <code> <newpass>โ€”Uses the emailed code to set a new password.
/2fa startโ€”Begins the Google Authenticator 2FA setup flow. Generates a secret key.
/2fa confirm <code>โ€”Completes 2FA setup by verifying the first TOTP code from your app.
/2fa verify <code>โ€”Verifies your identity using your authenticator app when prompted after login.
/securityanswer <answer>โ€”Answers the staff IP-change security challenge to complete authentication.
/setsecurityanswer <answer>โ€”Sets your personal staff security secret phrase used for IP-change verification.

Admin Commands โ€” /crafterslogin (alias /cl)

SubcommandDescription
/cl reloadReloads config.yml and messages.yml live, without restarting the server.
/cl versionDisplays the current plugin version, build date, and author information.
/cl info <player>Shows full account details: IP, registration date, last login, 2FA status, and premium status.
/cl accountsShows the total number of registered accounts in the database.
/cl forcelogin <player>Forces a player into authenticated state without requiring a password. Useful for locked-out admins.
/cl forcelogout <player>Logs a player out immediately and returns them to the authentication screen.
/cl changepass <player> <newpass>Resets a player's password as an administrator. Does not require the old password.
/cl unregister <player>Permanently deletes a player's account from the database.
/cl dupeip <player>Lists all accounts that share the same IP address as the target player. Useful for detecting alt accounts.
/cl purge <days>Deletes all accounts that have been inactive for more than the specified number of days.
/cl spawn <type>Sets a spawn location at your current position. Types: login, register, firstjoin, join, respawn.
/cl import <authme|nlogin>Imports all player accounts from an AuthMe or nLogin database asynchronously. Progress is reported in console.
/cl migratedb <target>Migrates all data from the current database backend to a different one (e.g., H2 โ†’ MySQL).

Permission Nodes

PermissionDefaultDescription
crafterslogin.adminOPMaster node โ€” grants access to ALL admin subcommands under /cl. Includes all child nodes below.
crafterslogin.bypassfalsePlayer completely skips the authentication flow on join. Use with extreme caution โ€” intended for bots or automated accounts only.
crafterslogin.bypass.ip-limitOPBypasses the max-accounts-per-IP restriction (Anti-Alt system). Assign to staff or known cybercafรฉ IPs.
crafterslogin.notifyOPPlayer receives in-game notifications when a new CraftersLogin update is available.
crafterslogin.helptrueAccess to the help menu (/cl help). Granted to all players by default.
crafterslogin.2faOPAllows a player to use the /2fa command system to set up Google Authenticator.
crafterslogin.staff.securityOPSubjects this player to the enhanced IP-change security checks. Assign to all staff members.
crafterslogin.admin.reloadOPPermission to run /cl reload.
crafterslogin.admin.versionOPPermission to run /cl version.
crafterslogin.admin.infoOPPermission to run /cl info <player>.
crafterslogin.admin.accountsOPPermission to run /cl accounts.
crafterslogin.admin.forceloginOPPermission to run /cl forcelogin <player>.
crafterslogin.admin.forcelogoutOPPermission to run /cl forcelogout <player>.
crafterslogin.admin.changepassOPPermission to run /cl changepass <player> <pass>.
crafterslogin.admin.unregisterOPPermission to run /cl unregister <player>.
crafterslogin.admin.dupeipOPPermission to run /cl dupeip <player>.
crafterslogin.admin.purgeOPPermission to run /cl purge <days>.
crafterslogin.admin.spawnsOPPermission to run /cl spawn <type>.
crafterslogin.admin.convertOPPermission to run /cl import <plugin>.
crafterslogin.admin.migratedbOPPermission to run /cl migratedb <target>.

Configuration Reference & Tutorials

All configuration lives in plugins/CraftersLogin/config.yml. After any change, run /cl reload โ€” no server restart required.

๐Ÿ“ฆ Database

What it does: Defines where player accounts, hashed passwords, IPs, and session data are persisted.

H2 โ€” embedded Java database. Zero setup, perfect for testing and small servers. Data is stored as a local file (CraftersLogin/database.mv.db).

SQLITE โ€” lightweight file-based SQL. Also zero setup, but slightly slower than H2 for large datasets.

MYSQL / MARIADB โ€” recommended for production servers with 50+ concurrent players or multiple servers sharing the same account pool.

database: type: "H2" # H2 | SQLITE | MYSQL | MARIADB host: "127.0.0.1" # MySQL/MariaDB host (ignored for H2/SQLite) port: 3306 # MySQL default port database: "crafterslogin" username: "root" password: ""

๐Ÿšซ Pre-Authentication Restrictions

What it does: Controls what unauthenticated players can and cannot do before logging in.

block-chat โ€” Highly recommended. Prevents players from sending chat messages before login, stopping spam bots and griefers from polluting chat.

block-movement โ€” Freezes the player at their join position. Prevents exploration of the server while unauthenticated. They will be teleported to the auth spawn if configured.

allowed-commands โ€” Whitelist of the only commands players can run before authenticating. Always keep /login, /register, and their aliases here.

restrictions: block-chat: true block-movement: true allowed-commands: - "/login" - "/register" - "/l" - "/reg" - "/securityanswer" - "/setsecurityanswer"

๐Ÿ” Authentication Mode

CHAT โ€” Classic mode. Players type /login <password> in chat. Works on all clients without any extra plugins.

SIGN โ€” When the player runs /login or /register, a native Minecraft Sign editor opens automatically. The player types their full alphanumeric password using the keyboard and clicks Done. The sign is sent via ProtocolLib packets โ€” it is never actually placed in the world โ€” and the block is restored instantly. This completely defeats chat-logger mods that intercept keystrokes. Requires ProtocolLib.

authentication: type: "CHAT" # CHAT | SIGN

๐Ÿ›ก๏ธ Security โ€” Anti-Alt, Passwords, Brute Force & Captcha

Anti-Alts โ€” Limits the number of accounts that can be registered from the same IP address. Prevents account farming and ban evasion. Add shared network IPs (cybercafรฉs, school networks) to whitelisted-ips so those players aren't blocked.

Password Complexity โ€” Forces players to meet minimum requirements. prevent-username-as-password blocks the single most common weak password pattern.

HIBP โ€” Checks each new password against millions of known leaked passwords. Only a 5-character SHA-1 prefix is sent (k-Anonymity). The full password never leaves the server.

Brute Force โ€” At 3 fails: staff get a warning notification. At 5 fails: temporary IP ban for minutes-ban-after-5-fails minutes. At 10 fails: permanent ban if perm-ban-after-10-fails is true.

Captcha โ€” If require-for-all-unauthenticated is false, captcha only appears for IPs that are new or have recent failed attempts (adaptive). If true, all players solve a captcha on every join.

security: anti-alts: enabled: true max-accounts-per-ip: 3 whitelisted-ips: - "127.0.0.1" - "192.168.1.100" # Add known shared IPs here password-complexity: enabled: true min-length: 8 require-number: true require-special-char: true prevent-username-as-password: true hibp: enabled: true prevent-pwned-passwords: true brute-force: enabled: true max-attempts-before-warning: 3 minutes-ban-after-5-fails: 5 perm-ban-after-10-fails: true captcha: enabled: true require-for-all-unauthenticated: false

๐Ÿ‘ฎ Staff Security

What it does: Adds extra verification layers specifically for staff members (players with the crafterslogin.staff.security permission).

force-secret-answer โ€” Staff must run /setsecurityanswer <phrase> before they can fully authenticate. If not set, they are blocked at login until configured.

check-ip-change โ€” If a staff member connects from a different IP than their last known IP, they must answer their secret phrase before gaining staff permissions. Protects against account hijacking.

afk-timeout โ€” Staff sessions expire after the configured minutes of inactivity, requiring a fresh login. Prevents a hijacked staff member's session from staying active indefinitely.

GeoIP โ€” Uses an external HTTP API to look up the country of the connecting IP. Set allowed-countries to restrict logins to specific countries (ISO codes). strict-ip-lock: true goes further โ€” the exact IP must match, not just the country.

staff-security: enabled: true force-secret-answer: true check-ip-change: true afk-timeout: enabled: true minutes: 10 geoip: enabled: true api-url: "http://ip-api.com/json/%ip%" allowed-countries: [] # Example: ["ES", "MX", "AR"] โ€” empty = all allowed strict-ip-lock: false # true = exact same IP required every time

๐Ÿ“ง Password Recovery via Email

What it does: Lets players request a one-time code sent to their registered email address when they forget their password. Each server admin configures their own SMTP credentials โ€” emails are sent from the server's own address, not a shared Crafters Development account.

Startup validation: CraftersLogin tests the SMTP connection asynchronously when the server starts. If the credentials are wrong, a clear SEVERE error is printed immediately โ€” you won't discover the misconfiguration when your first player tries to recover their password.

recovery: email: enabled: true host: "smtp.gmail.com" port: 587 username: "your-email@gmail.com" password: "xxxx xxxx xxxx xxxx" # โ† Use an App Password, NOT your real Gmail password sender-email: "noreply@yourserver.com" sender-name: "CraftersLogin Security" use-tls: true # Use true for port 587 (STARTTLS) use-ssl: false # Use true for port 465 (SSL), then set use-tls: false

Tutorial: Setting up Gmail SMTP

โš ๏ธ Do NOT use your real Gmail password. Google blocks regular account passwords for SMTP access. You must create an App Password instead.

  1. Go to myaccount.google.com/security and enable 2-Step Verification (required).
  2. Go to myaccount.google.com/apppasswords.
  3. Create a new App Password. Give it a name like "CraftersLogin".
  4. Copy the 16-character code generated (spaces are fine โ€” e.g., abcd efgh ijkl mnop).
  5. Paste it into the password: field in config.yml.
  6. Set username to your Gmail address and run /cl reload.
# Example Gmail config: recovery: email: enabled: true host: "smtp.gmail.com" port: 587 username: "myserver@gmail.com" password: "abcd efgh ijkl mnop" # App Password from Google sender-email: "noreply@myserver.com" sender-name: "MyServer Security" use-tls: true use-ssl: false

๐Ÿ“ Spawns

force-auth-spawn โ€” When enabled, unauthenticated players are immediately teleported to the designated login spawn on join. This prevents them from appearing in the middle of your main world.

hide-players-while-unauthenticated โ€” Makes unauthenticated players completely invisible to all other online players. This prevents authenticated players from interacting with or seeing unverified accounts.

isolate-inventories-until-login โ€” Clears and securely stores the player's inventory while they are in the auth phase. The inventory is fully restored immediately after login. This prevents item duplication exploits and inventory snooping.

spawns: force-auth-spawn: true use-multiverse-core: true # Set false if you don't use Multiverse-Core isolate-inventories-until-login: true hide-players-while-unauthenticated: true

Tutorial: Setting Spawn Locations In-Game

Walk to the exact location where you want each spawn, then run the corresponding command:

/cl spawn login โ† Where unauthenticated players appear when joining /cl spawn register โ† Where players are placed during the registration flow /cl spawn firstjoin โ† Where brand-new players land on their very first join /cl spawn join โ† Where authenticated players are sent after login /cl spawn respawn โ† Where players respawn after dying

Spawn data is saved to spawns.yml automatically. Multiple spawn types can use the same location.

๐ŸŒ Network Sessions & Redis

What it does: Stores authentication state so players don't have to re-enter their password when switching between sub-servers in a BungeeCord or Velocity network.

MEMORY mode โ€” Sessions live in the JVM heap of the current server. Works perfectly for single-proxy setups. Sessions are cleared on restart.

REDIS mode โ€” Sessions are stored in Redis (an external in-memory data store). Works across multiple proxies and proxy restarts. Required for high-availability or multi-proxy setups.

fallback-timeout-minutes โ€” How long (in minutes) a session stays valid. In REDIS mode this becomes the key TTL. In MEMORY mode an internal scheduler handles expiry. 60 minutes is a good balance between security and convenience for most servers.

network-sessions: enabled: true remember-during-proxy-connection: true fallback-timeout-minutes: 60 storage: "MEMORY" # MEMORY | REDIS # Only needed if storage is REDIS: redis: host: "127.0.0.1" port: 6379 password: "" # Leave empty if Redis has no auth configured database: 0 # Redis DB index (0โ€“15). Use different indexes per plugin.

Tutorial: Enabling Redis Sessions

  1. Install and start a Redis server (e.g., sudo apt install redis on Linux, or use a managed Redis service).
  2. Change storage: "REDIS" in your config.
  3. Set the redis.host to the IP of your Redis server.
  4. If Redis requires a password, set redis.password.
  5. Run /cl reload. The console will print [NetworkSession] Storage backend: REDIS to confirm.
  6. Install CraftersLogin on all sub-servers pointing to the same Redis instance โ€” sessions will automatically sync across all of them.

Migrating from AuthMe or nLogin

CraftersLogin can import player accounts directly from an existing AuthMe or nLogin installation.

โš ๏ธ Back up your database before running an import. The import is additive (it adds accounts without deleting existing ones), but a backup is always good practice.

  1. Make sure both the source plugin and CraftersLogin are installed on the same server.
  2. Configure CraftersLogin's database to point to where you want accounts stored.
  3. Run the import command as an admin:
    /cl import authme โ† Import from AuthMe /cl import nlogin โ† Import from nLogin
  4. The import runs asynchronously in the background. Progress and completion are reported in the server console.
  5. Once complete, you can remove the old authentication plugin.

Developer API

CraftersLogin exposes a Java API for other plugins to check authentication state and hook into login/register events.

Checking Authentication State

// Get the API instance CraftersLoginAPI api = CraftersLogin.getAPI(); // Check if a player has a registered account boolean registered = api.isRegistered(player.getUniqueId()); // Check if a player is currently authenticated in this session boolean authenticated = api.isAuthenticated(player.getUniqueId());

Listening to Events

@EventHandler public void onLoginSuccess(PlayerLoginSuccessEvent event) { Player player = event.getPlayer(); player.sendMessage("Welcome back, " + player.getName() + "!"); } @EventHandler public void onRegister(PlayerRegisterEvent event) { Player player = event.getPlayer(); player.sendMessage("Account created! You are now registered."); }

PlaceholderAPI Placeholders

PlaceholderReturns
%crafterslogin_is_authenticated%true or false
%crafterslogin_is_registered%true or false
%crafterslogin_is_premium%true or false
%crafterslogin_last_login%Date/time of the player's last successful login
%crafterslogin_registered_date%Date/time the player's account was created
โšก Required Companion Plugin

CraftersFastAuth

โš ๏ธ Premium login requires CraftersFastAuth

The /premium command and automatic Mojang authentication will not work without this companion plugin installed. CraftersFastAuth acts as the bridge between ProtocolLib's packet layer and CraftersLogin's authentication system.

What is CraftersFastAuth?

CraftersFastAuth is a lightweight companion plugin that adds premium (Mojang) auto-authentication to CraftersLogin. It works by intercepting the Minecraft login handshake at the protocol level using ProtocolLib, silently verifying the player's identity with Mojang's session servers, and automatically marking them as authenticated โ€” all before the player even sees the login screen.

Players with a registered premium account simply connect and are logged in instantly. Non-premium (cracked) players are completely unaffected and continue using the normal /login and /register flow.

How It Works

1 โ€” LOGIN_START Intercepted

ProtocolLib captures the player's login packet before Minecraft processes it.

2 โ€” Mojang Verification (async)

CraftersFastAuth checks if the account is marked premium in CraftersLogin, then initiates the Mojang encryption handshake asynchronously.

3 โ€” Session Created

If Mojang confirms the session, CraftersFastAuth notifies CraftersLogin and the player is auto-logged in instantly.

โœ“ Instant Login โ€” No Password Needed

The player joins and is immediately authenticated. If Mojang rejects the session, the player is kicked with an "Invalid session" message.

Installation

  1. Make sure CraftersLogin is already installed and configured.
  2. Install ProtocolLib on the same server.
  3. Download and place CraftersFastAuth-1.0.jar in your plugins/ folder.
  4. Restart the server โ€” no configuration needed.
  5. Players run /premium to link their Mojang account and enable auto-login for future joins.