クライアントは、認証データをゲームAPIサーバから取得し、その認証データを与えたWSNet2Clientを用いて、WSNet2へアクセスします。 WSNet2は認証データを検証することで、ユーザIDが正規のものかを確認します。
認証データには数分程度の有効期限を設けておきます(設定ファイルのLobby.authdata_expireで指定)。 期限を過ぎたときには、ゲームAPIサーバから再度取得します。
WSNet2と次の情報を事前に共有しておきます。 どちらも適当な長さのASCII文字列です。
- AppID: アプリ識別子
- AppKey: 鍵情報
WSNet2は複数プロジェクトの相乗りが出来るように、AppIDでプロジェクトを特定します。 また、AppKeyはクライアントへは絶対に公開しないでください。
クライアントからの要求を受けたら、次のように認証データを生成します。
app_key = 事前交換した鍵(ASCIIバイト列)
client_id = クライアントのユーザID(UTF-8バイト列)
nonce = 適当な乱数(64bit, BigEndianのバイト列)
timestamp = 現在時刻(Unix秒, 64bit, BigEndianのバイト列)
hmac = HMAC_SHA256(app_key, client_id + nonce + timestamp)
auth_data = Base64(nonce + timestamp + hmac)
認証データ(auth_data)は48Byte(nonce:8byte; timestamp:8byte; hmac:32byte)のデータをBase64エンコードした文字列です。 この文字列をクライアントに返します。
ゲームAPIサーバから、認証データ(Base64エンコードした文字列)を受け取ります。 有効期限をクライアント側でも管理し、有効な間は使いまわすこともできます。
WSNet2(Lobby)へのアクセスは、WSNet2.WSNet2Client
クラスを利用します。
Unityの場合、WSNet2Service.Instance.GetClient()
の引数として認証データを渡します。
.NETの場合、WSNet2Client
のコンストラクタに認証データを渡します。
ゲームAPIサーバから新しい認証データを受取ったら、WSNet2Client.UpdateAuthData()
で上書きできます。
Unityの場合はWSNet2Service.Instance.GetClient()
で取得し直してもかまいません。
appId
とclientId
が同じクライアントが既にある場合、そのインスタンスの認証データを上書きして返します。
Roomへのwebsocket接続時にも同様の認証が行われますが、これはゲームAPIサーバから取得した認証データではなく、Room単位で有効なキーを利用します。 なので、入室や観戦が受理されて以降は、認証データの有効期限を気にしなくてもよいです。 Room用のキーの管理はWSNet2のC#実装側で行っているので、クライアント側で特に触れる必要はありません。
事前交換したAppKeyがあれば、認証情報をクライアント側でも生成できます。
これには、WSNet2.AuthDataGenerator
クラスを利用します。