{"id":67623,"date":"2026-06-03T23:45:02","date_gmt":"2026-06-03T20:45:02","guid":{"rendered":"https:\/\/vpesports.com\/minecraft\/mods\/ezplugins-ezauth\/"},"modified":"2026-06-03T23:45:02","modified_gmt":"2026-06-03T20:45:02","slug":"ezplugins-ezauth","status":"publish","type":"mod","link":"https:\/\/vpesports.com\/minecraft\/mods\/ezplugins-ezauth\/","title":{"rendered":"EzAuth"},"content":{"rendered":"<p># EzAuth<\/p>\n<p>Drop-in authentication for modern Paper and Bukkit servers with polished UX, standalone or integrated TOTP 2FA, and flexible storage.<\/p>\n<p>![EzAuth logo](https:\/\/i.ibb.co\/DHQws42c\/ezauth-logo.png)<\/p>\n<p>## Overview<\/p>\n<p>EzAuth locks down your server&#8217;s spawn with email-backed registrations, password logins, and time-limited sessions. Players are guided through the process with configurable messages, multi-language prompts (English, Nederlands, Espa\u00f1ol out of the box), visual effects, and reminders while administrators retain full control over storage backends, security policy, and optional SMTP settings. Toggle between pure login, opt-in 2FA, or a **standalone two-factor** flow that layers EzAuth&#8217;s `\/2fa` experience onto any existing authentication plugin. **New:** guide administrators through an in-game installation that immediately re-locks every active session when setup finishes, tap into the new session caching layer for instant post-login checks, then hook directly into Laravel, WordPress, or XenForo user tables so your website and server share a single account system.<\/p>\n<p>## Key Features<\/p>\n<p>&#8211; **Player-first onboarding** \u2013 `\/register` validates emails, enforces configurable password lengths, blocks duplicate emails or accounts, and saves asynchronously so players never stall the main thread.<br \/>\n&#8211; **Guided ingame installation** \u2013 `\/ezauth install` walks staff through launch day setup, optionally bypasses the login guard until you&#8217;re ready, and re-locks every active session the moment installation is marked complete.<br \/>\n&#8211; **Localized messaging** \u2013 Ship multiple language packs (English, Nederlands, Espa\u00f1ol by default), set your default language, and let players opt into their preferred message set on join.<br \/>\n&#8211; **Hardened logins** \u2013 `\/login` honours staged cooldowns, respects bypass permissions, caches accounts for quicker checks, and runs password hashing off-thread before celebrating success with optional effects.<br \/>\n&#8211; **Built-in TOTP two-factor** \u2013 `\/2fa` walks players through setup, confirmation, verification, status checks, and disabling while the TwoFactorService generates secure secrets and verifies codes. Flip `security.yml`&#8217;s `authentication-type` to `two_factor` to run EzAuth as a standalone 2FA module alongside plugins like AuthMe or via proxy networks.<br \/>\n&#8211; **Session control** \u2013 Movement, chat, and non-whitelisted commands are blocked until authentication completes, with five-second reminders and automatic session timeouts that can re-lock idle players.<br \/>\n&#8211; **Session caching** \u2013 Cache active authentications per-server and across proxies to trim database hits and keep trusted players online through quick restarts.<br \/>\n&#8211; **Book-based prompts** \u2013 Toggle `authentication-input: book` to capture passwords and 2FA codes through an interactive written book, with automatic re-prompts if a player closes it early.<br \/>\n&#8211; **Celebratory polish** \u2013 Toggle per-event particles and sounds or disable them globally from `security.yml`.<br \/>\n&#8211; **Flexible storage** \u2013 Choose YAML files, EzAuth-managed MySQL tables, or hook directly into Laravel, WordPress, and XenForo schemas via the new integration block while still storing accounts by UUID or username.<br \/>\n&#8211; **Configurable hashing** \u2013 Switch between BCrypt (custom rounds), SHA-256 with a pepper, or WordPress PHPass without touching code.<br \/>\n&#8211; **Email-ready** \u2013 `email.yml` exposes SMTP host, port, TLS\/SSL, credentials, sender identity, and arbitrary mail properties so you&#8217;re ready when outbound messaging lands.<br \/>\n&#8211; **Email verification** \u2013 Send verification codes to new registrations, block unverified logins, and let players confirm or resend their code with `\/email` commands.<br \/>\n&#8211; **Sensitive command filtering** \u2013 Hide authentication attempts from console logs by listing sensitive commands in `security.yml` so staff chats stay clean while log filters update automatically on reloads.<br \/>\n&#8211; **Admin oversight** \u2013 `\/ezauth players` opens a paginated in-game GUI with account email, creation time, and 2FA status so staff can disable two-factor or remove registrations without console commands.<\/p>\n<p>![Admin GUI screenshot](https:\/\/i.ibb.co\/mVFfdk3C\/ezauth-screenshot-admin-gui.png)<\/p>\n<p>## Authentication Types<\/p>\n<p>&#8211; **Login** \u2013 The classic EzAuth flow with `\/register`, `\/login`, and optional `\/2fa` for layered security.<br \/>\n&#8211; **Standalone 2FA** \u2013 Keep your existing password solution but give players EzAuth&#8217;s polished authenticator setup, code checks, and admin controls by setting `authentication-type: two_factor`. Perfect for networks standardising on AuthMe, MultiAuth, or proxy-level SSO that still want in-game TOTP enforcement.<br \/>\n&#8211; **Optional** \u2013 Let players secure their account when they&#8217;re ready while you maintain traditional logins for everyone else.<\/p>\n<p>## Commands &#038; Permissions<\/p>\n<p>| Command | Usage | Permission | Default |<br \/>\n|&#8212;|&#8212;|&#8212;:|&#8212;|<br \/>\n| \/register | \/register <email> <password> <password> | `ezauth.register` | Everyone |<br \/>\n| \/login | \/login <password> | `ezauth.login` | Everyone |<br \/>\n| \/2fa, \/twofactor | \/2fa <setup|confirm|verify|disable|status> | `ezauth.2fa` | Everyone |<br \/>\n| \/email | \/email <verify <code>|resend> | `ezauth.email` | Everyone |<br \/>\n| &#8211; | &#8211; | `ezauth.2fa.admin` | OP |<br \/>\n| \/ezauth | \/ezauth reload | `ezauth.reload` | OP |<br \/>\n| \/ezauth install | \/ezauth install <status|complete|reset|config> | `ezauth.install` | OP |<br \/>\n| &#8211; | &#8211; | `ezauth.bypass` | OP |<\/p>\n<p>## Installation<\/p>\n<p>Launch EzAuth for the first time and let the new installation workflow do the heavy lifting:<\/p>\n<p>1. Use `\/ezauth install status` to confirm the guided flow is active and view whether the login guard is temporarily bypassed.<br \/>\n2. Tweak installation options in-game with `\/ezauth install config` to enable reminders, disable bypass mode, or re-open the GUI later.<br \/>\n3. Once your storage, hashing, and security files look right, finish with `\/ezauth install complete` to re-lock every connected player until they authenticate.<br \/>\n4. Need to re-run onboarding for a new season? `\/ezauth install reset` re-opens the flow without touching existing accounts.<\/p>\n<p>## Quick Configuration Presets<\/p>\n<p>Choose the baseline that matches your deployment and copy the snippets into your generated configs.<\/p>\n<p>### YAML Storage + Password Login<\/p>\n<p>Perfect for single-server setups that don&#8217;t need a database. Accounts are saved to disk and BCrypt keeps passwords safe.<\/p>\n<p>&#8220;`yaml<br \/>\n# database.yml<br \/>\nstorage-type: yml<br \/>\naccount-identifier: uuid<br \/>\nyaml-file: registrations.yml<br \/>\nintegration:<br \/>\n  mode: none<br \/>\n&#8220;`<\/p>\n<p>&#8220;`yaml<br \/>\n# hashing.yml<br \/>\nalgorithm: bcrypt<br \/>\nbcrypt:<br \/>\n  rounds: 10<br \/>\n&#8220;`<\/p>\n<p>&#8220;`yaml<br \/>\n# security.yml<br \/>\nauthentication-type: login<br \/>\nparticles-enabled: false<br \/>\nsounds-enabled: false<br \/>\n&#8220;`<\/p>\n<p>### Managed MySQL + Login<\/p>\n<p>Stores players in EzAuth&#8217;s MySQL schema while retaining the classic `\/register` + `\/login` experience.<\/p>\n<p>&#8220;`yaml<br \/>\n# database.yml<br \/>\nstorage-type: mysql<br \/>\naccount-identifier: uuid<br \/>\nhost: localhost<br \/>\nport: 3306<br \/>\nname: ezauth<br \/>\nusername: ezauth<br \/>\npassword: changeme<br \/>\njdbc-parameters: useSSL=false&#038;allowPublicKeyRetrieval=true&#038;serverTimezone=UTC<br \/>\nintegration:<br \/>\n  mode: none<br \/>\n&#8220;`<\/p>\n<p>&#8220;`yaml<br \/>\n# hashing.yml<br \/>\nalgorithm: bcrypt<br \/>\nbcrypt:<br \/>\n  rounds: 12<br \/>\n&#8220;`<\/p>\n<p>&#8220;`yaml<br \/>\n# security.yml<br \/>\nauthentication-type: login<br \/>\nsession:<br \/>\n  timeout-minutes: 15<br \/>\nparticles-enabled: true<br \/>\nsounds-enabled: true<br \/>\n&#8220;`<\/p>\n<p>### Standalone 2FA Module<\/p>\n<p>Pair EzAuth with another authentication plugin and only use it for `\/2fa` management.<\/p>\n<p>&#8220;`yaml<br \/>\n# database.yml<br \/>\nstorage-type: mysql<br \/>\naccount-identifier: uuid<br \/>\nhost: localhost<br \/>\nport: 3306<br \/>\nname: ezauth<br \/>\nusername: ezauth<br \/>\npassword: changeme<br \/>\njdbc-parameters: useSSL=false&#038;allowPublicKeyRetrieval=true&#038;serverTimezone=UTC<br \/>\nintegration:<br \/>\n  mode: none<br \/>\n&#8220;`<\/p>\n<p>&#8220;`yaml<br \/>\n# hashing.yml<br \/>\n# Hashing is unused in standalone 2FA mode but keep defaults for compatibility.<br \/>\nalgorithm: bcrypt<br \/>\nbcrypt:<br \/>\n  rounds: 10<br \/>\n&#8220;`<\/p>\n<p>&#8220;`yaml<br \/>\n# security.yml<br \/>\nauthentication-type: two_factor<br \/>\ntwo-factor:<br \/>\n  standalone-mode: true<br \/>\n  enforce-on-join: true<br \/>\nsession:<br \/>\n  timeout-minutes: 10<br \/>\n&#8220;`<\/p>\n<p>### WordPress Integration + Shared Accounts<\/p>\n<p>Connect Minecraft logins to your existing WordPress site and sync optional two-factor status.<\/p>\n<p>&#8220;`yaml<br \/>\n# database.yml<br \/>\nstorage-type: mysql<br \/>\naccount-identifier: username<br \/>\nhost: localhost<br \/>\nport: 3306<br \/>\nname: wordpress<br \/>\nusername: wp_user<br \/>\npassword: supersecret<br \/>\njdbc-parameters: useSSL=false&#038;characterEncoding=UTF-8<br \/>\nintegration:<br \/>\n  mode: wordpress<br \/>\n  wordpress:<br \/>\n    table-prefix: wp_<br \/>\n    users-table: wp_users<br \/>\n    user-meta-table: wp_usermeta<br \/>\n    username-column: user_login<br \/>\n    email-column: user_email<br \/>\n    password-column: user_pass<br \/>\n    uuid-meta-key: minecraft_uuid<br \/>\n    two-factor-secret-meta-key: ezauth_2fa_secret<br \/>\n    two-factor-confirmed-meta-key: ezauth_2fa_confirmed<br \/>\n&#8220;`<\/p>\n<p>&#8220;`yaml<br \/>\n# hashing.yml<br \/>\nalgorithm: wordpress<br \/>\n&#8220;`<\/p>\n<p>&#8220;`yaml<br \/>\n# security.yml<br \/>\nauthentication-type: login<br \/>\ntwo-factor:<br \/>\n  optional: true<br \/>\nlocale:<br \/>\n  default-language: en_US<br \/>\n&#8220;`<\/p>\n<p>## Default Configuration<\/p>\n<p>`database.yml` now includes an `integration` section so you can reuse Laravel, WordPress, or XenForo tables while keeping EzAuth&#8217;s familiar commands. Update the table and column names to match your deployment or leave the mode on `none` to keep EzAuth&#8217;s managed schema.<\/p>\n<p>&#8220;`yaml<br \/>\n# EzAuth Storage Configuration<br \/>\nstorage-type: yml<\/p>\n<p>account-identifier: uuid<\/p>\n<p>yaml-file: registrations.yml<\/p>\n<p>host: localhost<br \/>\nport: 3306<br \/>\nname: ezauth<br \/>\nusername: root<br \/>\npassword: password<br \/>\njdbc-parameters: useSSL=false&#038;allowPublicKeyRetrieval=true&#038;serverTimezone=UTC<br \/>\npool:<br \/>\n  maximum-pool-size: 10<br \/>\n  minimum-idle: 2<br \/>\n  connection-timeout: 30000<br \/>\n  idle-timeout: 600000<br \/>\n  max-lifetime: 1800000<br \/>\n  data-source-properties:<br \/>\n    cachePrepStmts: &#8220;true&#8221;<br \/>\n    prepStmtCacheSize: &#8220;250&#8221;<br \/>\n    prepStmtCacheSqlLimit: &#8220;2048&#8221;<\/p>\n<p>integration:<br \/>\n  mode: none<br \/>\n  laravel:<br \/>\n    table: users<br \/>\n    uuid-column: uuid<br \/>\n    username-column: name<br \/>\n    email-column: email<br \/>\n    password-column: password<br \/>\n    two-factor-secret-column: two_factor_secret<br \/>\n    two-factor-confirmed-column: two_factor_confirmed<br \/>\n    created-at-column: created_at<br \/>\n    updated-at-column: updated_at<br \/>\n    remember-token-column: remember_token<br \/>\n  wordpress:<br \/>\n    table-prefix: wp_<br \/>\n    users-table: wp_users<br \/>\n    user-meta-table: wp_usermeta<br \/>\n    username-column: user_login<br \/>\n    email-column: user_email<br \/>\n    password-column: user_pass<br \/>\n    created-at-column: user_registered<br \/>\n    uuid-meta-key: minecraft_uuid<br \/>\n    two-factor-secret-meta-key: ezauth_two_factor_secret<br \/>\n    two-factor-confirmed-meta-key: ezauth_two_factor_confirmed<br \/>\n  xenforo:<br \/>\n    table-prefix: xf_<br \/>\n    user-table: xf_user<br \/>\n    user-auth-table: xf_user_authenticate<br \/>\n    user-field-value-table: xf_user_field_value<br \/>\n    user-profile-table: xf_user_profile<br \/>\n    username-column: username<br \/>\n    email-column: email<br \/>\n    created-at-column: register_date<br \/>\n    uuid-field-id: minecraft_uuid<br \/>\n    two-factor-secret-field-id: ezauth_two_factor_secret<br \/>\n    two-factor-confirmed-field-id: ezauth_two_factor_confirmed<br \/>\n&#8220;`<\/p>\n<p>WordPress setups need a few extra tweaks before going live:<\/p>\n<p>&#8211; Switch `hashing.yml`&#8217;s `algorithm` to `WORDPRESS_PHPASS` so EzAuth produces hashes compatible with WordPress&#8217; PHPass implementation.<br \/>\n&#8211; Keep the UUID and two-factor meta keys (`minecraft_uuid`, `ezauth_two_factor_secret`, `ezauth_two_factor_confirmed` by default) or adjust them to match your existing data.<br \/>\n&#8211; Update the table prefix or table names if your WordPress instance uses a custom prefix.<\/p>\n<p>XenForo deployments should create three custom text user fields in the XenForo control panel matching the configured `uuid-field-id`, `two-factor-secret-field-id`, and `two-factor-confirmed-field-id`. EzAuth keeps the values in `xf_user_field_value`, `xf_user_profile.custom_fields`, and `xf_user_authenticate` aligned whenever it updates an account.<\/p>\n<p>Laravel schemas should expose UUID and two-factor columns alongside the framework defaults (`remember_token`, `created_at`, `updated_at`). If you use Jetstream or Breeze, add the following migration so EzAuth can reuse your user table without data loss:<\/p>\n<p>&#8220;`php<br \/>\n\/\/ Laravel migration<br \/>\nSchema::table(&#8216;users&#8217;, function (Blueprint $table) {<br \/>\n    $table->uuid(&#8216;uuid&#8217;)->unique()->after(&#8216;id&#8217;);<br \/>\n    $table->text(&#8216;two_factor_secret&#8217;)->nullable()->after(&#8216;password&#8217;);<br \/>\n    $table->boolean(&#8216;two_factor_confirmed&#8217;)->default(false)->after(&#8216;two_factor_secret&#8217;);<br \/>\n});<br \/>\n&#8220;`<\/p>\n<p>EzAuth keeps the two-factor values intact when it updates an existing Laravel user and will fill in timestamps and the remember token for fresh rows.<\/p>\n<p>## Hashing defaults<\/p>\n<p>&#8220;`yaml<br \/>\n# hashing.yml<br \/>\nalgorithm: BCRYPT<br \/>\nbcrypt:<br \/>\n  rounds: 10<br \/>\nsha256:<br \/>\n  pepper: &#8220;&#8221;<br \/>\n&#8220;`<\/p>\n<p>## Security defaults<\/p>\n<p>&#8220;`yaml<br \/>\n# security.yml<br \/>\nrequire-email-validation: true<br \/>\nmin-password-length: 8<br \/>\nsession-timeout-seconds: 300<br \/>\nlogin-enabled: true<br \/>\nregister-enabled: true<br \/>\nbypass-enabled: true<br \/>\nlogin:<br \/>\n  cooldown:<br \/>\n    enabled: true<br \/>\n    stages:<br \/>\n      &#8211; attempts: 3<br \/>\n        cooldown-seconds: 10<br \/>\n      &#8211; attempts: 5<br \/>\n        cooldown-seconds: 60<br \/>\ntwo-factor:<br \/>\n  enabled: false<br \/>\n  issuer: EzAuth<br \/>\n  required-for-login: false<br \/>\n  secure-account-welcome-message:<br \/>\n    &#8211; &#8220;%prefix%&#038;aTwo-factor authentication is now enabled for your account, %player%!&#8221;<br \/>\nallowed-commands-while-unauthenticated:<br \/>\n  &#8211; login<br \/>\n  &#8211; register<br \/>\n  &#8211; 2fa<br \/>\n  &#8211; twofactor<br \/>\nvisual-effects:<br \/>\n  enabled: true<br \/>\n  login:<br \/>\n    enabled: true<br \/>\n    particle: VILLAGER_HAPPY<br \/>\n    particle-count: 30<br \/>\n    particle-offset-x: 0.0<br \/>\n    particle-offset-y: 1.0<br \/>\n    particle-offset-z: 0.0<br \/>\n    particle-spread-x: 0.25<br \/>\n    particle-spread-y: 0.35<br \/>\n    particle-spread-z: 0.25<br \/>\n    sound: ENTITY_PLAYER_LEVELUP<br \/>\n    sound-volume: 1.0<br \/>\n    sound-pitch: 1.2<br \/>\n  register:<br \/>\n    enabled: true<br \/>\n    particle: FIREWORKS_SPARK<br \/>\n    particle-count: 50<br \/>\n    particle-offset-x: 0.0<br \/>\n    particle-offset-y: 1.0<br \/>\n    particle-offset-z: 0.0<br \/>\n    particle-spread-x: 0.4<br \/>\n    particle-spread-y: 0.6<br \/>\n    particle-spread-z: 0.4<br \/>\n    sound: UI_TOAST_CHALLENGE_COMPLETE<br \/>\n    sound-volume: 1.0<br \/>\n    sound-pitch: 1.0<br \/>\n&#8220;`<\/p>\n<p>### Security (2FA-only mode)<\/p>\n<p>&#8220;`yaml<br \/>\n# EzAuth Security Configuration (2FA-only mode)<br \/>\nrequire-email-validation: false<br \/>\nmin-password-length: 8<br \/>\nsession-timeout-seconds: 0<br \/>\nlogin-enabled: false<br \/>\nregister-enabled: false<br \/>\nbypass-enabled: false<br \/>\nlogin:<br \/>\n  cooldown:<br \/>\n    enabled: false<br \/>\n    stages: []<br \/>\ntwo-factor:<br \/>\n  enabled: true<br \/>\n  issuer: EzAuth<br \/>\n  required-for-login: false<br \/>\n  secure-account-welcome-message:<br \/>\n    &#8211; &#8220;%prefix%&#038;aTwo-factor authentication is now enabled for your account, %player%!&#8221;<br \/>\nallowed-commands-while-unauthenticated:<br \/>\n  &#8211; 2fa<br \/>\n  &#8211; twofactor<br \/>\nvisual-effects:<br \/>\n  enabled: false<br \/>\n&#8220;`<\/p>\n<p>## messages.yml (example)<\/p>\n<p>&#8220;`yaml<br \/>\n# messages.yml<br \/>\ndefault-language: en<br \/>\nlanguages:<br \/>\n  en:<br \/>\n    name: &#8216;English&#8217;<br \/>\n    file: &#8216;messages\/en.yml&#8217;<br \/>\n    aliases:<br \/>\n      &#8211; &#8216;en_us&#8217;<br \/>\n      &#8211; &#8216;en-gb&#8217;<br \/>\n  nl:<br \/>\n    name: &#8216;Nederlands&#8217;<br \/>\n    file: &#8216;messages\/nl.yml&#8217;<br \/>\n    aliases:<br \/>\n      &#8211; &#8216;nl_nl&#8217;<br \/>\n      &#8211; &#8216;nl-be&#8217;<br \/>\n  es:<br \/>\n    name: &#8216;Espa\u00f1ol&#8217;<br \/>\n    file: &#8216;messages\/es.yml&#8217;<br \/>\n    aliases:<br \/>\n      &#8211; &#8216;es_es&#8217;<br \/>\n      &#8211; &#8216;es-mx&#8217;<\/p>\n<p>prefix: &#8216;&#038;7[&#038;bEzAuth&#038;7] &#8216;<\/p>\n<p>register:<br \/>\n  usage: &#8216;%prefix%&#038;cUsage: \/register <email> <password> <password>&#8216;<br \/>\n  success: &#8216;%prefix%&#038;aYou are now registered with &#038;f%email%&#038;a. Welcome!&#8217;<br \/>\n  already-registered: &#8216;%prefix%&#038;cYou are already registered. Use \/login <password> to authenticate.&#8217;<br \/>\n  email-in-use: &#8216;%prefix%&#038;cThat email address is already associated with another account.&#8217;<br \/>\n  invalid-email: &#8216;%prefix%&#038;cPlease enter a valid email address.&#8217;<br \/>\n  password-mismatch: &#8216;%prefix%&#038;cYour passwords do not match.&#8217;<br \/>\n  password-too-short: &#8216;%prefix%&#038;cPasswords must be at least &#038;f%length%&#038;c characters long.&#8217;<br \/>\n  prompt: &#8216;%prefix%&#038;eCreate an account with &#038;f\/register <email> <password> <password>&#8216;<br \/>\n  disabled: &#8216;%prefix%&#038;cRegistration is currently disabled. Please contact an administrator to create an account.&#8217;<\/p>\n<p>login:<br \/>\n  usage: &#8216;%prefix%&#038;cUsage: \/login <password>&#8216;<br \/>\n  success: &#8216;%prefix%&#038;aYou are now logged in.&#8217;<br \/>\n  success-with-email: &#8216;%prefix%&#038;aYou are now logged in with &#038;f%email%&#038;a.&#8217;<br \/>\n  not-registered: &#8216;%prefix%&#038;cNo account found. Use \/register <email> <password> <password>.&#8217;<br \/>\n  invalid-password: &#8216;%prefix%&#038;cIncorrect password. Please try again.&#8217;<br \/>\n  already-logged-in: &#8216;%prefix%&#038;cYou are already logged in.&#8217;<br \/>\n  cooldown-active: &#8216;%prefix%&#038;cToo many failed attempts. Please wait &#038;f%seconds%&#038;c seconds before trying again.&#8217;<br \/>\n  prompt: &#8216;%prefix%&#038;eWelcome back! Log in with &#038;f\/login <password>&#8216;<br \/>\n  bypass: &#8216;%prefix%&#038;aBypass enabled: you are already authenticated.&#8217;<br \/>\n  disabled: &#8216;%prefix%&#038;ePassword login is currently disabled on this server.&#8217;<\/p>\n<p>general:<br \/>\n  no-permission: &#8216;%prefix%&#038;cYou do not have permission to use this command.&#8217;<br \/>\n  players-only: &#8216;%prefix%&#038;cOnly players can run this command.&#8217;<br \/>\n  error: &#8216;%prefix%&#038;cAn internal error occurred. Please contact an administrator.&#8217;<br \/>\n  not-authenticated: &#8216;%prefix%&#038;cPlease authenticate using %methods%.&#8217;<br \/>\n  already-authenticated: &#8216;%prefix%&#038;cYou are already authenticated.&#8217;<\/p>\n<p>admin:<br \/>\n  reload:<br \/>\n    usage: &#8216;%prefix%&#038;eUsage: \/ezauth reload&#8217;<br \/>\n    success: &#8216;%prefix%&#038;aEzAuth configuration reloaded successfully.&#8217;<br \/>\n    failed: &#8216;%prefix%&#038;cFailed to reload EzAuth configuration. Check console for details.&#8217;<\/p>\n<p>twofactor:<br \/>\n  disabled: &#8216;%prefix%&#038;cTwo-factor authentication is not enabled on this server.&#8217;<br \/>\n  usage: &#8216;%prefix%&#038;eUsage: \/2fa <setup|confirm|verify|disable|status>&#8216;<br \/>\n  confirm-usage: &#8216;%prefix%&#038;cUsage: \/2fa confirm <code>'<br \/>\n  verify-usage: '%prefix%&cUsage: \/2fa verify <code>'<br \/>\n  disable-usage: '%prefix%&cUsage: \/2fa disable <code|player>'<br \/>\n  setup: '%prefix%&aAdd this account to your authenticator app using the secret or setup URL below.'<br \/>\n  secret-line: '%prefix%&7Secret: &b&n%secret% &8(Click to copy)'<br \/>\n  secret-hover: '&bClick to copy your 2FA secret to the clipboard.'<br \/>\n  uri-line: '%prefix%&7Setup URL: &f%uri%'<br \/>\n  already-enabled: '%prefix%&cTwo-factor authentication is already enabled.'<br \/>\n  setup-required: '%prefix%&cYou must set up two-factor authentication with &f\/2fa setup&c before continuing.'<br \/>\n  setup-optional: '%prefix%&eSecure your account any time with &f\/2fa setup&e when you are ready.'<br \/>\n  login-required: '%prefix%&cEnter a valid 2FA code using &f\/2fa verify <code>&c to finish signing in.'<br \/>\n  auth-required: '%prefix%&cPlease log in with &f\/login&c before using \/2fa commands.'<br \/>\n  invalid-code: '%prefix%&cThat 2FA code is invalid or expired. Please try again.'<br \/>\n  enabled: '%prefix%&aTwo-factor authentication has been enabled successfully.'<br \/>\n  verified: '%prefix%&aTwo-factor authentication complete. You are now signed in.'<br \/>\n  disabled-success: '%prefix%&aTwo-factor authentication has been disabled for your account.'<br \/>\n  admin-disabled-success: '%prefix%&aTwo-factor authentication has been disabled for &f%target%&a.'<br \/>\n  admin-disabled-notify: '%prefix%&cYour two-factor authentication has been disabled by &f%admin%&c.'<br \/>\n  admin-self-target: '%prefix%&cTo disable your own two-factor authentication, run &f\/2fa disable <code>&c.'<br \/>\n  admin-target-not-found: '%prefix%&cNo EzAuth account found for &f%target%&c.'<br \/>\n  admin-target-not-enabled: '%prefix%&cTwo-factor authentication is not enabled for &f%target%&c.'<br \/>\n  not-setup: '%prefix%&cYou have not generated a two-factor secret yet. Use \/2fa setup first.'<br \/>\n  not-confirmed: '%prefix%&cYou must confirm your two-factor secret with \/2fa confirm <code> before using it.'<br \/>\n  not-enabled: '%prefix%&cTwo-factor authentication is not currently enabled for your account.'<br \/>\n  no-account: '%prefix%&cNo EzAuth account found for your player. Please register first.'<br \/>\n  status-enabled: '%prefix%&aTwo-factor authentication is enabled on your account.'<br \/>\n  status-pending: '%prefix%&eTwo-factor authentication setup is pending confirmation.'<br \/>\n  status-disabled: '%prefix%&eTwo-factor authentication is currently disabled for your account.'<br \/>\n```<\/p>\n<p>## Proxy-aware Session Storage<\/p>\n<p>Need to keep players authenticated across a network of servers? Flip `proxy.enabled: true` inside `security.yml` and EzAuth will automatically switch to a shared SQL-backed session store. The plugin creates the required `ezauth_sessions` table, replicates login state between instances, and honours `proxy.session-ttl-seconds` so you can control how long a network-wide login remains valid before players must authenticate again. Set it to `0` to rely entirely on the per-server timeout defined by `session-timeout-seconds`.<\/p>\n<p>_This proxy support is still experimental, so test thoroughly before rolling it out across production networks._<\/p>\n<p>Heads up: distributed sessions require the MySQL backend defined in `database.yml`. EzAuth will refuse to boot the proxy cache if you're running purely on YAML storage.<\/p>\n<p>## Preparing Email Notifications<\/p>\n<p>EzAuth now ships with an optional `email.yml` that lets you preload SMTP details ahead of outbound messaging support. Leave the section disabled to skip configuration entirely, or enable it and provide your host, port, transport (TLS\/SSL), credentials, and sender identity so EzAuth is ready the moment email verification or alerts go live.<\/p>\n<p>```yaml<br \/>\nsmtp:<br \/>\n  enabled: false<br \/>\n  host: smtp.example.com<br \/>\n  port: 587<br \/>\n  username: no-reply@example.com<br \/>\n  password: \"changeme\"<br \/>\n  use-starttls: true<br \/>\n  from-name: \"EzAuth\"<br \/>\n  from-address: no-reply@example.com<br \/>\n```<\/p>\n<p>- Keep `enabled` set to `false` until you're ready to wire in valid credentials.<br \/>\n- Toggle `use-starttls` or swap to implicit SSL by setting `port` to `465` if your provider requires it.<br \/>\n- Pair email notifications with the verification commands under `\/email` to block unverified accounts before they log in.<\/p>\n<p>## Connecting EzAuth to Your Website Login<\/p>\n<p>Whether you're running Laravel, WordPress, or XenForo, EzAuth can authenticate players against the same credentials your website already uses. Follow the steps below for your platform after setting `storage-type: mysql`.<\/p>\n<p>### Laravel Integration<\/p>\n<p>1. Open `plugins\/EzAuth\/database.yml` and set `integration.mode` to `laravel`.<br \/>\n2. Point the MySQL connection settings at the database your Laravel site uses (usually the values from `.env`).<br \/>\n3. Ensure the column names in the `integration.laravel` block match your `users` table. If you use UUIDs, keep `uuid-column`; otherwise set `account-identifier` to `username`.<br \/>\n4. If you rely on Laravel's remember tokens or two-factor columns, keep them mapped\u2014EzAuth reads and updates them automatically when players log in or toggle `\/2fa`.<br \/>\n5. Reload EzAuth or restart the server. New registrations will write back through Laravel's hashing (BCrypt) so the same password works on both the site and Minecraft server.<\/p>\n<p>### WordPress Integration<\/p>\n<p>1. Set `storage-type` to `mysql` and `integration.mode` to `wordpress`.<br \/>\n2. Use the database credentials from `wp-config.php` so EzAuth connects to the same MySQL instance as WordPress.<br \/>\n3. Adjust `integration.wordpress.table-prefix` if your installation uses a custom prefix, then confirm the `users` and `usermeta` table names.<br \/>\n4. Map EzAuth's UUID and 2FA fields to meta keys that exist (or let EzAuth create them). Passwords are checked using WordPress' PHPass algorithm when you enable `hashing.algorithm: wordpress` in `hashing.yml`.<br \/>\n5. Reload EzAuth. Players can now `\/login` with their WordPress credentials, and optional `\/2fa` status will sync to the user meta rows.<\/p>\n<p>### XenForo Integration<\/p>\n<p>1. Switch `integration.mode` to `xenforo` and supply the same MySQL details XenForo uses.<br \/>\n2. Confirm the table prefix and column names in the `integration.xenforo` block. EzAuth will read usernames from `xf_user` and hashed passwords from `xf_user_authenticate`.<br \/>\n3. If you store Minecraft UUIDs or 2FA secrets in custom profile fields, update the `uuid-field-id` and `two-factor-*` identifiers so EzAuth syncs the correct values.<br \/>\n4. Make sure `hashing.yml` is set to `algorithm: xenforo` so EzAuth verifies XenForo's bcrypt variants correctly.<br \/>\n5. Reload EzAuth or restart to apply changes. Server logins will now validate against XenForo accounts, keeping forum and in-game credentials unified.<\/p>\n<p>## Getting Started<\/p>\n<p>1. Drop the jar into your `\/plugins` folder and start the server once to generate configs.<br \/>\n2. Edit `database.yml`, `hashing.yml`, and `security.yml` to match your storage, hashing, and policy.<br \/>\n3. Configure `email.yml` if you plan to send email-based notifications later.<br \/>\n4. Tune `messages.yml` to fit your community tone, then run `\/ezauth reload` in-game.<br \/>\n5. Invite players to `\/register`, `\/login`, and optionally `\/2fa setup` for full protection.<\/p>\n<p>## Need Help?<\/p>\n<p>EzAuth is in active development, so your feedback directly shapes the roadmap. You can join our Discord server for real-time support, feature requests and updates.<\/p>\n<p>![Try the other Minecraft plugins in the EzPlugins series](https:\/\/modrinth.com\/collection\/Q98Ov6dA)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Advanced authentication plugin with 2FA security. Sync your login easily with Xenforo, WordPress or Laravel<\/p>\n","protected":false},"featured_media":67624,"template":"","meta":{"_minecraft_slug":"ezplugins-ezauth","_minecraft_project_id":"ZPkCe20B","_minecraft_author":"Shadow48402","_minecraft_license":"MIT","_minecraft_downloads":90,"_minecraft_follows":0,"_minecraft_client_side":"unsupported","_minecraft_server_side":"required","_minecraft_storage_type":"zip","_minecraft_archive_name":"ezplugins-ezauth.zip","_minecraft_size_bytes":1530667,"_minecraft_version_count":1,"_minecraft_updated_at":"2026-05-15T19:55:44.873412Z","_minecraft_date_created":"2026-01-27T01:54:55.803936Z","_minecraft_date_modified":"2026-01-24T01:15:42.706578Z","_minecraft_project_url":"https:\/\/modrinth.com\/mod\/ezplugins-ezauth","_minecraft_icon_attachment_id":67624,"_minecraft_imported_at":"2026-06-03T20:45:03+00:00","_minecraft_import_hash":"19de0b6dacb476e6438390e5e4f1f74a","_minecraft_versions":"","_minecraft_links":"","_minecraft_gallery":"","_minecraft_api_metadata":""},"mod_category":[124,127,128,129],"mod_loader":[130,132,133,134],"minecraft_version":[62,37,40,41,73,74,38,78,79,80,81,82],"class_list":["post-67623","mod","type-mod","status-publish","has-post-thumbnail","hentry","mod_category-bukkit","mod_category-paper","mod_category-purpur","mod_category-spigot","mod_loader-bukkit","mod_loader-paper","mod_loader-purpur","mod_loader-spigot","minecraft_version-1-21","minecraft_version-1-21-1","minecraft_version-1-21-10","minecraft_version-1-21-11","minecraft_version-1-21-2","minecraft_version-1-21-3","minecraft_version-1-21-4","minecraft_version-1-21-5","minecraft_version-1-21-6","minecraft_version-1-21-7","minecraft_version-1-21-8","minecraft_version-1-21-9"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>EzAuth - Minecraft<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vpesports.com\/minecraft\/mods\/ezplugins-ezauth\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"EzAuth - Minecraft\" \/>\n<meta property=\"og:description\" content=\"Advanced authentication plugin with 2FA security. Sync your login easily with Xenforo, WordPress or Laravel\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vpesports.com\/minecraft\/mods\/ezplugins-ezauth\/\" \/>\n<meta property=\"og:site_name\" content=\"Minecraft\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/ezplugins-ezauth\\\/\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/ezplugins-ezauth\\\/\",\"name\":\"EzAuth - Minecraft\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/ezplugins-ezauth\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/ezplugins-ezauth\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/ezplugins-ezauth-icon-98fb9be85bb6bbd11daf09f134b405977bd2306e_96.webp\",\"datePublished\":\"2026-06-03T20:45:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/ezplugins-ezauth\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/ezplugins-ezauth\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/ezplugins-ezauth\\\/#primaryimage\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/ezplugins-ezauth-icon-98fb9be85bb6bbd11daf09f134b405977bd2306e_96.webp\",\"contentUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/ezplugins-ezauth-icon-98fb9be85bb6bbd11daf09f134b405977bd2306e_96.webp\",\"width\":96,\"height\":96},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/ezplugins-ezauth\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mods\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"EzAuth\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\",\"name\":\"Minecraft\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"EzAuth - Minecraft","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vpesports.com\/minecraft\/mods\/ezplugins-ezauth\/","og_locale":"en_US","og_type":"article","og_title":"EzAuth - Minecraft","og_description":"Advanced authentication plugin with 2FA security. Sync your login easily with Xenforo, WordPress or Laravel","og_url":"https:\/\/vpesports.com\/minecraft\/mods\/ezplugins-ezauth\/","og_site_name":"Minecraft","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/vpesports.com\/minecraft\/mods\/ezplugins-ezauth\/","url":"https:\/\/vpesports.com\/minecraft\/mods\/ezplugins-ezauth\/","name":"EzAuth - Minecraft","isPartOf":{"@id":"https:\/\/vpesports.com\/minecraft\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/ezplugins-ezauth\/#primaryimage"},"image":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/ezplugins-ezauth\/#primaryimage"},"thumbnailUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/ezplugins-ezauth-icon-98fb9be85bb6bbd11daf09f134b405977bd2306e_96.webp","datePublished":"2026-06-03T20:45:02+00:00","breadcrumb":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/ezplugins-ezauth\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vpesports.com\/minecraft\/mods\/ezplugins-ezauth\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/vpesports.com\/minecraft\/mods\/ezplugins-ezauth\/#primaryimage","url":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/ezplugins-ezauth-icon-98fb9be85bb6bbd11daf09f134b405977bd2306e_96.webp","contentUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/ezplugins-ezauth-icon-98fb9be85bb6bbd11daf09f134b405977bd2306e_96.webp","width":96,"height":96},{"@type":"BreadcrumbList","@id":"https:\/\/vpesports.com\/minecraft\/mods\/ezplugins-ezauth\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vpesports.com\/minecraft\/"},{"@type":"ListItem","position":2,"name":"Mods","item":"https:\/\/vpesports.com\/minecraft\/mods\/"},{"@type":"ListItem","position":3,"name":"EzAuth"}]},{"@type":"WebSite","@id":"https:\/\/vpesports.com\/minecraft\/#website","url":"https:\/\/vpesports.com\/minecraft\/","name":"Minecraft","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vpesports.com\/minecraft\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod\/67623","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod"}],"about":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/types\/mod"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media\/67624"}],"wp:attachment":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media?parent=67623"}],"wp:term":[{"taxonomy":"mod_category","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_category?post=67623"},{"taxonomy":"mod_loader","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_loader?post=67623"},{"taxonomy":"minecraft_version","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/minecraft_version?post=67623"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}