JWT 認証
JSON Web Token (JWT) は、JavaScript Object Notation (JSON) オブジェクトである 2 つの当事者間で情報を安全に送信するためのオープン標準です。JWT は主に認証と承認に使用されます。JWT は single sign-on (SSO) を有効にし、ユーザーがクラウド アプリケーションや Web サイトにログインする必要がある回数を最小限に抑えます。
JWT 構造
JWT は、それぞれピリオド (.) で区切られた 3 つの部分で構成されます。
-
ヘッダー: 使用される署名アルゴリズムなど、トークンに関するメタデータが含まれます。
-
ペイロード: クレームまたはデータが含まれます。
-
署名: トークンが改ざんされていないことを確認するための暗号署名。
JWT の形式は次のようになります。
header.payload.signature
例:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiam9obiIsImVtYWlsIjoiam9obi5kb2VAZXhhbXBsZS5jb20iLCJyb2xlcyI6WyJ1c2VyIiwiYWRtaW4iXX0.8G1cGV2RnxL08XLMOprldCVjGeuPbLfBlax2ySHwdfJ5cRzT3T3ZOk9mCmzyIW0ewEvjYskpz3g-sSZOz3fg0BBEl5pgyKZZc20t5u2jyb0Gr_yNkwEZcn3Tf4lwFYTIyRG9j4Q9F9YlhkttFyPT_hHLOg0xpkEkwq-IWmjggZkWwnUt9XaYg4K9d9Mb3vQ4oVOozdrI-L8Xw5OwdPrhL-jlbttg50bNofIZG7zOuwWNVq3vHbZ1Xr04QIBJSRVlTzDELRoUDGdHMGqdjw9z3c21W3Tnsjxg1rrdFc0wsf56vHR6Q4RQFPy4hM7cBd4HDlIYhVZPYwhLBdyZn8ceWmF99jSQbODyUbA6rjhwJ9zvZd4nk0aJZxQd0oNwFyKMmrlb7WGzKdtKz2Y88SCf79gdXyznVdq7IYtFwYwJ9cnF2Qd5tmYw
JWT ヘッダー
ヘッダーはトークンのタイプと署名アルゴリズムを定義します。通常、次の項目が含まれます。
-
typ: トークンが JWT であることを指定します。
-
alg: 署名アルゴリズム (例: RS256)。
ヘッダーの例:
{
"typ" header: "JWT",
"alg": "RS256"
}
サポートされている署名アルゴリズム
次の署名アルゴリズムがサポートされています。
-
RS256 - RSA シグネチャーと SHA256
-
RS384 - RSA シグネチャーと SHA384
-
RS512 - RSA シグネチャーと SHA512
これらのアルゴリズムは、JWT の署名および検証に使用され、トークンが改ざんされていないことを確認します。
JWT ペイロード
ペイロードは、ユーザーに関するクレームと関連するメタデータが含まれる JSON オブジェクトです。クレームには次のようなものが含まれます。
-
ユーザー情報 (例: ユーザー ID、名前、メール)
-
ユーザー ロールと権限
-
有効期限情報
ペイロードの例:
{
"userid": "jde",
"userdirectory": "qsefw",
"name": "John Doe",
"email": "jde@example.com",
"groups": ["Administrators", "Sales", "Marketing"],
"exp": 1635355629
}
JWT クレームの標準項目
JWT クレーム内では次の項目を使用できます。
- Issuer (iss): トークンの発行者を識別します。
- Subject (sub): トークンの件名を識別します。
- Audience (aud): トークンのオーディエンスを識別します。
- Expiration time (exp): トークンの有効期限を定義します。
- Not before (nbf): トークンの有効期間の開始日時を定義します。
- Issued at (iat): トークンが発行された日時を定義します。
- JWT ID (jti): トークンの一意な識別子です。
JWT 署名
署名によりトークンの整合性が保証され、送信者の ID が検証されます。ヘッダーとペイロードをエンコードし、秘密キーで署名することで作成されます。
JWT で認証するには、署名が検証されます。署名が有効な場合、Qlik Sense に対してアクセスが許可されます。
X.509 証明書は通常、署名の生成と検証に使用されます。QMC の仮想プロキシ設定では、証明書 (公開キーを含む) が署名を検証するように構成されています。
JWT に署名するための公開キー/秘密キーのペアの作成
JWT に署名するための公開キー/秘密キーのペアを生成するには、OpenSSL を使用できます。次のコマンドを実行します。
openssl genrsa -out privatekey.pem 4096
openssl req -new -x509 -key privatekey.pem -out publickey.cer -days 1825
-
秘密キーは JWT に署名するために使用されます。安全に保管してください。
-
公開キーは検証に使用されます。
JWT 認証の構成 (仮想プロキシの設定)
Qlik Sense Enterprise on Windows で仮想プロキシの JWT 認証を構成するには、次の手順に従います。
-
Qlik 管理コンソール (QMC) にログインします。
-
ブラウザを開き、https://<server_hostname>/qmc にアクセスします。
-
-
新しい仮想プロキシを作成します。
-
[システムの構成] > [仮想プロキシ] に移動します。
-
[Create new] (新規作成)をクリックします。
-
-
識別設定を構成します。
-
右側のメニューで [識別] を選択します。
仮想プロキシ識別設定。
-
一意の説明、プレフィックス、セッション クッキー ヘッダー名を入力します。
-
例: [説明] と [プレフィックス] に「jwt」と入力し、これをセッション クッキー ヘッダー名に追加します。
-
仮想プロキシはプレフィックスやセッション クッキーを共有できないため、Qlik Sense インスタンス内で 3 つの値すべてが一意であることを確認してください。
-
-
-
認証設定を構成します。
-
右側のメニューで [認証] を選択します。
仮想プロキシ認証設定。
-
次の値を設定します。
-
匿名アクセスモード: 匿名ユーザーなし
-
認証方法: JWT
-
-
追加の設定:
-
JWT 証明書: 公開キー ファイルの内容全体をコピーして貼り付けます。
-
UserID の JWT 属性: ユーザー ID を取得するために使用されるキー。
-
UserDirectory の JWT 属性: ユーザー ディレクトリを取得するために使用されるキー。
-
対象オーディエンス: JWT のオーディエンス (aud) と一致する必要があります。
-
情報メモJWT の属性を Qlik Sense 属性にマッピングすることが可能です。詳細については、「仮想プロキシの作成」を参照してください。
-
-
負荷分散の構成:
-
右側のメニューで [負荷分散] を選択します。
仮想プロキシの負荷分散設定。
-
負荷分散ノード (セントラル ノードなど) を選択します。
-
-
詳細設定の構成:
-
[詳細] をクリックします。
仮想プロキシの詳細設定。
-
[Secure 属性あり] をクリアし、 [SameSite 属性] を [属性なし] に設定します。
情報メモこのステップはテストのみを目的としています。本番環境で構成が安全であることを確認します。Secure 属性と SameSite 属性の詳細については、「仮想プロキシの編集」を参照してください。
-
-
ホスト許可リストを更新します。
-
[詳細設定] セクションで、 [ホスト許可リスト] を見つけます。
仮想プロキシ ホスト許可リスト設定。
-
ドメインまたは IP アドレス (マシン名ではなく) 経由で Qlik Sense サーバーにアクセスする場合は、それを許可リストに追加します。
-
例: IP アドレス経由で接続する場合は、その IP を許可リストに追加します。
-
-
-
変更を適用し、プロキシをリンクします。
-
[適用] をクリックします。
-
右側のメニューで [プロキシ] を選択します。
仮想プロキシに関連するプロキシ設定。
-
仮想プロキシを既存のプロキシ (中央プロキシなど) に関連付けるには、 [リンク] をクリックします。
-
JWT の生成と使用
JWT を生成するには、token.js スクリプトを作成します。このスクリプトは、jsonwebtoken ライブラリと秘密キーを使用してトークンを生成します。生成されたら、JWT をコピーし、API リクエストにベアラー トークンとして含めます。
token.js ファイルの構造
token.js ファイルは次を定義します。
-
ユーザーの詳細とクレームを含むペイロード。
-
アルゴリズム、有効期限、オーディエンスなどの署名オプション。
-
トークンに安全に署名するための秘密キー。
依存関係
jsonwebtoken および fs (ファイル システム) モジュールが必要になります。
const jsonWebToken = require('jsonwebtoken');
const fs = require('fs');
-
jsonwebtoken は JWT の作成に使用されます。
-
fs は、JWT に署名するための秘密鍵 (.pem ファイルとして保存) を読み取るために使用される組み込みの Node.js モジュールです。
秘密キーの読み取り
JWT に署名するには、秘密鍵 (.pem ファイル) へのパスを指定する必要があります。
const jwtEncryptionKey = fs.readFileSync('<path to the private key pem file>');
-
'<path to the private key pem file>' を秘密キーへの実際のファイル パスに置き換えます。
署名オプションの定義
署名オプションは、JWT の署名方法を定義します。ほとんどの場合、アルゴリズムとして RS256 を使用し、有効期限やオーディエンスなどの他のパラメーターを定義します。これらが IdP 構成と一致していることを確認してください。
署名オプションの例:
const signingOptions = {
algorithm: 'RS256', // The algorithm used to sign the token
expiresIn: '365d', // Token expires in 365 days
audience: 'example-audience', // The audience
};
ペイロードの作成
ペイロードには、JWT にエンコードされるクレームまたはユーザー データが含まれます。これには、userid、email、groups などのユーザー情報が含まれる場合があります。
ペイロードの例:
const payload = {
userid: 'jde', // Unique identifier for the user
userdirectory: 'qsefw', // Directory the user belongs to
name: 'John.Doe', // User's full name
email: 'jde@example.com', // User's email address
groups: ['Administrators', 'Sales', 'Marketing'], // User's roles/groups
};
JWT への署名
jsonwebtoken ライブラリを使用して、秘密キーと指定されたオプションでペイロードに署名し、JWT を作成します。
const token = jsonWebToken.sign(payload, jwtEncryptionKey, signingOptions);
console.log(token);
-
jsonWebToken.sign() は署名された JWT を生成し、それがコンソールに出力されます。
token.js コードの例
const jsonWebToken = require('jsonwebtoken');
const fs = require('fs');
// This is the private key to encrypt the JWT. This example uses certificates
// generated by the Qlik Sense Enterprise on Windows server.
// Replace with the actual path to your private key
const jwtEncryptionKey = fs.readFileSync('/path/to/your/private-key.pem');
// Signing options (ensure these match your IdP configuration)
const signingOptions = {
algorithm: 'RS256',
expiresIn: '365d',
audience: 'example-audience',
};
// Example payload with user information
const payload = {
userid: 'jde',
userdirectory: 'qsefw',
name: 'John.Doe',
email: 'jde@example.com',
groups: ['Administrators', 'Sales', 'Marketing'],
};
// Create the token
const token = jsonWebToken.sign(payload, jwtEncryptionKey, signingOptions);
// Output the signed JWT to the console
console.log(token);
JWT の生成
JWT を生成するには、次の token.js スクリプトを実行します。
-
ターミナルを開き、token.js があるディレクトリに移動します。
-
次のようにスクリプトを実行します。
node token.js
署名された JWT はコンソール ウィンドウに表示され、Qlik Sense Enterprise on Windows にアクセスするためのベアラー トークンとして使用できます。
JWT をベアラー トークンとして使用する
生成された JWT をベアラー トークンとして使用するには、ターミナルから JWT 出力をコピーし、それを HTTP リクエストの Authorization ヘッダーに含めます。
例:
## Bearer token
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyaWQiOiJoYXJyeSIsInVzZXJkaXJlY3RvcnkiOiJxc2VmdyIsIm5hbWUiOiJIYXJkY29yZSBIYXJyeSIsImVtYWlsIjoiaGFycnlAZXhhbXBsZS5jb20iLCJncm91cHMiOlsiQWRtaW5zdHJhdG9ycyIsIlNhbGVzIiwiTWFya2V0aW5nIl0sImlhdCI6MTYwMzgxOTYyOSwiZXhwIjoxNjM1MzU1NjI5LCJhdWQiOiIxMTJhZGFtcyJ9.gDWFqJ8fZbo9QpF52CnlhKCMsHal2AcobIVwhVCpnbLfpmc-Z_k4uUWGh2TxaSucjQ5-k5I9s9sNgIPskqaVQN2JanFXxIJKRFow9LbuSbImZs74RsQ6TqsoJTu7_5eKLv2VRAqoh6Tqabl5vma1JdhHbsTKGixt8yGZI7Q2QNjObQq8hAh6VveNWcUVkB60LEMOPiipij7VTKQ7IQg-rG4XA8xgYxbOb6i3Q6miY4kGSGujbsjtYLevEJQlEZtij2JMMDeH_nwH2MWhWhOBL1TpAAUKkCOxPFDjGacxGvkObAOFjL-Ztx0LdVwF2BXxVerQ1xKyl0YpLErS4d576Q
例: 署名された JWT で Qlik Sense にアクセスする
JWT が構成され、プロキシが設定されると、クライアントは署名された JWT を使用して認証できるようになります。プロセスは次のように機能します。
-
JWT が生成され、秘密キーで署名されます。
-
クライアントは、HTTP Authorization ヘッダーに JWT を含めてプロキシにリクエストを送信します。
-
プロキシは、設定された公開キーを使用して JWT 署名を検証します。
-
プロキシは Qlik Sense ヘッダーを挿入し、リクエストをバックエンド サービスに転送します。
-
クライアントはセッションを受信し、JWT なしでさらにリクエストを実行できます。
-
JWT 内のユーザーが現在のセッションに関連付けられているユーザーと異なる場合、そのユーザーに対して新しいセッションが作成されます。
-
無効な JWT が送信された場合、アクセスは拒否されます。
-
制限事項
-
暗号化された JWT はサポートされていません。
情報メモHTTPS を使用する場合、JWT を含むすべてのトラフィックは転送中に暗号化されます。
-
以下の署名アルゴリズムのみサポートしています。
-
RS256 - RSA シグネチャーと SHA256
-
RS384 - RSA シグネチャーと SHA384
-
RS512 - RSA シグネチャーと SHA512
-