GS2-Auth

GS2 SDK for Unity を利用して GS2 へのログインを実行します。

GS2 のあらゆるサービスを利用する前にはこの手続を踏む必要があります。

GS2 へのログイン手順は2種類存在します。

1つ目は GS2-Account のアカウント管理機能を利用する場合。

2つ目は独自のアカウントシステムを持っている場合です。

GS2-Account を利用したログイン

GS2-Account を利用する場合はシンプルに実装することが出来ます。

GS2-Account の説明で認証結果として得られた認証オブジェクトを利用してログインすることになります。

public class GameLogic : MonoBehaviour {

    private const string CLIENT_ID = "your client id";
    private const string CLIENT_SECRET = "your client secret";

    void Start () {
        StartCoroutine (Login ());
    }

    IEnumerator Login() {
        // GS2 Client を初期化
        Gs2.Client gs2 = new Gs2.Client (new Gs2.Profile ()
            .WithClientId (CLIENT_ID)
            .WithClientSecret (CLIENT_SECRET));

        // アカウントを新規登録
        // GS-Account に詳細説明が記述されています
        string GAME_NAME = "account-0001";
        string KEY_NAME = "account";
        Gs2.Account.Account account = null;
        yield return gs2.Account.Create (
            result => {
                if(result.Error != null) throw result.Error;
                account = result.Result;
            },
            GAME_NAME);

        // アカウント認証
        // GS2-Account に詳細説明が記述されています
        string authenticationToken = null;
        yield return gs2.Account.Authentication (
            result => {
                if(result.Error != null) throw result.Error;
                authenticationToken = result.Result;
            },
            GAME_NAME,
            KEY_NAME,
            account.UserId,
            account.Password);

        // GS2 にログイン(GS2-Accountの認証情報を利用)
        Gs2.GameSession session = null;
        yield return gs2.Auth.Login (
            result => {
                if(result.Error != null) throw result.Error;
                session = result.Result;
                // ログインに成功すると Gs2.GameSession インスタンスが取得できます
                // 以降 GS2 のサービスのクライアントを利用する際にはこのセッション情報が必要となります
                Debug.Log("Login success");
            },
            account.UserId,          // ログインに利用するユーザID
            KEY_NAME,                // GS2-Account より取得した認証情報の暗号鍵
            authenticationToken);    // GS2-Account より取得した認証情報
    }

    void Update () {

    }
}

KEY_NAME には GS2-Account の Authentication で指定した GS2-Key の暗号鍵名と同じものを指定し、

playerAuthToken に GS2-Account の Authentication で取得した認証オブジェクトを渡してください。

ここで得られる Gs2.GameSession が今後 GS2 のサービスを利用する際に必要となるログインセッションを表すインスタンスです。

独自のアカウントシステム を使ったログイン

この手順は Unity のアプリケーション上では行なえません。

サーバでログイン処理を実装してください。

メッセージを受信する あたりが参考になります。

Java でサーバが実装されているとすれば、以下のような手順でアクセストークンを取得してください。

Gs2AuthClient authclient = new Gs2AuthClient(credentials)
    .withRegion(region);
LoginResult result = authclient.login(request);
String accessToken = result.getToken();
Long expire = result.getExpire();

ここからは Unity 側の実装になります。

Gs2.Client はデフォルトでは GS2-Account と連携する設定になっていますので、

独自のアカウントサーバ経由でアクセストークンを取得するようにクライアントの設定を変更します。

Gs2.Client gs2 = new Gs2.Client (new Gs2.Profile ()
    .WithClientId (CLIENT_ID)
    .WithClientSecret (CLIENT_SECRET)
    .WithUseGs2Account(false)
    .WithGetAccessTokenEventHandler(new IndependentGetAccessTokenEventHandler()));

UseGs2Account を false にすることで、GS2-Account の利用をしないようにします。

続けて GetAccessTokenEventHandler に独自のアクセストークン取得ロジックを記述したイベントハンドラを渡します。

イベントハンドラは以下のような実装になります。

public class IndependentGetAccessTokenEventHandler : GetAccessTokenEventHandler
{
    public IEnumerator getAccessToken (UnityAction<AsyncResult<AccessToken>> callback, string userId)
    {
        // 何らかの処理によってサーバからアクセストークンに関する情報を取得する
        AccessToken accessToken = new AccessToken ();
        accessToken.UserId = userId;
        accessToken.Token = "";
        accessToken.Expire = 0L;
        callback.Invoke(new AsyncResult<AccessToken>(accessToken, null));
    }
}

独自のアカウントサーバを利用する場合に発行するログインコマンドは以下です。

private const string CLIENT_ID = "your client id";
private const string CLIENT_SECRET = "your client secret";

void Start () {
    StartCoroutine (Login ());
}

IEnumerator Login() {
    Gs2.Client gs2 = new Gs2.Client (new Gs2.Profile ()
        .WithClientId (CLIENT_ID)
        .WithClientSecret (CLIENT_SECRET)
        .WithUseGs2Account(false)
        .WithGetAccessTokenEventHandler(new IndependentGetAccessTokenEventHandler()));

    Gs2.GameSession session = null;
    yield return gs2.Auth.Login (
        result => {
            if(result.Error != null) throw result.Error;
            session = result.Result;
            Debug.Log("Login success");
        },
        userId);
}

Gs2.Client#Auth.Login を呼び出すと内部的に IndependentGetAccessTokenEventHandler の getAccessToken が呼び出されますので、

ここで、Java で実装されたサーバからアクセストークンを取得する処理を実行して、AccessToken オブジェクトを返却することで、 Gs2.GameSession を作成します。

ここで得られる Gs2.GameSession が今後 GS2 のサービスを利用する際に必要となるログインセッションを表すインスタンスです。