FIXER Advent Calendar 2025 8日目の記事です。
はじめに
YoutubeやTwitchで配信を見ていると、時々YoutubeのメンバーやTwitchサブスクライバーだけが参加できるMinecraft(以下マイクラ)サーバーがあります。
実際、私もある配信者のTwitchサブスクライバー限定のマイクラサーバーに参加していたことがありますが、自分でも同じようなサーバーを作りたくなり、挑戦してみることにしました。
構成
私が参加していたサーバーは、以下のような流れで参加していました。
- YoutubeのメンバーおよびTwitchサブスクライバーのみ参加可能なDiscordサーバーに参加する。
- トークン発行用のマイクラサーバーに接続し、トークンを発行する。
- Discordに戻ってトークンを入力し、ロールを付与してもらう。
- 遊びたいマイクラサーバーに接続する。
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サーバーに参加する。
- サーバAに接続し、トークンを発行する。
- サーバAは、接続してきたマイクラアカウントのUUIDと発行したトークンをDBに保存する。
- ユーザはDiscordに戻ってトークンを入力し、ロールを付与してもらう。
- Discord Botがトークンを検証し、DB上でDiscordのユーザとマイクラアカウントを紐づける。
- Discord BotがサーバBにHTTPでマイクラアカウントのUUIDを送信し、ホワイトリストに追加する。
- ユーザがサーバBに接続する。
これで特定のロールが付与された人だけがマイクラサーバーに接続できるようになりました。
しかし、このままでは一度ロールをもらえばDiscordのサーバーを抜けたとしてもサーバBへ接続できてしまいます。
というわけで、ロールが外れたらホワイトリストから削除する仕組みを入れましょう。
これは以下のような流れになります。

- 何らかの理由でユーザからロールがはく奪される。
- Discord Botがロールのはく奪を検知する。
- Discord BotはDiscordのユーザとマイクラアカウントの紐づけをDBから削除する。
- Discord BotはサーバーBにHTTPでマイクラアカウントのUUIDを送信し、ホワイトリストから削除する。
これで、ロールがはく奪されたユーザは接続できなくなりました。
また今回は実装していませんが、検証済みユーザをDBに登録しているのでサーバBが定期的にDBを確認することで、手動でホワイトリストが更新されたとしてもDBの状態に強制することもできます。
最後に
今回の構成だと、トークンを発行するためだけに1つマイクラのサーバーを起動しているので無駄にリソースを消費しており、スペックが低めのマシンでは余裕がなくなる可能性があります。また、トークンを発行してから本来のユーザーがDiscordに入力するまでに第三者が入力してしまうと、なりすましが可能になる問題があります。
Discordもマイクラのアカウント(Microsoftアカウント)もOAuthが可能なので、両方で認証するのが安全だと考えますが、私が参加していたサーバーではそのあたりは割り切っているのか、特に対応は取られていないようでした(あくまでユーザ目線なので、裏側で何らかの対処がされている可能性はあります)。
また、今回はあくまで「作ってみる」ということで最低限ローカルで動くことだけを目的にしたので、ホワイトリストを変更するHTTPリクエストの認証や、BotもしくはサーバBがダウンした場合のリカバリー等は度外視しているので、実際に運用する場合はそれらにも注意する必要があります。






![Microsoft Power BI [実践] 入門 ―― BI初心者でもすぐできる! リアルタイム分析・可視化の手引きとリファレンス](/assets/img/banner-power-bi.c9bd875.png)
![Microsoft Power Apps ローコード開発[実践]入門――ノンプログラマーにやさしいアプリ開発の手引きとリファレンス](/assets/img/banner-powerplatform-2.213ebee.png)
![Microsoft PowerPlatformローコード開発[活用]入門 ――現場で使える業務アプリのレシピ集](/assets/img/banner-powerplatform-1.a01c0c2.png)


