MCAuth は、Minecraft サーバーへの初回接続時に Discord 認証を要求する Paper プラグインです。
公開や半公開の Minecraft サーバーでは、「Discord コミュニティに参加しているメンバーだけを迎え入れたい」という運用がよくあります。しかし標準のホワイトリストは管理者が手作業で名前を追加する必要があり、参加希望者が増えるほど手間とミスが増えていきます。MCAuth は、初回接続時に Discord での認証を求めることでこの手続きを自動化します。プレイヤー自身が指定の Discord チャンネルでボタンを押してコードを入力するだけで、本人確認と入場許可の登録が完了するため、管理者の手動作業なしに「Discord にいる人だけが参加できる」サーバーを運用できます。
未認証のプレイヤーがサーバーへ接続すると、認証コードを表示して自動的にキックします。プレイヤーが指定された Discord チャンネルの「認証コードを入力」ボタンを押し、開いたフォームにそのコードを入力すると、認証済みとしてデータベースに保存され、次回から入場できるようになります。入場の可否は MCAuth のデータベースだけで判定し、Minecraft 標準のホワイトリスト(whitelist.json)は操作しません。ロールを設定しておけば、同時にそのロールが付き、Discord サーバーのチャンネルを見られるようになります。
- Paper 1.21
- Java 21
- Discord Bot
- 初回接続時に認証コードを表示してキック
- Discord の指定チャンネルにボタン付きの案内を設置し、フォームでコード認証
- 認証成功後に指定ロールを付与(任意)
- 認証成功後に指定チャンネルへ歓迎メッセージを投稿(投稿先・文面は設定で変更可能)
- 認証済み Minecraft UUID と Discord ユーザー情報を SQLite データベースに保存(標準のホワイトリストとは別管理)
- コード総当たり対策のための失敗回数制限
- Discordサーバー退出時に連携を解除し、接続中なら即座に切断
- Bot起動時に連携済みユーザーの在籍を確認し、停止中に退出した人の連携も解除
Bot起動時の在籍確認が終わるまでは、Minecraftへの入場と新規認証を拒否します。認証チャンネルのあるDiscordサーバーを対象に、キャッシュを使わずDiscord APIで確認します。通信・権限・DBエラーは退出として扱わず、認証データを残して再起動まで全員の入場を拒否します。
停止中に退出して、Botが起動する前にDiscordサーバーへ再参加した人は、起動時には在籍しているため連携を維持します。停止中の退出履歴を復元する処理ではありません。
mvn packageビルド後、プラグイン JAR は次の場所に作成されます。
target/mcauth-1.0.0.jar
- Discord Developer Portal でアプリケーションと Bot を作成します。
- Bot の Server Members Intent を有効化します(退出したメンバーの認証取り消しに使います)。
- 認証用チャンネルで「チャンネルを見る」「メッセージを送信」「メッセージ履歴を読む」ができる権限を Bot に付与します。ロールを付ける場合は「ロールの管理」権限も付け、Bot のロールを付与するロールより上に置きます。
target/mcauth-1.0.0.jarを Paper サーバーのpluginsフォルダに入れます。- サーバーを一度起動します。
- 生成された
plugins/MCAuth/config.ymlを編集するか、Paper の起動環境に環境変数を設定します。 discord.tokenとdiscord.channel-id、またはMCAUTH_DISCORD_TOKENとMCAUTH_DISCORD_CHANNEL_IDを設定します。- サーバーを再起動します。
MCAuth は標準のホワイトリストを使いません。server.properties は次の設定にしてください。white-list=true のままだと、MCAuth で認証済みでも whitelist.json に無い人は入れません。
white-list=falsediscord:
token: "PUT_DISCORD_BOT_TOKEN_HERE"
channel-id: ""
welcome-channel-id: "1449580988597403651"
verified-role-id: ""
messages:
welcome: "{mention} さん、認証が完了しました。ようこそ!"
auth:
code-length: 4
code-group-size: 3
code-expire-seconds: 300
max-invalid-attempts: 5
lockout-seconds: 60discord.token: Discord Bot の Tokendiscord.channel-id: 認証ボタンを置く Discord チャンネル ID。既定は空で、環境変数でも指定されていなければ認証・入場を受け付けません。Bot 起動時にボタン付きの案内を投稿し、以前の案内があれば書き換えますdiscord.verified-role-id: 認証成功時に付けるロール ID。/unlinkで連携を解除すると外します。空なら付けませんdiscord.welcome-channel-id: 認証成功後の歓迎メッセージの投稿先。既定は1449580988597403651。認証チャンネルと同じサーバー内のチャンネルを指定し、Botに閲覧・送信権限を付けてください。空なら投稿しませんmessages.welcome: 歓迎メッセージの文面。既定は{mention} さん、認証が完了しました。ようこそ!。{mention}は本人へのメンションに置き換わります。空なら投稿しません。DB保存成功時だけ投稿し、失敗・連携済み・Bot再起動時には投稿しません。解除後に再認証した場合は再び投稿します。投稿に失敗しても認証は維持し、ログに記録しますmessages.panel: 認証チャンネルに置く案内の本文auth.code-length: 認証コードの桁数(4〜8、既定は4)auth.code-group-size: キック画面でコードを区切る桁数。6桁を3にすると「123 456」と表示します。均等に分けられない桁数や0では区切りません。Discordには区切ったまま貼り付けても、空白・ハイフン・全角数字を無視して受け付けますauth.code-expire-seconds: 認証コードの有効期限auth.max-invalid-attempts: 何回間違えたら一時ロックするかauth.lockout-seconds: 一時ロックする秒数
次の環境変数を設定すると、対応する config.yml の値より優先されます。
MCAUTH_DISCORD_TOKEN=Botのトークン
MCAUTH_DISCORD_CHANNEL_ID=認証チャンネルID
MCAUTH_DISCORD_VERIFIED_ROLE_ID=認証後に付けるロールID環境変数が未設定または空の場合は、config.yml にフォールバックします。.env ファイルを使う場合は、Paper を起動するシェルやサービスから環境変数として読み込んでください。MCAuth は .env ファイル自体を直接読みません。
- 未認証のプレイヤーが Minecraft サーバーへ接続します。
- サーバーは認証コードを表示して、そのプレイヤーをキックします。
- プレイヤーは Discord の認証チャンネルで「認証コードを入力」ボタンを押し、表示されたコードをフォームに入力します。結果は本人だけに表示されます。
- コードが正しければ、プレイヤーは認証済みとしてデータベースに保存されます。
- 次回の接続から、その Minecraft UUID は入場できます。
Discord サーバー内のどのチャンネルでも /unlink を実行すると、実行者本人の Minecraft 連携を解除します。管理者権限は不要です。認証後に認証チャンネルが見えなくなる設定でも使えます。
- データベースの認証情報を削除し、Minecraft に接続中なら即座に切断します。標準のホワイトリストは操作しません。認証ロールを設定している場合は、そのロールも外します。
- 他人の名前や ID を指定することはできません。
- 未連携の場合は、その旨を返信します。
- 再連携する場合は Minecraft サーバーに接続し、表示された新しい認証コードを認証チャンネルのボタンから入力してください。
/unlink はBot起動時に認証チャンネルのあるDiscordサーバーへ登録されるスラッシュコマンドです。結果は実行者本人だけに表示されます。Botの導入時は applications.commands スコープを含め、利用者に「アプリコマンドを使う」権限を付与してください。
認証済みデータは、次の SQLite データベースに保存されます。ドライバーは Paper に同梱されているため、別途の準備は要りません。
plugins/MCAuth/mcauth.db
authenticated_players テーブルの列:
| 列 | 内容 |
|---|---|
uuid |
Minecraft UUID(主キー) |
name |
認証時の Minecraft 名 |
discord_user_id |
認証した Discord ユーザー ID(重複不可。1人1アカウント) |
discord_user_name |
認証時の Discord 名 |
内容は sqlite3 plugins/MCAuth/mcauth.db "SELECT * FROM authenticated_players;" などで確認できます。
以前のバージョンが使っていた plugins/MCAuth/data.yml は読み込みません。自動では移行しないため、引き継ぐ場合は data.yml の内容を上のテーブルへ登録してください。
- Discord Bot Token は GitHub や公開チャットに絶対に載せないでください。
plugins/MCAuth/config.ymlやplugins/MCAuth/mcauth.dbは公開しないでください。- Bot には認証用チャンネルだけを読み書きできる権限を付けることを推奨します。
- 既に生成済みの
config.ymlは、プラグインを更新しても自動では上書きされません。 mcauth.dbを開けないなど起動に失敗した場合、MCAuth は停止せず、サーバーを再起動するまで認証済みの人も含めて全員の入場を拒否します。接続中の人もキックします。ただし、MCAuth の JAR が読み込まれない、または他のプラグインやコマンドで MCAuth が無効化された場合は入場チェックがなくなります。