Oracle® Fusion Middleware Oracle Security Developer Toolsによるセキュアなアプリケーションの開発 11gリリース1 (11.1.1) B61386-04 |
|
![]() 前 |
![]() 次 |
11gリリース1 (11.1.1)パッチ・セット5で導入されたOracle JSON Web Tokenでは、JSON Web Token (JWT)規格のサポートを提供します。
この章には次のトピックが含まれます:
この項では、JWTの概念およびOracle JSON Web Tokenの主要な機能について説明します。
JSON Web Token (JWT)は、二者の間で転送されるクレームを表す手段です。JWTは、HTTP認可ヘッダーやURI問合せパラメータなど、領域が制限された環境向けのコンパクトなトークン・フォーマットです。
JWTにあるクレームは、base64urlでエンコードされていて0個以上の名前と値(名前は文字列で値は任意のJSON値)のペア(またはメンバー)で構成される、JSONオブジェクトとしてエンコードされます。各メンバーは、JWTによって表されるクレームです。
JSONオブジェクトは、JSON Web Signature (JWS)を使用してデジタル署名され、オプションで、JSON Web Encryption (JWE)を使用して暗号化されます。
JWTは、次の3つのセグメントを連結したもので表されます。
JWTヘッダー・セグメントは、トークンに適用される暗号化操作を指定します。
JWTクレーム・セグメントは、JWTに含まれるクレームをエンコードします。
JWT暗号セグメントには、トークンのコンテンツを保護する暗号化マテリアルが含まれます。
各セグメントは、ピリオド('.')文字で区切られます。3つのすべてのセグメントは、常にBase64urlでエンコードされた値になります。
関連項目: JSON Web Token IETFのドラフト・ドキュメントは、http://tools.ietf.org/html/draft-jones-json-web-token-05 にあります。 |
Oracle JSON Web Tokenは、JWTトークンを幅広くサポートする完全なJavaソリューションです。次の機能があります。
Base64urlでエンコードされたトークンの構成、および、ユーザー定義のヘッダーなど、トークンのヘッダーとクレームのパラメータ値の設定
トークンの解析および検証
トークンの署名およびシリアライズ
oracle.security.jwt.JwtTokenクラスは、JSON Web Token (JWT)を表します。oracle.security.jwt.JwtTokenの代表的なメソッドは、次のとおりです。
setAlgorithm(String)、getAlgorithm()
signAndSerialize(PrivateKey)
serializeUnsigned()
setPrincipal(String)、getPrincipal()、getIssuer()などのクレーム・メソッド
詳細は、Javadocにある、ヘッダーとクレームのパラメータ名および対応するget/setメソッドの表を参照してください。
Oracleセキュリティ開発ツールは、Oracle WebLogic ServerとともにORACLE_HOME
にインストールされます。この項では、Oracle JSON Web Tokenの環境を設定する方法について説明します。次の項目について説明します。
Oracle JSON Web Tokenを使用するには、システムにJava Development Kit (JDK)バージョン1.6以上が必要です。
CLASSPATH
環境変数には、必要なjarファイルおよびclassファイルすべてのフルパスとファイル名を指定してください。次の項目をCLASSPATH
に指定します。
osdt_core.jar
ファイル
osdt_cert.jar
ファイル
jackson-core-1.1.1.jar
ファイル
jackson-mapper-1.1.1.jar
ファイル
実行時に、次の場所でJackson jarが検索されます。
存在する場合、jarはシステム・クラス・パスからロードされます。
jarがシステム・クラス・パスに存在しない場合、システム・プロパティJackson.library.path
を調べます。存在する場合、jarはJava SEクライアントとJava EEクライアントの両方の場所からロードされます。
システム・プロパティJackson.library.path
が設定されていないか、Jackson jarがそこに見つからない場合、事前定義済の場所$ORACLE_HOME/modules
(Java EE環境の場合)および現在のディレクトリ(Java SEクライアントの場合)から取得されます。
WindowsでCLASSPATH
を設定する手順を次に示します。
Windowsの「コントロール パネル」で「システム」を選択します。
「システムのプロパティ」ダイアログで「詳細設定」タブを選択します。
「環境変数」をクリックします。
ユーザー環境変数のセクションで「新規」をクリックし、CLASSPATH
環境変数をユーザー・プロファイルに追加します。CLASSPATH
環境変数がすでに存在している場合は、選択して「編集」をクリックします。
必要なjarファイルおよびclassファイルすべてのフルパスとファイル名をCLASSPATH
に追加します。
たとえば、CLASSPATH
は次のようになります。
%CLASSPATH%; %ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_core.jar; %ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_cert.jar;
「OK」をクリックします。
Oracle JSON Web Tokenは、oracle.security.restsec.jwt.JwtTokenクラスで構成されます。このクラスで提供される主要な機能は次のとおりです。
JWTトークンの構成
JWTトークンのパラメータ値の設定
トークンの署名
トークンの検証
トークンのシリアライズ
13.4項に、Oracle JSON Web Tokenの使用方法を示します。
この項では、Oracle JSON Web Tokenの使用例を説明します。
注意: これらは、Oracle JSON Web Tokenの使用方法を示す具体例です。ここで説明したメソッドの使用の詳細およびその他のオプションについては、JWT javadoc (13.5項)を参照してください。 |
JWTトークンを作成するには、コンストラクタ・メソッドJwtToken()を使用して、JwtTokenオブジェクトの作成を開始します。
JwtToken jwtToken = new JwtToken();
様々なsetterメソッドを使用して、JWTトークンのパラメータ値を設定できます。
ヘッダー・パラメータの設定
ヘッダー・パラメータalg
を設定する必要があります。setAlgorithm(String)メソッドを使用してこのパラメータを設定し、getAlgorithm()メソッドを使用してこのパラメータを取得します。デフォルトでは、alg
パラメータはnone
に設定されており、これはトークンに署名しないことを意味します。
setHeaderParameter(String, Object)
メソッドを使用して、JWTヘッダー・セグメント内のユーザー定義のヘッダー・パラメータを設定します。
クレーム・パラメータの設定
Oracle JSON Web Tokenでは、クレーム・パラメータexp、iat、iss、aud、prnを設定するためのメソッドが用意されています。すべてのクレーム・パラメータはオプションです。
setClaimParameter(String, Object)メソッドを使用して、JWTクレーム・セグメント内のユーザー定義のクレーム・パラメータを設定します。
JWTトークンの作成および署名を行うには、まず、次のように、JwtTokenクラスのインスタンスを作成します。
JwtToken jwtToken = new JwtToken(String);
次に、アルゴリズム、発行者、有効期限、その他のクレームなどのパラメータを次のように設定します。
jwtToken.setAlgorithm(JwtToken.SIGN_ALGORITHM.HS256.toString()); jwtToken.setType(JwtToken.JWT); jwtToken.setIssuer("my.company.com"); jwtToken.setPrincipal("john.doe");
最後に、次のように、秘密鍵を取得して、秘密鍵を使用したトークンに署名します。
PrivateKey privateKey ; String jwtString = jwtToken.signAndSerialize(privateKey);
次のコード例では、有効期限およびトークンの発行者を検証しています。
// Read the JWT token as a String from HTTP header String jwtStr = "eyJ.eyJp.dB"; JwtToken token = new JwtToken(jwtStr); // Validate the issued and expiry time stamp. if (token.getExpiryTime().after(new Date())) { ... ... } // Get the issuer from the token String issuer = token.getIssuer();
JWTトークンにデジタル署名する必要がない場合、次の例に示すように、署名なしでトークンをシリアライズできます。
JwtToken jwtToken = new JwtToken(); jwtToken.setType(JwtToken.JWT); jwtToken.setIssuer("my.example.com"); jwtToken.setPrincipal("john.doe"); String jwtString = jwtToken.serializeUnsigned();