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