特集
次世代XML Webサービスを試す Part 1
[改訂版]

5.ほかのWS-Security実装との相互運用(2

インフォテリア株式会社
吉松 史彰
2003/01/10

Page1 Page2 Page3 Page4 Page5 Page6

■JavaのWebサービスをWS-Securityで呼び出す

 今度はWSTKで開発したセキュアなXML Webサービスに、WSEベースのクライアントからアクセスしてみよう。

まずはサービスの実体を作成する

 Apache AxisとWSTKのXML Webサービスは、単なるJavaのクラスだ。ここではズルをして次のようなソースにした。もちろんJavaのコードからSQL Serverにアクセスすることも可能である。

public class DataProvider {
  public String GetData() {
    return "Davolio";
  }
}
XML WebサービスとなるJavaのクラス

Apache Axisにクラスを配置する

 Axisはサーブレットなので、実行時にロードするクラスはWEB-INF/classesフォルダにコピーしておけばよい。ここでは上記のソース・コードをコンパイルしてできたDataProvider.classをコピーした。

Apache Axisでサービスを公開する

 下記のようなXMLファイルを作成し、deploy.wsddという名前で保存する。

<deployment xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
  <handler name="wssecurity-receiver"
      type="java:com.ibm.wstk.axis.handlers.SecurityReceiver">
    <parameter name="configPath"
      value="C:/WS-X/Security/WSTK/server2/SecurityReceiver.xml"/>
    <parameter name="printBefore" value="true"/>
    <parameter name="printAfter" value="true"/>
  </handler>
  <service name="DataProvider" provider="java:RPC">
    <requestFlow>
      <handler type="wssecurity-receiver" />
      <handler type="java:AuthBridgeHandler" />
      <handler type=
      "java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
      <handler type=
      "java:org.apache.axis.handlers.SimpleAuthorizationHandler"/>
    </requestFlow>
    <parameter name="className" value="DataProvider"/>
    <parameter name="allowedMethods" value="GetData"/>
    <parameter name="allowedRoles" value="user1"/>
  </service>
</deployment>
Apache AxisでWS-Securityを利用してWebサービスを公開するための設定ファイル(ファイル名はdeploy.wsdd)

 上記のファイルを使って次のコマンドで設定する。

% java org.apache.axis.client.AdminClient deploy.wsdd

 SecurityReceiver.xmlファイルの中身は次のとおりだ。何を書けばいいのか分からないので、fooやbarになっているところもある。これでも動くので取りあえずそのまま掲載してみる。何せトライ&エラーなのでご了承願いたい。

<?xml version="1.0" encoding="UTF-8"?>
<wsbinding>
  <ws-desc-binding>
    <pc-binding>
      <ReceiverServiceConfig>
        <LoginConfig>
          <AuthMethod>BasicAuth</AuthMethod>
        </LoginConfig>
        <IDAssertion>
          <IDType>Username</IDType>
          <TrustMode confidential="no">BasicAuth</TrustMode>
        </IDAssertion>
      </ReceiverServiceConfig>
      <ReceiverBindingConfig>
        <LoginMapping>
          <AuthMethod>BasicAuth</AuthMethod>
          <ConfigName>foo</ConfigName>
          <CallbackHandlerFactory>bar</CallbackHandlerFactory>
        </LoginMapping>
        <LoginBinding>
          <CallbackHandler>
            com.ibm.xml.soapsec.token.DebugReceiverCallbackHandler
          </CallbackHandler>
        </LoginBinding>
      </ReceiverBindingConfig>
    </pc-binding>
  </ws-desc-binding>
</wsbinding>
deploy.wsddで参照しているSecuritySender.xmlファイルの内容
トライ&エラーで設定したため一部未設定個所があるが、いちおう動作は可能。

 これらの設定によって、このサービスに渡されたWS-Securityのヘッダに設定されたユーザー名とパスワードは、

  • com.ibm.wstk.axis.handlers.token.username
  • com.ibm.wstk.axis.handlers.token.password

という名前のプロパティに取り込まれる。deploy.wsddファイル内にあるAuthBridgeHandlerというクラスは、筆者が仕方なく開発したAxisのハンドラ・クラスで、上記2つのプロパティの値をorg.apache.axis.MessageContextクラスにユーザー名とパスワードとして設定し直すものだ。これによって、Axisに標準で付属する、

  • org.apache.axis.handlers.SimpleAuthenticationHandler
  • org.apache.axis.handlers.SimpleAuthorizationHandler

が利用できるようになる。認証と承認の機能はこれらのハンドラに任せている。このあたりはApache Axisの解説になってしまうので省略する。

 これでサービス側は完成だ。

 次に、WSEベースのクライアントを開発する。とはいっても、先に利用したクライアントに少し手を加えるだけだ。

先ほど開発したクライアント・アプリケーションのプロジェクトにWeb参照を追加する

 今回は2つのWebサービスでWSDLを共有していないので、先ほどAxisに配置したDataProviderサービスのWSDLを次のURLから取得して、Web参照を作り直す。

http://localhost:8080/axis/services/DataProvider?wsdl

Mainメソッドを少し修正する

 いま作成したWeb参照を利用するように、クライアント・コードを次のように変更する(太字が修正部分)。

static void Main(string[] args) {
  //localhost.Service1 svc = new localhost.Service1();
  localhost1.DataProviderService svc =
    new localhost1.DataProviderService();

  Microsoft.Web.Services.SoapContext ctx = svc.RequestSoapContext;
  Microsoft.Web.Services.Security.UsernameToken user = new
    Microsoft.Web.Services.Security.UsernameToken("user1","pass1",
    Microsoft.Web.Services.Security.PasswordOption.SendPlainText);
  ctx.Security.Tokens.Add(user);
  ctx.Path.MustUnderstand = false;
  string ret = svc.GetData();
  Console.WriteLine(ret);
}
修正したコンソール・アプリケーションのコード
新たに作成されたプロキシ・クラスを利用するように、コードの一部を修正する。WS-Routingのヘッダを付加しないように、MustUnderstandプロパティはfalseに設定する。

 MustUnderstandプロパティをfalseに設定しているのは、WSTKにはWS-Routingの実装が含まれていないからだ。WSEの実装はデフォルトでSOAPメッセージにWS-Routingのヘッダを付加してしまう。削除の方法が分からなかったため、取りあえずオプションのヘッダに変更して回避した。

 これで実行すると次のようなメッセージが送受信される。

.NETクライアントから、WSTKを使用したJavaサーバへ送信されるSOAPメッセージ例(IEで表示)
 
Javaサーバから、.NETクライアントへ送信されるSOAPメッセージ例(IEで表示)

 このとおり、WSEのクライアントからWSTKのサービスへのアクセスも大した手間もなく行うことができた。

今回のまとめ

 XML Webサービスのセキュリティはまだまだ奥が深い。今回はまずは動かしてみようというのが趣旨だったが、予想外に簡単にクライアントとサービスの実装ができてしまった。さらには、JavaベースのWSTKとの相互運用もかなり高いレベルで行うことができている。これも仕様がガッチリ決められ、ベンダが実装で競争するようになってきたあかしの1つなのだろう。

 次回からは、WSEの仕組みなどを取り上げて、WS-Securityの実装をさらに深く使い込んでみる。End of Article

 

 INDEX
  [特集]次世代XML Webサービスを試す Part 1
    1.WSEのインストール
    2.WSEを使ったセキュア XML Webサービスの実装
    3.セキュアXML Webサービスのクライアントの実装
    4.ほかのWS-Security実装との相互運用(1)
  5.ほかのWS-Security実装との相互運用(2)
 
 「特集:次世代XML Webサービスを試す」



Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間