WSSAPI と汎用セキュリティー・トークン・ログイン・モジュールを使用したセキュリティー・トークンの送信

外部のセキュリティー・トークン・サービス (STS) に認証トークンを要求して、Java™ API for XML-Based Web Services (JAX-WS) プログラミング・モデルおよび Web Services Security API (WSS API) を使用して、そのトークンをメッセージ・レベルまたはトランスポート・レベルで保護された Web サービス要求メッセージで送信することができます。

始める前に

このタスクは、JAX-WS プログラミング・モデル、WSS API インターフェース、WebSphere® Web Services Security の汎用セキュリティー・トークン・ログイン・モジュール、SSL トランスポート保護、メッセージ・レベルの保護、および Web サービス設定の構成と管理のためのポリシー・セットの使用についての知識を前提としています。

このタスクについて

このタスクで使用される Web サービス・クライアント・アプリケーションは、ダウンロードで使用可能な JaxWSServicesSamples サンプル・アプリケーションに含まれているクライアント・コードの変更版です。 サンプルのコード例については「手順」セクションで説明します。 すぐに使用できる完全な Web サービス・クライアント・サンプルが提供されています。

以下の手順を 実行して、外部 STS に SAML Bearer 認証トークンを要求し、そのトークンを送信します。

手順

  1. Web サービス・プロバイダーを呼び出すために使用する Web サービス・クライアントを特定し、取得します。 このクライアントを使用して、認証トークンを要求し、 プログラムで WSS API を使用してそのトークンを SOAP 要求メッセージに挿入します。 この手順で使用される Web サービス・クライアントは、JaxWSServicesSamples Web サービス・サンプル・アプリケーションに含まれるクライアント・コードの変更版です。

    以下のステップを実行して、サンプル Web サービス・クライアントを取得して変更し、 プログラムでセキュリティー・トークンを SOAP 要求メッセージに入れて渡すために使用する Web Services Security API を追加します。

    1. JaxWSServicesSamples サンプル・アプリケーションをダウンロードします。 JaxWSServicesSamples サンプルは、デフォルトではインストールされません。
    2. JaxWSServicesSamples クライアント・コードを取得します。 例を示すため、この手順では、JaxWSServicesSamples サンプルに含まれている Echo シン・クライアント・サンプルの変更版を使用します。Web サービス Echo シン・クライアント・サンプル・ファイル SampleClient.java は、src¥SampleClientSei¥src¥com¥ibm¥was¥wssample¥sei¥cli ディレクトリーにあります。 サンプル・クラス・ファイルは、WSSampleClientSei.jar ファイルに含まれています。

      JaxWSServicesSamples.ear エンタープライズ・アプリケーションおよびそれをサポートする Java アーカイブ (JAR) ファイルは、JaxWSServicesSamples サンプル・アプリケーション内の installableApps ディレクトリーにあります。

    3. アプリケーション・サーバーに JaxWSServicesSamples.ear ファイルをデプロイします。 JaxWSServicesSamples.ear ファイルをデプロイしたら、サンプル Web サービス・クライアント・コードを、サンプル・アプリケーションに対してテストする準備ができたことになります。

      Web サービス・クライアント・サンプルの、メッセージを保護するためのポリシー・セットを使用する代わりに、ご使用の Web サービス・クライアント・アプリケーションで WSS API を使用して、プログラムで認証トークンを SOAP 要求メッセージに渡すためのコード・スニペットを追加することもできます。この手順中の例では JAX-WS Web サービス・シン・クライアントが使用されていますが、管理対象クライアントを使用することもできます。

    4. SAML11 Bearer WSHTTPS default ポリシー・セットを Web サービス・プロバイダーに関連付けます。 このポリシー・セットは、 HTTPS トランスポートを使用してメッセージを保護するために使用されます。SAML11 Bearer WSHTTPS default ポリシー・セットを Web サービス・プロバイダーに関連付ける方法について詳しくは、『SAML bearer トークン用のクライアントおよびプロバイダーのバインディングの構成』を参照してください。
    5. SAML Bearer Provider sample default 汎用バインディングをサンプル Web サービス・プロバイダーに割り当てます。 SAML Bearer Provider sample default 汎用バインディングを Web サービス・アプリケーションに割り当てる方法について詳しくは、『SAML bearer トークン用のクライアントおよびプロバイダーのバインディングの構成』を参照してください。
    6. trustStoreType、trustStorePassword、trustStorePath の各カスタム・プロパティーが、 STS 署名者証明書が含まれるトラストストアに対応していることを確認します。 管理コンソールを使用して、以下のステップを実行します。
      1. 「サービス」 > 「ポリシー・セット」 > 「一般プロバイダー・ポリシー・セット・バインディング」 > 「SAML Bearer Provider sample」 > 「WS-Security」 > 「認証および保護」とクリックします。
      2. 認証トークンの表で「con_saml11token」を クリックします。
      3. コールバック・ハンドラー」をクリックします。
      4. 「カスタム・プロパティー」セクションで、trustStoreType、trustStorePassword、trustStorePath の各カスタム・プロパティーが、STS 署名者証明書が含まれるトラストストアに対応していることを確認します。
  2. SSL トランスポート・レベル保護を使用して Web サービス要求または WS-Trust 要求を保護している場合は、 以下の Java 仮想マシン (JVM) プロパティーを使用して、 SSL 構成をセットアップします。
    -Dcom.ibm.SSL.ConfigURL=file:<profile_root>¥properties¥ssl.client.props
    あるいは、サンプル・クライアント・コードに Java システム・プロパティーを使用して、SSL 構成ファイルを定義することもできます。
    System.setProperty("com.ibm.SSL.ConfigURL", "file:profile_root/properties/ssl.client.props");
  3. JAX-WS シン・クライアントの JAR ファイルをクラスパス app_server_root/runtimes/com.ibm.jaxws.thinclient_8.5.0.jar に追加します。 この JAR ファイルをクラスパスに追加することについて詳しくは、『Web サービス対応クライアントのテスト』を参照してください。
  4. 外部 STS から認証トークンを要求します。 以下のコード・スニペットは、WebSphere 汎用セキュリティー・トークン・ログイン・モジュールで使用する認証トークンを要求する方法を示しています。 この例では、外部 STS が、認証トークンとして UsernameToken を受け取って、SAML 1.1 トークンを発行するように構成されていることを前提としています。
    //Request SecurityToken from external STS:
    WSSFactory factory = WSSFactory.getInstance();
    //STS URL that issues the requested token
    String STS_URI  = "https://externalstsserverurl:port/TrustServerWST13/services/RequestSecurityToken";
    //Web services endpoint that receives the issued token
    String ENDPOINT_URL = "http://localhost:9080/WSSampleSei/EchoService";
    
    //Begin sample code 1 (Using WS-Trust Issue to request the token from 
    //the STS in which authentication token is send over WS-Security head):
    HashMap<Object, Object> cbackMap1 = new HashMap<Object, Object>();
    cbackMap1.put(IssuedTokenConfigConstants.STS_ADDRESS, STS_URI);
    cbackMap1.put(IssuedTokenConfigConstants.APPLIES_TO, ENDPOINT_URL);
    //The following property specifies that the ws-trust request should be 
    //compliance with WS-Trust 1.3 spec
    cbackMap1.put(IssuedTokenConfigConstants.TRUST_CLIENT_WSTRUST_NAMESPACE, 
    "http://docs.oasis-open.org/ws-sx/ws-trust/200512");
    cbackMap1.put(IssuedTokenConfigConstants.TRUST_CLIENT_COLLECTION_REQUEST, "false");
    //This request is made with WS-TRust Issue only (without the use of 
    //WS-Trust Validate)
    cbackMap1.put(IssuedTokenConfigConstants.USE_RUN_AS_SUBJECT, "false");
    
    GenericIssuedTokenGenerateCallbackHandler cbHandler1 = 
    new GenericIssuedTokenGenerateCallbackHandler (cbackMap1);
    
    //Create the context object for WS-Trust request:
    WSSGenerationContext gencont1 = factory.newWSSGenerationContext();
    WSSConsumingContext concont1 = factory.newWSSConsumingContext(); 
    // Use UNT for trust request authentication
    UNTGenerateCallbackHandler utCallbackHandler = new UNTGenerateCallbackHandler("testuser", "testuserpwd");
    SecurityToken ut = factory.newSecurityToken(UsernameToken.class, utCallbackHandler);
    gencont1.add(ut);
    cbHandler1.setWSSConsumingContextForTrustClient(concont1);
    cbHandler1.setWSSGenerationContextForTrustClient(gencont1);
    //End of sample code 1.
    
    //Begin sample code 2 (using WS-Trust Validate to request a token by 
    //exchanging a token in RunAs Subject).
    //If web service client has RunAs Subject , for example an 
    //authenticated intermediate server acts as a client to invoke the 
    //downstream service, you can program the client to use the token from 
    //the RunAs subject to exchange with the STS by using WS-Trust validate. 
    //To do so, you replace sample code 1 with the following:
    HashMap<Object, Object> cbackMap1 = new HashMap<Object, Object>();
    cbackMap1.put(IssuedTokenConfigConstants.STS_ADDRESS, STS_URI);
    cbackMap1.put(IssuedTokenConfigConstants.APPLIES_TO, ENDPOINT_URL);
    //This request is made with WS-Trust 1.3
    cbackMap1.put(IssuedTokenConfigConstants.TRUST_CLIENT_WSTRUST_NAMESPACE, 
    "http://docs.oasis-open.org/ws-sx/ws-trust/200512");
    cbackMap1.put(IssuedTokenConfigConstants.TRUST_CLIENT_COLLECTION_REQUEST, "false");
    
    //add the next line if you do not want to fallback to WS-Trust Issue if 
    //token exchange fails.
    cbackMap1.put(IssuedTokenConfigConstants.USE_RUN_AS_SUBJECT_ONLY, "true");
    
    //add the next line to specify the token type in the RunAs subject that 
    //will be used to exchange the requested token. For example, you use 
    //the LTPA token to exchange for a SAML token. If the exchanged token 
    //in the RunAs subject has the same value type as the requested token, 
    //setting IssuedTokenConfigConstants.USE_TOKEN is not required.
    cbackMap1.put(IssuedTokenConfigConstants.USE_TOKEN, LTPAToken.ValueType); 
    
    GenericIssuedTokenGenerateCallbackHandler cbHandler1 = 
        new GenericIssuedTokenGenerateCallbackHandler (cbackMap1);
    //The following codes are added if Authentication token in ws-security 
    //head or Message level security protection is required. If there is no 
    //Message level protection or additional authentication token for
    //WS-Trust Validate, do not create the context object shown below.
    //Context object for WS-Trust request:
    WSSGenerationContext gencont1 = factory.newWSSGenerationContext();
    WSSConsumingContext concont1 = factory.newWSSConsumingContext(); 
    // Use UNT for trust request authentication
    UNTGenerateCallbackHandler utCallbackHandler = new UNTGenerateCallbackHandler("testuser", "testuserpwd");
    SecurityToken ut = factory.newSecurityToken(UsernameToken.class, utCallbackHandler);
    gencont1.add(ut);
    cbHandler1.setWSSConsumingContextForTrustClient(concont1);
    cbHandler1.setWSSGenerationContextForTrustClient(gencont1);
    
    //End of sample code 2.
    
    GenericSecurityToken token = (GenericSecurityToken) factory.newSecurityToken 
    (GenericSecurityToken.class, cbHandler1, "system.wss.generate.issuedToken");
    
    //The following step to set the ValueType is required..
    //The parameter is always the QName of the requested token's valueType.
    //QName for SAML1.1:
    QName Saml11ValueType = new QName(WSSConstants.SAML.SAML11_VALUE_TYPE);
                token.setValueType(Saml11ValueType);
    
    //Includes QName definitions for  SAML11, SAML20, TAM 
    //token, and Pass ticket token. 
    //QName for SAML 2.0:
    QName Saml20ValueType = new QName(WSSConstants.SAML.SAML20_VALUE_TYPE);
    token.setValueType(Saml11ValueType);
    //QName for TAM token:
    QName TamValueType = new QName("http://ibm.com/2004/01/itfim/ivcred");
    //QName for PassTicket token:
    QName PassTicketValueType = new QName("http://docs.oasis-open.org/wss/
    2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken");
    
    //You can use the Token interface to get the token ValueType QName for 
    //all other tokens. For example, a Username Token's QName is //UsernameToken.ValueType.

    GenericIssuedTokenGenerateCallbackHandler オブジェクトには、 要求するセキュリティー・トークンの特性を定義するパラメーターと、 STS に到達してセキュリティー・トークンを取得するために必要なその他のパラメーターが含まれます。GenericIssuedTokenGenerateCallbackHandler オブジェクトは、 次の表に示す構成パラメーターを指定します。

    表 1. GenericIssuedTokenGenerateCallbackHandler プロパティー. この表は、GenericIssuedTokenGenerateCallbackHandler オブジェクトの構成パラメーターを示しており、プロパティーが必要かどうかを指定します。
    プロパティー 説明 必須
    IssuedTokenConfigConstants.STS_ADDRESS STS の http アドレスを指定します。

    STS への通信が SSL で保護される場合は、 -Dcom.ibm.SSL.ConfigURL プロパティーを設定する必要があります。STS への SSL 接続は、https:// アドレス接頭部で示されます。

    はい
    IssuedTokenConfigConstants.APPLIES_TO トークンを使用するためのターゲット・サービス・アドレスを指定します。 いいえ
    IssuedTokenConfigConstants.TRUST_CLIENT_COLLECTION_REQUEST STS から要求するトークンが、 RequestSecurityToken (RST) エレメントに含まれる単一のトークンであるか、 または単一の RequestSecurityTokenCollection (RSTC) エレメントに含まれる RST エレメントの コレクション内の複数のトークンであるかを指定します。

    デフォルトの動作では、 RequestSecurityToken (RST) エレメントに含まれる単一のトークンを STS から要求します。

    このプロパティーに値 true を指定すると、単一の RequestSecurityTokenCollection (RSTC) エレメントに含まれる RST エレメントのコレクション内の複数のトークンを STS から要求することを示します。

    デフォルト値は false です。

    いいえ
    IssuedTokenConfigConstants.TRUST_CLIENT_WSTRUST_NAMESPACE WS-Trust 要求に組み込まれる WS-Trust 名前空間を指定します。

    デフォルト値は WSTrust 1.3 です。

    いいえ
    IssuedTokenConfigConstants.USE_RUN_AS_SUBJECT WS-Security が RunAs サブジェクトからのトークンを使用し、WS-Trust Validate を使用して、最初に要求したトークンを交換するかどうかを指定します。false に設定すると、WS-Security は、 WS-Trust Issue を使用してトークンを要求します。

    デフォルト値は true です。

    いいえ
    IssuedTokenConfigConstants.USE_RUN_AS_SUBJECT_ONLY トークンの交換が失敗した場合に、要求されたトークンに対して WS-Security が WS-Trust Issue を使用しないようにするかどうかを指定します。

    デフォルト値は false です。

    いいえ
    IssuedTokenConfigConstants.USE_TOKEN この値を使用して、要求されたトークンを交換するためのトークンを RunAs サブジェクトから選択します。

    デフォルト値は、要求されたトークンの ValueType です。

    いいえ

    WSSGenerationContext インスタンスおよび WSSConsumingContext インスタンスも GenericIssuedTokenGenerateCallbackHandler オブジェクトに設定されています。 この例で、WSSGenerationContext インスタンスには、STS に送信したい UsernameToken を作成するための情報が指定された UNTGenerateCallbackHandler オブジェクトが含まれています。

    system.wss.generate.issuedToken パラメーターは、汎用セキュリティー・トークンの作成に使用される Java Authentication and Authorization Service (JAAS) ログイン・モジュールを指定します。次の例のように、必要な JAAS ログイン構成を含んでいる JAAS 構成ファイルを定義するため、JVM プロパティー を指定する必要があります。
    -Djava.security.auth.login.config=profile_root/properties/wsjaas_client.conf
    あるいは、サンプル・クライアント・コードに Java システム・プロパティーを設定することによって JAAS ログイン構成ファイルを指定することもできます。例えば、以下のようになります。
    			System.setProperty("java.security.auth.login.config", "profile_root/properties/wsjaas_client.conf ");
  5. STS から要求された認証トークンを、Web サービス要求メッセージの SOAP セキュリティー・ヘッダーに追加します。
    1. Web サービス・クライアントを初期化し、SOAPAction プロパティーを構成します。 以下のコードは、これらのアクションを示しています。
      // Initialize web service client
      EchoService12PortProxy echo = new EchoService12PortProxy();
      echo._getDescriptor().setEndpoint(endpointURL);
      
      // Configure SOAPAction properties
      BindingProvider bp = (BindingProvider) (echo._getDescriptor().getProxy());
      Map<String, Object> requestContext = bp.getRequestContext();
      requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);
      requestContext.put(BindingProvider.SOAPACTION_USE_PROPERTY,	Boolean.TRUE);
      requestContext.put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoOperation");
      
      // Initialize WSSGenerationContext
      WSSGenerationContext gencont = factory.newWSSGenerationContext();
      gencont.add(token);
    2. WSSGenerationContext オブジェクトを初期化します。 以下のコードは、WSSFactory.newWSSGenerationContext メソッドを 使用して WSSGenerationContext オブジェクトを取得する方法を示しています。WSSGenerationContext オブジェクトは、 トークンを Web サービス要求メッセージに挿入する際に使用されます。
      // Initialize WSSGenerationContext
      WSSGenerationContext gencont = factory.newWSSGenerationContext();
      gencont.add(token);
      WSSGenerationContext.add メソッドは、 クライアント・コードが次の Java 2 セキュリティー権限を持っていることを必要とします。
      permission javax.security.auth.AuthPermission "modifyPrivateCredentials"
  6. メッセージ保護用の X.509 トークンを追加します (Web サービスが SSL トランスポート・レベル保護のみで 保護されている場合は、このステップをスキップしてください)。 以下のサンプル・コードは、dsig-sender.ks 鍵ファイル と SOAPRequester サンプル鍵を使用します。実稼働環境では、このサンプル鍵を使用しないでください。 以下のコードは、メッセージ保護用の X.509 トークンの追加を示しています。
    //Add an X.509 Token for message protection
    X509GenerateCallbackHandler x509callbackHandler = new X509GenerateCallbackHandler(
        null,
        "profile_root/etc/ws-security/samples/dsig-sender.ks", 
        "JKS",
        "client".toCharArray(),
        "soaprequester",
        "client".toCharArray(),
        "CN=SOAPRequester, OU=TRL, O=IBM, ST=Kanagawa, C=JP", null);
    
    SecurityToken x509 = factory.newSecurityToken(X509Token.class,
    x509callbackHandler, "system.wss.generate.x509");
    
    WSSSignature sig = factory.newWSSSignature(x509);
    sig.setSignatureMethod(WSSSignature.RSA_SHA1);
    
    WSSSignPart sigPart = factory.newWSSSignPart();
    sigPart.setSignPart(token);
    	  sigPart.addTransform(WSSSignPart.TRANSFORM_STRT10);
    sig.addSignPart(sigPart);
    sig.addSignPart(WSSSignature.BODY);
    1. X.509 トークンを使用する WSSSignature オブジェクトを作成します。 以下のコード行は、X.509 トークンを使用する WSSSignature オブジェクトを作成します。
      WSSSignature sig = factory.newWSSSignature(x509);
    2. メッセージ保護のために使用する署名済みパーツを追加します。 以下のコード行は、署名済みパーツとして WSSSignature.BODY を追加することを指定しています。
      sig.addSignPart(WSSSignature.BODY);
    3. SOAP セキュリティー・ヘッダーに Timestamp エレメントを追加します。 SAML20 SenderVouches WSHTTPS ポリシー・セットおよび SAML11 SenderVouches WSHTTPS ポリシー・セットは、Web サービス要求および応答の SOAP セキュリティー・ヘッダー内に Timestamp タイム・スタンプ・エレメントが含まれていることを必要とします。以下のコードでは、WSSFactory.newWSSTimestamp() メソッドが Timestamp エレメントを生成し、 WSSGenerationContext.add(timestamp) メソッドが Timestamp エレメントを要求メッセージに追加します。
      // Add Timestamp element
      WSSTimestamp timestamp = factory.newWSSTimestamp();
          gencont.add(timestamp);
      sig.addSignPart(WSSSignature.TIMESTAMP);
      
      gencont.add(sig);
      
      	  WSSConsumingContext concont = factory.newWSSConsumingContext();
    4. トークンの署名を必要としない場合は、このステップをスキップしてください。要求されるセキュリティー・トークン が STR Dereference Transform 参照オプションによる署名を必要とする場合はステップ 1 に 進んでください。それ以外の場合は、ステップ 2 に進んでください。 STR Dereference Transform 参照オプションは、一般に STR-Transform と呼ばれています。

      ステップ 1: SAML トークンなどの一部のトークンは、直接デジタル署名することができません。 STR-Transform を使用してトークンに署名する必要があります。 STR-Transform を使用してトークンに署名するには、 トークンが、<wsse:Security> ヘッダー・ブロック内の <wsse:SecurityTokenReference> エレメントによって参照される必要があります。 STR-Transform を使用してセキュリティー・トークンに署名する場合は、 別途 WSSSignPart を作成し、WSSSignPart.TRANSFORM_STRT10 属性で 表される変換アルゴリズムを使用して SecurityTokenReference を指定します。 この属性により、WS-Security ランタイム環境で、トークンを参照するための SecurityTokenReference エレメントを生成すること、および STR Dereference 参照オプションを使用してトークンにデジタル署名することが可能になります。以下のコードは、WSSSignPart.TRANSFORM_STRT10 属性の使用例を示しています。

      WSSSignPart sigPart = factory.newWSSSignPart();
      sigPart.setSignPart(token);
      	  sigPart.addTransform(WSSSignPart.TRANSFORM_STRT10);
      ステップ 2: 要求されたトークンが SAML トークンでない場合、または STR-Transform が 使用されていない場合は、以下のコードを使用してください。
      sig.addSignPart(token);
    5. WSSGenerationContext オブジェクトを Web サービス RequestContext オブジェクトに関連付けます。 この時点で、WSSGenerationContext オブジェクトには、 要求メッセージをフォーマットするために必要なすべてのセキュリティー情報が含まれています。 WSSGenerationContext.process(requestContext) メソッドは、 WSSGenerationContext オブジェクトを Web サービス RequestContext オブジェクトに関連付けて、WS-Security ランタイム環境で、必要な SOAP セキュリティー・ヘッダーをフォーマットできるようにします。例えば、以下のようにします。
      // Attaches the WSSGenerationContext object to the web service RequestContext object. 
      gencont.process(requestContext);
  7. プロバイダー・ポリシーで応答メッセージのデジタル署名が要求される場合は、 X.509 トークンを使用して、デジタル署名の検証、および応答メッセージの整合性の検証を行います。 SSL トランスポート・レベル保護を使用している場合は、 このステップをスキップしてください。
    1. 応答メッセージ内のデジタル署名を検証するために、 トラストストアと、証明書パス・オブジェクトの List を使用して X509ConsumeCallbackHandler オブジェクトを初期化します。 以下のコードは、dsig-receiver.ks トラストストアと、 certList という証明書パス・オブジェクトを使用して X509ConsumeCallbackHandler オブジェクトを初期化しています。
      ArrayList certList = new ArrayList();
      java.security.cert.CertStore certStore = java.security.cert.CertStore.getDefaultType();
      certList.add(certStore);
      
      X509ConsumeCallbackHandler callbackHandlerVer = new
          X509ConsumeCallbackHandler("profile_root/etc/ws-security/samples/dsig-receiver.ks",
          "JKS",
          "server".toCharArray(),
          certList,
          java.security.Security.getProvider("IBMCertPath"));
    2. WS-Security ランタイム環境でデジタル署名を検証するために、 WSSVerification オブジェクトを作成し、 メッセージ本体を検証オブジェクトに追加します。 以下のコードを使用して、WSSVerification オブジェクトを初期化します。
      WSSVerification ver = factory.newWSSVerification(X509Token.class, callbackHandlerVer);
      この時点で、WSSConsumingContext オブジェクトには、 要求メッセージをフォーマットするために必要なすべてのセキュリティー情報が含まれています。 WSSConsumingContext.process(requestContext) メソッドにより、 WSSConsumingContext オブジェクトを応答メソッドに関連付けます。 例えば、以下のようにします。
      // Attaches the WSSConsumingContext object to the web service RequestContext object.
      concont.process(requestContext);

タスクの結果

外部 STS からセキュリティー・トークンを要求しました。トークンの取得後に、JAX-WS プログラミング・モデルおよび WSS API を使用して、メッセージ・レベルで保護された Web サービス要求メッセージでトークンを送信しました。

以下のコード例は、外部 STS に SAML Bearer トークンを要求し、 その SAML トークンを Web サービス要求メッセージで送信する方法を示す Web サービス・クライアント・アプリケーションの例です。SAML トークンは必要だが、アプリケーションで Web サービス・メッセージを使用して SAML トークンを渡す必要はない場合は、以下のサンプル・コードの前半部分のみ (// Initialize Web service client セクションまで) を使用してください。
package com.ibm.was.wssample.sei.cli;
import com.ibm.was.wssample.sei.echo.EchoService12PortProxy;
import com.ibm.was.wssample.sei.echo.EchoStringInput;
import com.ibm.websphere.wssecurity.wssapi.WSSConsumingContext;
import com.ibm.websphere.wssecurity.wssapi.WSSFactory;
import com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext;
import com.ibm.websphere.wssecurity.wssapi.WSSTimestamp;
import com.ibm.websphere.wssecurity.wssapi.token.SecurityToken;
import com.ibm.websphere.wssecurity.wssapi.token.UsernameToken;
import com.ibm.websphere.wssecurity.callbackhandler.UNTGenerateCallbackHandler;
import com.ibm.wsspi.wssecurity.core.token.config.WSSConstants;
import com.ibm.wsspi.wssecurity.core.config.IssuedTokenConfigConstants;
import com.ibm.websphere.wssecurity.callbackhandler.GenericIssuedTokenGenerateCallbackHandler;
import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityToken;
import javax.xml.namespace.QName;
import java.util.HashMap;
import java.util.Map;

import javax.xml.ws.BindingProvider;

public class SampleSamlSVClient {
    private String urlHost = "yourhost";
    private String urlPort = "9444";
    	private static final String CONTEXT_BASE = "/WSSampleSei/";
    	private static final String ECHO_CONTEXT12 = CONTEXT_BASE+"EchoService12";	
    	private String message = "HELLO";
    	private String uriString = "https://" + urlHost + ":" + urlPort;
    	private String endpointURL = uriString + ECHO_CONTEXT12;
    	private String input = message;

    /**
     	 * main()
     * 
     	 * see printusage() for command-line arguments
     * 
     * @param args
     */
    public static void main(String[] args) {
        		SampleSamlSVClient sample = new SampleSamlSVClient();
        		sample.CallService();
    }

    /**
     	 * CallService Parms were already read. Now call the service proxy classes
     * 
     */
    	void CallService() {
        		String response = "ERROR!:";
        try {
            System.setProperty("java.security.auth.login.config", 
                "file:/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/properties/wsjaas_client.conf ");
            System.setProperty("com.ibm.SSL.ConfigURL", 
                "file:/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/properties/ssl.client.props");

            //Request the SAML Token from external STS
            WSSFactory factory = WSSFactory.getInstance();
            String STS_URI = "https://yourhost:9443/TrustServerWST13/services/RequestSecurityToken";
            String ENDPOINT_URL = "http://localhost:9081/WSSampleSei/EchoService12";

            HashMap<Object, Object> cbackMap1 = new HashMap<Object, Object>();
            cbackMap1.put(IssuedTokenConfigConstants.STS_ADDRESS, STS_URI);
            cbackMap1.put(IssuedTokenConfigConstants.APPLIES_TO, ENDPOINT_URL);
            cbackMap1.put(IssuedTokenConfigConstants.TRUST_CLIENT_WSTRUST_NAMESPACE, 
                "http://docs.oasis-open.org/ws-sx/ws-trust/200512");
            cbackMap1.put(IssuedTokenConfigConstants.TRUST_CLIENT_COLLECTION_REQUEST, "false");
            cbackMap1.put(IssuedTokenConfigConstants.USE_RUN_AS_SUBJECT, "false");

            GenericIssuedTokenGenerateCallbackHandler cbHandler1 = 
                new GenericIssuedTokenGenerateCallbackHandler (cbackMap1);

            //Context object for WS-Trust request:
            WSSGenerationContext gencont1 = factory.newWSSGenerationContext();
            WSSConsumingContext concont1 = factory.newWSSConsumingContext(); 

            // Use UNT for trust request authentication
            UNTGenerateCallbackHandler utCallbackHandler = new UNTGenerateCallbackHandler("testuser", "testuserpwd");
            SecurityToken ut = factory.newSecurityToken(UsernameToken.class, utCallbackHandler);
            gencont1.add(ut);
            cbHandler1.setWSSConsumingContextForTrustClient(concont1);
            cbHandler1.setWSSGenerationContextForTrustClient(gencont1);

            //get generic security token
            GenericSecurityToken token = (GenericSecurityToken) factory.newSecurityToken 
                (GenericSecurityToken.class, cbHandler1, "system.wss.generate.issuedToken");
            QName Saml11ValueType = new QName(WSSConstants.SAML.SAML11_VALUE_TYPE);
            token.setValueType(Saml11ValueType);
            System.out.println("SAMLToken id = " + token.getId());

            // Initialize web services client
            EchoService12PortProxy echo = new EchoService12PortProxy();
            echo._getDescriptor().setEndpoint(endpointURL);

            // Configure SOAPAction properties
            BindingProvider bp = (BindingProvider) (echo._getDescriptor().getProxy());
            Map<String, Object> requestContext = bp.getRequestContext();
            requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);
            requestContext.put(BindingProvider.SOAPACTION_USE_PROPERTY,	Boolean.TRUE);
            requestContext.put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoOperation");

            // Initialize WSSGenerationContext
            WSSGenerationContext gencont = factory.newWSSGenerationContext();
            gencont.add(token);

            // Add timestamp
            WSSTimestamp timestamp = factory.newWSSTimestamp();
            gencont.add(timestamp);
            gencont.process(requestContext);
            	        // Build the input object
            			EchoStringInput echoParm = 
                				new com.ibm.was.wssample.sei.echo.ObjectFactory().createEchoStringInput();
            			echoParm.setEchoInput(input);
            			System.out.println(">> CLIENT: SEI Echo to " + endpointURL);		

            			// Prepare to consume timestamp in response message. 
            WSSConsumingContext concont = factory.newWSSConsumingContext();
            concont.add(WSSConsumingContext.TIMESTAMP); 
            concont.process(requestContext);
            			// Call the service
            			response = echo.echoOperation(echoParm).getEchoResponse();

            			System.out.println(">> CLIENT: SEI Echo invocation complete.");
            			System.out.println(">> CLIENT: SEI Echo response is: " + response);
        } catch (Exception e) {
            			System.out.println(">> CLIENT: ERROR: SEI Echo EXCEPTION.");
            e.printStackTrace();
        }
    }
}

トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_propagatingsectoken_wssapi_glm
ファイル名:twbs_propagatingsectoken_wssapi_glm.html