Skip to content

認証 (Xbox Live / PlayFab)

Minecraft Bedrock Edition の公式サーバーや外部のオンライン認証有効サーバー、Realms に接続する場合、Microsoft アカウント(Xbox Live)による認証が必須となります。

gophertunnel/minecraft/auth パッケージは、デバイスコードフロー(ブラウザでコードを入力して承認する方式)によるトークン取得と自動リフレッシュ機能を提供します。


認証の流れ (デバイスコード認証)


最もシンプルな認証接続

auth.TokenSourceminecraft.Dialer に設定するだけで、初回実行時にターミナルへ承認用URLとコードが表示されます。

go
package main

import (
	"fmt"
	"log"

	"github.com/sandertv/gophertunnel/minecraft"
	"github.com/sandertv/gophertunnel/minecraft/auth"
)

func main() {
	// auth.TokenSource を指定(コンソールにURLと認証コードが出力される)
	dialer := minecraft.Dialer{
		TokenSource: auth.TokenSource,
	}

	conn, err := dialer.Dial("raknet", "mco.mineplex.com:19132")
	if err != nil {
		log.Fatalf("接続エラー: %v", err)
	}
	defer conn.Close()

	fmt.Printf("ログイン成功! プレイヤー名: %s, XUID: %s\n",
		conn.IdentityData().DisplayName,
		conn.IdentityData().XUID,
	)
}

トークンのファイルキャッシュ(永続化)

毎回ブラウザでコード認証するのは不便なため、取得した oauth2.Token を JSON ファイルなどに保存して再利用するのが定石です。

go
package main

import (
	"encoding/json"
	"errors"
	"fmt"
	"log"
	"os"

	"github.com/sandertv/gophertunnel/minecraft"
	"github.com/sandertv/gophertunnel/minecraft/auth"
	"golang.org/x/oauth2"
)

const tokenPath = "token.json"

func getTokenSource() (oauth2.TokenSource, error) {
	// 1. 保存されたトークンファイルがあれば読み込む
	tokenData, err := os.ReadFile(tokenPath)
	if err == nil {
		var tok oauth2.Token
		if json.Unmarshal(tokenData, &tok) == nil {
			// リフレッシュ可能なTokenSourceを作成
			src := auth.RefreshTokenSource(&tok)
			// 新しいトークンに更新されたら保存するラッパーを作ることも可能
			return src, nil
		}
	}

	// 2. なければ新規にデバイス認証を要求
	fmt.Println("初回認証が必要です。画面の指示に従ってログインしてください:")
	tok, err := auth.RequestLiveToken()
	if err != nil {
		return nil, fmt.Errorf("認証失敗: %w", err)
	}

	// トークンをファイルへ保存
	data, _ := json.MarshalIndent(tok, "", "  ")
	_ = os.WriteFile(tokenPath, data, 0600)

	return auth.RefreshTokenSource(tok), nil
}

func main() {
	src, err := getTokenSource()
	if err != nil {
		log.Fatal(err)
	}

	dialer := minecraft.Dialer{
		TokenSource: src,
	}

	conn, err := dialer.Dial("raknet", "play.cubecraft.net:19132")
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	log.Printf("ログイン成功: %s", conn.IdentityData().DisplayName)
}

PlayFab と 最新プロトコル認証

近年の Bedrock Edition では、Xbox Live 単体だけでなく PlayFab の Multiplayer Token が求められます。gophertunnel は内部でこれらを自動解決するため、ユーザー側は TokenSource を渡すだけで安全に接続できます。

Released under the MIT License.