プライバシーとセキュリティの保護について
このシステムは安心して利用できるよう、セキュリティに配慮した設計になっています。具体的には以下の安全性が確保されています。
- Discordログイン時の安全性: Discordでログインを行っても、管理人にパスワードや個人情報が伝わることは一切ありません。システムは「この人が指定のDiscordサーバーのメンバーであるか」を確認しているだけです。
- 管理サイトへの安全な移動(SSO): コミュニティサイトから管理サイトへ移動する際も、パスワードを再度入力する必要はありません。システムが自動で「20秒間だけ有効な専用の通行証(一時トークン)」を発行し、安全にログイン状態を引き継ぎます。
- ネットワークの安全設計: 外部に公開されているのはAPIのポートのみであり、サーバーを内部から制御するRCON通信などはすべてサーバー内部だけで安全に処理されます。
システム仕様・シーケンス図
1. 避難所サーバー:Discordログイン
sequenceDiagram
participant U as ユーザー
participant S1 as 避難所サーバー
participant Auth as 認証サーバー
U->>S1: ログインボタン押下
S1->>Auth: GET /login (Discord OAuth2)
Auth-->>U: Discord認証画面へリダイレクト
U->>Auth: 認証・コールバック
Auth->>Auth: ギルドメンバー判定 & JWT発行(exp:365日)
Auth-->>S1: #token=JWT付きリダイレクト
S1->>S1: localStorageにJWT保存 & 署名検証 & 表示(display:block)
2. 避難所サーバー:MCID登録処理
sequenceDiagram
participant U as ユーザー
participant S1 as 避難所サーバー
participant Auth as 認証サーバー
participant Mojang as Mojang API
participant FS as Firestore
U->>S1: MCID入力 & 送信
S1->>Auth: POST /api/save-mcid (Authorization: Bearer JWT)
Auth->>Auth: JWTデコード & ユーザーID抽出
Auth->>Mojang: Mojang APIへUUID問い合わせ
Mojang-->>Auth: 正式UUID & 正式MCID返却
Auth->>FS: Firestoreでサーバー状態(isRunning)照会
alt isRunning == true (起動中)
Auth->>FS: serverドキュメントからポート情報を取得
Auth->>Auth: 同一マシン内(localhost)でRCON接続 & "whitelist add" 送信
else isRunning == false (停止中)
Auth->>FS: ローカルの whitelist.json を読み込み
Auth->>FS: UUIDとMCIDを JSON に追記・再保存
end
Auth->>FS: whitelist_mapping.json に保存
Auth-->>S1: { success: true, mcid, uuid }
S1-->>U: 登録完了通知
3. 避難所サーバー:データ取得 & 管理サイト連携(SSO)
sequenceDiagram
participant U as ユーザー
participant S1 as 避難所サーバー
participant Auth as 認証サーバー
participant API as MC-API
participant FS as Firestore
Note over U, FS: サーバー詳細・Mod一覧・稼働ログ取得時
U->>S1: サーバー詳細ページアクセス
S1->>FS: doc(db, "server", uuid) から基本情報取得
S1->>FS: doc(db, "log", today/yesterday) から稼働ログ取得
S1->>API: GET /api/mods/{serverId}
API-->>S1: Mod一覧 (.disabled除外) 返却
Note over U, Auth: Minecraft Server Admin用 SSOトークン発行時
U->>S1: Minecraft Server Adminへのリンクをクリック
S1->>Auth: GET /api/issue-sso-token (Bearer JWT)
Auth->>Auth: JWT検証 & 20秒限定 sso_token 生成
Auth-->>S1: { sso_token } 返却
S1->>S1: 新規タブでMinecraft Server Adminへ (?sso_token=...) 遷移
4. Minecraft Server Admin:ログイン & 権限確認フロー
sequenceDiagram
participant U as ユーザー
participant P2 as 管理サイト(各ページ)
participant API as MC-API
participant FS as Firestore
Note over U, FS: SSO自動ログイン時 (sso_token使用)
U->>P2: ?sso_token= 付きでアクセス
P2->>API: POST /api/sso-login (Bearer sso_token)
API->>API: sso_token検証 (20秒期限・purpose確認)
API->>FS: usersコレクションから discord_user_id でUID検索
API->>FS: firebase_auth.create_custom_token(uid) 発行
API-->>P2: { success: true, custom_token, uid }
P2->>FS: auth.signInWithCustomToken(custom_token) 実行
P2->>P2: ログインセッション確立
Note over U, FS: 通常ログインページアクセス時 (login.html)
U->>P2: login.html アクセス
P2->>FS: Email/Password または Microsoft OAuth2 認証
FS-->>P2: 認証成功 (ユーザーセッション確立)
Note over U, FS: 各種ページアクセス時 (auth-check.js共通)
U->>P2: 各種ページ (server-management / operation / config / logs / profile 等) アクセス
P2->>FS: auth.onAuthStateChanged() で認証状態監視
P2->>FS: db.collection("users").doc(uid).get() でユーザー情報取得
P2->>P2: users/{uid}/permissions を参照し、操作ボタンを動的に有効/無効化(disabled)
5. Minecraft Server Admin:サーバー起動・停止制御
sequenceDiagram
participant U as ユーザー
participant P2 as 管理サイト
participant API as MC-API
participant OS as Minecraftプロセス(OS)
participant FS as Firestore
Note over U, FS: サーバー起動時
U->>P2: サーバー起動ボタンクリック
P2->>API: POST /api/server/{id}/start (Bearer ID Token)
API->>FS: verify_firebase_token & check_user_permission ("start"権限検証)
API->>FS: サーバーIDから Firestore で folder_name を取得
API->>OS: 同一マシン内で run.bat 実行 (subprocess.Popen)
loop ログ監視ループ (最大120秒)
API->>OS: サーバー内の latest.log ファイルを読み込み
API->>API: 成功キーワード ("Done" 等) を判定
end
alt 起動成功
API->>FS: db.collection("server").document(id).update({isRunning: true})
API-->>P2: 200 OK (起動成功)
else タイムアウト/エラー
API-->>P2: 500 Error
end
Note over U, FS: サーバー停止時
U->>P2: サーバー停止ボタンクリック
P2->>API: POST /api/server/{id}/stop (Bearer ID Token)
API->>FS: check_user_permission ("stop"権限検証)
API->>FS: Firestoreからポート番号を取得
API->>OS: 同一マシン内(localhost)のRCONポートへ "stop" 送信
API->>API: create_backup() 実行 (ZIP圧縮バックアップ作成)
API->>FS: db.collection("server").document(id).update({isRunning: false})
API-->>P2: 200 OK (停止&バックアップ完了)
6. Minecraft Server Admin:MOD管理・ログ閲覧・データ編集
sequenceDiagram
participant U as ユーザー
participant P2 as 管理サイト
participant API as MC-API
participant OS as Minecraftプロセス(OS)
participant FS as Firestore
Note over U, FS: MODアップロード時
U->>P2: MODファイル選択 & アップロードボタン押下
P2->>API: POST /api/mods/{id}/upload (FormData, Bearer ID Token)
API->>FS: check_user_permission ("mod_upload"権限検証)
API->>FS: Firestoreから folder_name を取得して /mods へ保存
API-->>P2: 200 OK (アップロード完了)
Note over U, FS: ログ閲覧時
U->>P2: log-viewer.html アクセス & 選択
P2->>API: GET /api/logs/{id}/list または /view?file=...
API->>FS: check_user_permission ("logs"権限検証)
API->>OS: ログファイル読み込み & IPアドレス正規表現マスキング
API-->>P2: 200 OK (サニタイズ済みログ返却)
Note over U, FS: ワールドデータ操作 (ダウンロード/削除/アップロード)
U->>P2: ワールド操作ボタン押下 (DL / 削除 / UP)
P2->>API: GET/POST /api/world/{id}/download /delete /upload
API->>FS: 権限検証 & サーバー起動中チェック
API->>OS: バックアップ作成 & ZIP圧縮/削除/展開処理
API-->>P2: 200 OK または バイナリデータ送信
Note over U, FS: Config & server.properties 編集時
U->>P2: 各設定ファイル編集画面アクセス & 保存
P2->>API: GET/POST /api/config/... または /properties
API->>FS: 権限検証 & バリデーションチェック
API->>OS: ファイル読み込み / 書き込み
opt /reload 実行時
API->>OS: 同一マシン内のRCONで "/reload" 実行
end
API-->>P2: 200 OK (保存完了)