14.5. MicroProfile JWT Authentication

14.5.1. 概要

MicroProfile JWT Authentication は、OpenID Provider から返却されたトークンの復号化等の変換を行う機能を提供します。


MicroProfile JWT Authentication の提供機能

14.5.2. 設定情報

MicroProfile JWT Authentication の設定項目は、[ リファレンス > 設定 > マイクロサービスアプリケーション > MicroProfile JWT Authentication ] を参照してください。

14.5.3. 提供機能

MicroProfile JWT Authentication は、次のアノテーションを提供します。各アノテーションの詳細は MicroProfile JWT Auth API 1.2 API を参照してください。

名称 説明 アノテーション名
LoginConfig 認証方法を指定します。 @LoginConfig
Claim JWT のクレームを指定します。 @Claim
14.5.3.1. LoginConfig

認証方法を指定します。また、web.xml の <login-config> でも同等の認証方法を指定することができます。
@LoginConfig と、web.xml の両方が指定されていた場合は、web.xml での指定が優先されます。

パラメータ 説明 既定値
authMethod 認証方法に "MP-JWT" を指定します。 無し
realmName レルム名を指定します。 ""
14.5.3.2. Claim

JWT のクレームを指定します。

パラメータ 説明 既定値
value クレーム名を指定します。 ""
standard org.eclipse.microprofile.jwt.Claims の列挙型で定義されている値を使って、クレーム名を指定します。
standard パラメータに指定可能な、主なクレームについては、下記を参照してください。 指定可能なすべてのクレームは、org.eclipse.microprofile.jwt.Claims を参照してください。
Claims.UNKNOWN

standard パラメータに指定できる主なクレーム
内容 備考
iss Issuer クレーム。JWT の発行者情報 RFC 7519, Section 4.1.1
sub Subject クレーム。JWT の主語となる主体の識別子 RFC 7519, Section 4.1.2
exp Expiration Time クレーム。JWT の有効期限 RFC 7519, Section 4.1.4
iat Issued At クレーム。JWT を発行した時刻 RFC 7519, Section 4.1.6
jti JWT ID クレーム。JWT のための一意な識別子 RFC 7519, Section 4.1.7
upn ユーザープリンシパル名 MicroProfile JWT Authentication のカスタムクレーム
groups グループ名 MicroProfile JWT Authentication のカスタムクレーム
raw_token Authentication ヘッダの元のトークン文字列 MicroProfile JWT Authentication のカスタムクレーム

14.5.4. JWT 認証方法の指定

14.5.4.1. アノテーションでの指定

アノテーションを使用した JWT 認証方法の記述例を下記に示します。

14.5.4.2. web.xml での指定

web.xml を使用した JWT 認証方法の記述例を下記に示します。

Memo
@LoginConfig と web.xml の両方が指定されていた場合は、web.xml での指定が優先されます。


14.5.5. クレームの情報取得

@Claim や org.eclipse.microprofile.jwt.JsonWebToken を用いて、受信した HTTP Authorization:Bearer ヘッダからクレームを取得します。

定義や、取得イメージは次の通りです。

@Inject
private JsonWebToken jwt;

// Raw types
@Inject
@Claim(standard = Claims.iat)
private Long issuedAt;
@Inject
@Claim("customerId")
private String customerId;

// ClaimValue wrappers
@Inject
@Claim(standard = Claims.groups)
private ClaimValue<Set<String>> groups;

public Customer getCustomerList(@PathParam("id") String id) {
            :
    String userName = jwt.getClaim("preferred_username");

    if (issuedAt > System.currentTimeMillis() ||
        (groups != null) && !groups.getValue().contains("admin") ||
        !id.equals(userName)) {
            :
        throw new WebApplicationException(403);
    }
            :
}

14.5.6. OpenIDサーバ 公開鍵の設定

JWTの暗号化と復号化で利用する、OpenIDサーバの公開鍵を設定します。mp.jwt.verify.publickey あるいは mp.jwt.verify.publickey.location プロパティでの指定と、アプリケーション内の META-INF/MP-JWT-SIGNER ファイルで指定する方法があります。

Memo
後述するサンプルプロジェクトでは、評価用の公開鍵を使用しています。
実際には、OpenIDサーバから取得した公開鍵をご利用ください。



14.5.7. OpenIDサーバ 発行者情報の設定

OpenIDサーバのセキュリティ発行者情報を設定します。mp.jwt.verify.issuer プロパティでの指定と、アプリケーション内の META-INF/MP-JWT-ISSUER ファイルで指定する方法があります。


14.5.8. サンプルの実行

ここでは、MicroProfile JWT のサンプルアプリケーションを実行する手順について、説明します。

(1) WebOTX Developer へのインポート
サンプルプロジェクトの zip ファイルを展開して、WebOTX Developer にインポートしてください。

(2) JWT 認証を利用する JAX-RS アプリケーションの作成
@LoginConfig アノテーションで、JWT 認証を指定したクラスを作成します。本クラスを含め、sample パッケージの全体は、上述のサンプルプロジェクトを確認してください。

(3) クライアントアプリケーションの作成
JAX-RS アプリケーションへのリクエストを送信するクライアントアプリケーションを作成します。

Memo
サンプルでは Token1.json に設定したトークン情報からJWTを自己生成し、HTTP Authorization:Bearer ヘッダに付与しています。
実際には OpenID サーバから取得した JWT をご利用ください。

(4) プロジェクトのビルド
WebOTX Developer のメニュー「プロジェクト」で「自動的にビルド」がチェックされていない場合は、「プロジェクトのビルド」を選択し、ビルドを行います。

(5) warファイルのエクスポート
プロジェクトを右クリックして、「エクスポート」−「WAR ファイル」を選択します。 「Destination」で出力先のパスを指定し、「終了」ボタンをクリックします。

(6) JAX-RS アプリケーションの配備
対象の環境に合わせて、アプリケーションを配備します。

コンテナ環境の場合は、[ 構築・運用 > コンテナ型仮想化 ] を参考に、本サンプルアプリケーションを含めたコンテナイメージを作成して、コンテナを起動してください。

コンテナ環境でない場合は、[ 配備 > アプリケーション配備 > 配備・再配備・置換 > 配備・再配備 ] を参考に、配備してください。
例) エージェントプロセス上に配備する場合

otxadmin> deploy Jaxrs20SampleJSON_with_JWT.war

(7) クライアントアプリケーションの実行
次の Java コマンドを実行してください。接続先ホスト名、HTTPポート番号は、環境に合わせて変更してください。

java -Dsun.net.http.allowRestrictedHeaders=true TestClient http://localhost:8080/Jaxrs20SampleJSON-with-JWT/name_list/0001

Java コマンド実行時、クラスパスには、次のものを設定してください。

  {サンプルプロジェクト展開ディレクトリ}/client/classes
  {サンプルプロジェクト展開ディレクトリ}/client/lib/microprofile-jwt-auth-tck-1.1.1.jar
  {サンプルプロジェクト展開ディレクトリ}/client/lib/nimbus-jose-jwt-4.23.jar
  {サンプルプロジェクト展開ディレクトリ}/client/lib/json-smart-1.3.1.jar
  ${AS_INSTALL}/lib/gf-client.jar
  ${AS_INSTALL}/modules/jakarta.ws.rs-api.jar
  ${AS_INSTALL}/modules/microprofile-jwt-auth-api.jar
  ${AS_INSTALL}/modules/jersey-client.jar
  ${AS_INSTALL}/modules/jersey-common.jar
  ${AS_INSTALL}/modules/jersey-hk2.jar

Memo
WebOTX Developer を使って実行する場合は、メニューの「実行」−「実行構成」で表示される画面で、 「Java アプリケーション」−「MicroProflie_JWT_Client」を選択して、「実行」ボタンクリックにより、実行してください。
なお、この場合の接続先ホスト名、ポート番号は、「実行構成」−「MicroProflie_JWT_Client」の「引数」タブの「プログラムの引数」にて変更可能です。

クライアントアプリケーションを実行すると、配備されたサンプルアプリケーションに、JWT トークンが設定されたリクエストが送信され、下記のレスポンスコンテンツが返却されます。

{"姓":"田中","名":"太郎"}