This document is about: PUN 2
SWITCH TO

PUN Classic (v1)、PUN 2、Boltはメンテナンスモードとなっております。Unity2022についてはPUN 2でサポートいたしますが、新機能が追加されることはありません。お客様のPUNプロジェクトおよびBoltプロジェクトが停止することはなく、将来にわたってパフォーマンス性能が落ちることはありません。 今後の新しいプロジェクトについては、Photon FusionまたはQuantumへ切り替えていただくようよろしくお願いいたします。

このページは編集中です。更新が保留になっている可能性があります。

Photon JWT認証

概要

JWT (JSON Webトークン)は既存のカスタム認証とは異なります。 JWT認証を使用するには、クライアントは特別なトークンを渡さなければなりません。 Photon Serverは、外部のウェブサービスを呼び出す代わりに、トークンの確認のみをおこないます。 トークンは JWTを使用し、セキュリティ上の理由から暗号化されます。

ダッシュボードのセットアップ

認証プロバイダーとしてのJWTの追加は容易で、 Photonアプリケーションのダッシュボードから数分でおこなえます。 アプリケーションの「管理」ページを開き、「認証」セクションまでスクロールダウンしてください。 JWTに新たな認証プロバイダーを追加するか、または既存のものを編集した場合には、以下の設定が必須です:

  • secret1、必須の値 <KeyHash>;<KeyEncryption>;<KeySignature>。必ず「secret1」を設定してください。
  • secret2、任意の値 <KeyHash2>;<KeyEncryption2>;<KeySignature2>。 キーを変更する必要がある場合には、「secret2」を使用できます。 ダッシュボードでの変更がすべてのサーバーに到達するには若干の時間を要するため、古い値を「secret2」に、新しい値を「secret1」に入力することが可能です。 前もって、ダッシュボードの値を調整してください。

Secretの例

secret1: 00000000-0000-0000-0000-000000000001;00000000-0000-0000-0000-000000000002;00000000-0000-0000-0000-000000000003

また、以下が設定例となります:

  • Key Hash: 00000000-0000-0000-0000-000000000001
  • Key Encryption: 00000000-0000-0000-0000-000000000002
  • Key Signature: 00000000-0000-0000-0000-000000000003

注:簡潔にするためGUIDを使用しましたが、他の文字列を選択することもできます。

トークンの生成

トークン作成に使用できるライブラリは複数存在します(C#向けのSystem.IdentityModel.Tokens.Jwt)。 提供されているテストコンソールアプリケーションのソースで、C#暗号化の実装例を参照できます。

トークンのフォーマット: <base64UrlEncode(header)>.<base64UrlEncode(payload)>.<Signature>

ヘッダー

JSON

{
  "alg": "HS256",
  "typ": "JWT"
}

ペイロード

JSON

{
    // jwt
    "exp" : [timestamp],    // expires at
    "iat" : [timestamp],    // issued at (optional)
    "nbf" : [timestamp],    // not before (optional)
    // Photon
    "UserId" : [string:value, optional],
    "Nickname" : [string:value, optional],
    "AuthCookie" : [Dictionary<string, object>, optional]
}

署名

Unknown

MACSHA256(
          base64UrlEncode(header) + "." +
          base64UrlEncode(payload),
          [secret]
    )

JSON:

JSON

{
   "alg":"HS256",
   "typ":"JWT"
}
.
{
   "UserId":"Jason2000",
   "Nickname":"Jason",
   "nbf":1519314827,
   "exp":1519318427,
   "iat":1519314827
}

Signed + Encoded (with secret "00000000-0000-0000-0000-000000000003"):

text

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiJKYXNvbjIwMDAiLCJOaWNrbmFtZSI6Ikphc29uIiwibmJmIjoxNTE5MzE0ODI3LCJleHAiOjE1MTkzMTg0MjcsImlhdCI6MTUxOTMxNDgyN30.B2gs4_qEBbwXsjOvW8ZbORiBxLrcmsE96P77Kzyaf2c

トークンのテストはJWT debuggerでおこなえます。署名済みかつ暗号化されたトークンを「Encoded」フィールドにペーストしてください。 署名を確認するには、「secret」フィールドにシークレット00000000-0000-0000-0000-000000000003をペーストしてください。

暗号化

使用される暗号化の詳細:

  • フォーマット: [IV][encrypted data][HMAC]
  • 暗号化アルゴリズム: AES
  • IVサイズ: 16
  • パディング: PKCS7 (デフォルトでは System.Security.Cryptography向け)
  • ブロックサイズ: 16
  • HMACサイズ: 32
  • ハッシュアルゴリズム: SHA256
  • ハッシュおよび暗号化キー: ダッシュボード文字列の値はバイト配列(UTF-8エンコーディング)に変換され、SHA256にハッシュされます。

クライアントコード

クライアントは、生成されたJWTトークン文字列を暗号化され、かつURLエンコードされたBase64形式で送信する必要があります:

C#

PhotonNetwork.AuthValues = new AuthenticationValues();
authValues.AuthType = CustomAuthenticationType.Jwt; // 9
authValues.SetAuthPostData(jwtTokenString);
// do not set AuthValues.Token or authentication will fail
// connect
Back to top