JSON Web トークン (JWT) 認証
JWT 認証の概要
JWT は、コンパクトで URL セーフな、認証、承認、または情報交換の手段です。認証の場合、サーバは既に認証されているクライアントに JWT を提供し、この JWT の期限が切れるまでは、これらのクライアントがサーバ上の保護されたリソースにアクセスするのに再度パスワードを提供しなくてもよいようにします。認証フローは以下の図のようになります。
![JWT クライアント・サーバ認証フロー](images/gauthn_jwt_overview_flow.png)
JWT 認証の構成
JWT 認証を使用するには、 クライアントがその整合性を検証できるよう、InterSystems IRIS に JWT を発行するための構成が必要です。
-
[システム管理]→[セキュリティ]→[システム・セキュリティ]→[認証/ウェブセッションオプション] ページには、以下の設定が含まれています。
-
[JWT 発行者フィールド] — クライアントに対する JWT の発行者を特定する JWT ペイロード内の iss クレームを定義します。
-
[JWT 署名アルゴリズム] — InterSystems IRIS が JWT の署名および検証に使用する 暗号化アルゴリズムを決定します。
-
[キーストアをリセット] — 暗号化キーをローテーションさせます。これにより、以前発行した期限の切れていないすべての JWT が無効になります。
-
必要な構成は、JWT の発行だけではありません。JWT を受け入れ、使用するには、これを受け取るクライアントを構成する必要があります。REST Web アプリケーションは、認証に JWT を使用できるクライアントの 1 つです。これらの設定については、"アプリケーションの作成および編集Opens in a new tab" ページを参照してください。
JWT 使用のサポート
InterSystems IRIS は、 REST API および OAuth 2.0 フレームワークでの認証のための JWT の使用をサポートしています。
REST API の使用
JWT 認証用に構成を行うと、REST API はディスパッチ・クラスの UrlMap に含めるべきではない 4 つのエンドポイントを取得します。
-
/login — HTTP 基本認証または要求本文内の有効な認証情報を使用してこのエンドポイントを呼び出すと、後続の要求で使用できるアクセス・トークンとリフレッシュ・トークンが返されます。
-
/logout — Group-By-ID を使用していない場合にこのエンドポイントを呼び出すと、提供されたアクセス・トークンと関連付けられたリフレッシュ・トークンが無効になります。Group-By-ID を使用している場合は、現在の By-ID グループを持つすべてのセッションが無効になります。
-
/refresh — このエンドポイントの呼び出しは、有効なリフレッシュ・トークンを使用して呼び出すと、新しいアクセス・トークンとリフレッシュ・トークンのペアが発行されます。これにより、以前のアクセス・トークンとリフレッシュ・トークンのペアは無効になります。
-
/revoke — Group-By-ID を使用していない場合、これは機能的に /logout と同じです。Group-By-ID を使用している場合は、現在のアクセス・トークンとリフレッシュ・トークンのペアのみが取り消されます。
ディスパッチ・クラスのエンドポイント名は、以下を使用してカスタマイズできます。
Parameter TokenLoginEndpoint = "mylogin";
Parameter TokenLogoutEndpoint = "mylogout";
Parameter TokenRevokeEndpoint = "myrevoke";
Parameter TokenRefreshEndpoint = "myrefresh";
JWT を使用した REST エンドポイントへのアクセス
/login エンドポイントにアクセスし、アクセス・トークンとリフレッシュ・トークンを取得するには、認証ヘッダは含めず、本文に JSON 形式で以下のように認証情報を含めて、HTTP POST 要求を作成します。
{"user": "YOUR USER", "password": "YOUR PASSWORD"}
認証情報が有効な場合、以下のような応答を受け取ります。
{ "access_token": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2ODI3MDc0MTcuNzQ5OTQyLCJleHAiOjE2ODI3MDc0NzcsImlzcyI6IkludGVyU3lzdGVtcyIsInN1YiI6Il9TWVNURU0iLCJzaWQiOiJkWTAxYlJUMGZhQlJybldnQnEyYUZpa1ciLCJhcHAiOiIvYXBpL3R0cmcvIn0.OSxtKf2F6p23wfHKBxnPXvj6cs3fXKWNqc1c0yJ_t0Zpy5cLvLBlRTlufMQIOoNPnQHOHzcN8VWPBzisMoOM-A", "refresh_token": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2ODI3MDc0MTcuNzQ5OTQyLCJleHAiOjE2ODI3MDgzMTcsImlzcyI6IkludGVyU3lzdGVtcyIsInNpZCI6ImRZMDFiUlQwZmFCUnJuV2dCcTJhRmlrVyIsImFwcCI6Ii9hcGkvdHRyZy8ifQ.-28BDQsQYtfTbMpCBxmYtbxiT4UNQSeKS7taKkzRk4tYZkE_5V_WMGffNMj-pU3NgtIku506CIcSuXIxGdEJ5Q", "sub": "YOUR USER", "iat": 1682707417.749942, "exp": 1682707477 }
/login アクセス・トークンを例として使用すると、別の REST API エンドポイントへの要求の Authorization ヘッダには、以下のような値が含まれます。
Bearer eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2ODI3MDc0MTcuNzQ5OTQyLCJleHAiOjE2ODI3MDc0NzcsImlzcyI6IkludGVyU3lzdGVtcyIsInN1YiI6Il9TWVNURU0iLCJzaWQiOiJkWTAxYlJUMGZhQlJybldnQnEyYUZpa1ciLCJhcHAiOiIvYXBpL3R0cmcvIn0.OSxtKf2F6p23wfHKBxnPXvj6cs3fXKWNqc1c0yJ_t0Zpy5cLvLBlRTlufMQIOoNPnQHOHzcN8VWPBzisMoOM-A
アクセス・トークンなしで、HTTP POST 要求を使用して、/refresh エンドポイントにアクセスします。代わりに、要求の本文で以下の JSON 形式のデータを送信します。
{ "refresh_token": "YOUR REFRESH TOKEN", "grant_type": "refresh_token" }
これにより、/login エンドポイントへのアクセスと同様に、新しいアクセス・トークンとリフレッシュ・トークンのペアが返されますが、ログアウトによってセッションが失われることはありません。
OAuth 2.0 および OpenID Connect の使用
InterSystems IRIS での OAuth 2.0 フレームワークを使用した JWT のサポートの詳細は、"OAuth 2.0 および OpenID Connect の使用法Opens in a new tab" を参照してください。