l2111pageloginverify: MC 私設鯖向けに書いたローカルログイン認証プラグイン
l2111pageloginverify は Paper 1.21 サーバー向けに書いたローカルログイン認証プラグインだ。友人と立てた私設鯖で使っている。サードパーティのアカウントシステムには繋がず、外部認証も挟まない。ユーザー名とパスワードはすべてローカルで動き、データは自分の手元に残る。
MC サーバーにはネイティブの入力 UI がない。よくあるやり方は、プレイヤーにチャットで /login パスワード と打たせるもので、平文がそのままチャット欄に流れてしまう。このプラグインでは代わりに署名済み本(signed book)を使う。参加したプレイヤーはまずロックされ、認証用の本を渡され、ユーザー名とパスワードを書いて署名する。署名すると自動で登録またはログインになる。署名済みの本は編集できず下書きも残らないので、チャット欄はきれいなままだ。認証が通るまでプレイヤーは全面的にフリーズし、移動・インタラクト・チャット・コマンド・インベントリ・被ダメージはすべてブロックされる。インベントリが満杯で空きが必要なときは、まずアイテムを安全に一時退避し、認証完了後に元通り返す。NBT・エンチャント・耐久値はすべて保持される。
ユーザーデータは users.yml に落ちる。パスワードは平文と PBKDF2 ハッシュの 2 モードに対応し、実行時に /dwgxverify encryption <true|false> で切り替えられる。データは data.hashed と data.plain に分けて格納し、互いに汚染しない。ログインごとに logs.yml へ記録を 1 件書き込み、IP・時刻・個別のソルトを持たせる。ほかにログインのレート制限、入力長の上限、タイムアウトまでに署名が終わらなければキック、そして管理者審査モードもある。これを有効にすると登録は /dwgxverify approve を通さないと許可されない。
コマンドラインでの管理は面倒なので、ついでにローカル Web パネルも足した。デフォルトで http://127.0.0.1:1337 を待ち受け、localhost のみにバインドしている。ユーザー一覧、ページング付き検索、審査、リセット処理、設定切り替えができる。外部依存ゼロを貫き、ページは HTML を持たず純粋に Java で組み立てている。プラグインを plugins/ に放り込めばそのまま使える。パネルは Basic Auth で、デフォルトパスワードは change-me。本番投入前に変更するのを忘れずに。
Java 21、Gradle 8.8 でビルドし、run-paper でローカルに 1.21 テスト鯖を立ててデバッグしている。paper-api のバージョンは 1.21.11-R0.1-SNAPSHOT、現在 1.0-SNAPSHOT、自分で使いながら随時いじっている。