Discordサーバー参加者限定マイクラサーバーを作ってみる
2025-12-08
azblob://2025/12/08/eyecatch/2025-12-08-discord-link-minecraft-000.jpg

FIXER Advent Calendar 2025 8日目の記事です。

はじめに

YoutubeやTwitchで配信を見ていると、時々YoutubeのメンバーやTwitchサブスクライバーだけが参加できるMinecraft(以下マイクラ)サーバーがあります。

実際、私もある配信者のTwitchサブスクライバー限定のマイクラサーバーに参加していたことがありますが、自分でも同じようなサーバーを作りたくなり、挑戦してみることにしました。

構成

私が参加していたサーバーは、以下のような流れで参加していました。

  1. YoutubeのメンバーおよびTwitchサブスクライバーのみ参加可能なDiscordサーバーに参加する。
  2. トークン発行用のマイクラサーバーに接続し、トークンを発行する。
  3. Discordに戻ってトークンを入力し、ロールを付与してもらう。
  4. 遊びたいマイクラサーバーに接続する。

1のDiscordサーバー参加者を絞るのはDiscordの機能で実現しているため、スコープ外とし、2~4を自分なりに実装してみることにしました。

今回は以下のものを使用して実装しました。

  • トークン発行用マイクラサーバー(以下サーバA)用プラグイン: Kotlin (PaperMC)
  • 遊びたいマイクラサーバー(以下サーバB)用のプラグイン: Kotlin (PaperMC、Ktor)
  • Discord Bot: Go (discordgo)
  • データベース: MySQL

KotlinとGoを選んだ理由は特にありません。使ってみたかったからです。

MySQLはOCI(Oracle Cloud Infrastructure)の無料枠を利用しましたが、ローカルにDockerなどでたてても問題ありません。

実装した流れは以下の通りです。

自分で実装した流れは以下の通りです。

Discord Bot と Minecraft サーバーを連携し、ユーザ認証とホワイトリスト登録を行う処理を示したシーケンス図。
  1. Discordサーバーに参加する。
  2. サーバAに接続し、トークンを発行する。
  3. サーバAは、接続してきたマイクラアカウントのUUIDと発行したトークンをDBに保存する。
  4. ユーザはDiscordに戻ってトークンを入力し、ロールを付与してもらう。
  5. Discord Botがトークンを検証し、DB上でDiscordのユーザとマイクラアカウントを紐づける。
  6. Discord BotがサーバBにHTTPでマイクラアカウントのUUIDを送信し、ホワイトリストに追加する。
  7. ユーザがサーバBに接続する。

これで特定のロールが付与された人だけがマイクラサーバーに接続できるようになりました。

しかし、このままでは一度ロールをもらえばDiscordのサーバーを抜けたとしてもサーバBへ接続できてしまいます。

というわけで、ロールが外れたらホワイトリストから削除する仕組みを入れましょう。

これは以下のような流れになります。

ユーザが Discord のロールを失った際、Bot がユーザ情報を削除し Minecraft サーバーのホワイトリストから除外する処理を示したシーケンス図。
  1. 何らかの理由でユーザからロールがはく奪される。
  2. Discord Botがロールのはく奪を検知する。
  3. Discord BotはDiscordのユーザとマイクラアカウントの紐づけをDBから削除する。
  4. Discord BotはサーバーBにHTTPでマイクラアカウントのUUIDを送信し、ホワイトリストから削除する。

これで、ロールがはく奪されたユーザは接続できなくなりました。

また今回は実装していませんが、検証済みユーザをDBに登録しているのでサーバBが定期的にDBを確認することで、手動でホワイトリストが更新されたとしてもDBの状態に強制することもできます。

最後に

今回の構成だと、トークンを発行するためだけに1つマイクラのサーバーを起動しているので無駄にリソースを消費しており、スペックが低めのマシンでは余裕がなくなる可能性があります。また、トークンを発行してから本来のユーザーがDiscordに入力するまでに第三者が入力してしまうと、なりすましが可能になる問題があります。

Discordもマイクラのアカウント(Microsoftアカウント)もOAuthが可能なので、両方で認証するのが安全だと考えますが、私が参加していたサーバーではそのあたりは割り切っているのか、特に対応は取られていないようでした(あくまでユーザ目線なので、裏側で何らかの対処がされている可能性はあります)。

また、今回はあくまで「作ってみる」ということで最低限ローカルで動くことだけを目的にしたので、ホワイトリストを変更するHTTPリクエストの認証や、BotもしくはサーバBがダウンした場合のリカバリー等は度外視しているので、実際に運用する場合はそれらにも注意する必要があります。