Basic認証を使用したWebサービスを作成する
長年、Webサービスに関する作業に従事してきましたが、それらの作成には、たいてい、IBMのIWS(Integrated Web Service: 統合Webサービス)ツールを使用しています。このツールには、RPGプログラムからの迅速なWebサービスの作成を可能にする、ウィザードベースのインターフェースが備えられています。先日、Basic認証(基本認証)を使用するWebサービスを作成しました。その手法をここで披露したいと思います。
この記事では、WebサーバーおよびWebサービスの作成方法については、すでにご存じであることを前提としています。そのため、ここではBasic認証機能を追加するのに必要な手順を紹介するのみとします。サーバーおよびサービスの作成方法についても、今後の記事で取り上げることをご希望の場合は、その旨をコメント欄にお記しください。喜んで対応します。
この記事用に、「AUTH_WS」というサーバーを作成し(図1)、「HTTP Servers(HTTP サーバー)」タブをクリックしました。
Basic認証を使用可能にするには、サーバーの構成に変更を加える必要があるため、「Edit Configuration File(構成ファイルの編集)」をクリックします(図2)。
そうすると構成ファイルの内容が表示され、その編集を行えるようになります(図3)。コードの中で「Location」というセクションを探します。変更する必要があるのはそのセクションです。
そのセクションにあるコードを削除して、以下のコードに差し換えます。
ProfileToken On
AuthType Basic
AuthName "IBM i User Profile Authentication"
Require valid-user
PasswdFile %%SYSTEM%%
order deny,allow
Allow from all
図4に、修正後のコードを示します。
サーバーに対してこれらの変更を行うことによって、Basic認証を使用することをサーバーに伝えました。つまり、サーバーは、このサーバーに配置されるどのサービスの利用者に対しても、ユーザー名およびパスワードの提供を求めることになります。では、ユーザー名とパスワードは、どこに由来するものなのでしょうか。ここでは、IBM i でセットアップされている有効なユーザー名およびパスワードを要求するようにサーバーに指示しています。このプロファイルには、作成時に最小限の権限のみが付与されているはずです。
構成ファイルを修正して「OK」をクリックしたら、変更内容を適用するためにサーバーを停止して再起動します。
次いで、サーバーにWebサービスを配置します。ここでは、JSONオブジェクトを入力として受け取り、JSONオブジェクトをサービス利用者に返す、非常にシンプルなテストRPGプログラム(以下のコード)を作成しています。
**FREE
ctl-opt option (*srcstmt : *nodebugio : *nounref);
ctl-opt Pgminfo(*pcml: *dclcase : *module);
ctl-opt debug (*input);
ctl-opt dftactgrp (*no);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Program : Test_ws1
// Author : Mike Larsen
// Date Written: 07/30/2024
// Purpose : Example of an RPG web service.
//
//====================================================================*
// Date Programmer Description *
//--------------------------------------------------------------------*
// 07/30/24 M.Larsen Original code. *
// *
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
dcl-ds MessageOutDs;
MessageSentIn char(30);
MessageSentOut char(30);
end-ds;
dcl-ds MessageInDs;
MessageIn char(30);
end-ds;
// Prototypes (entry parameters)
dcl-pr Test_ws1 ExtPgm;
ParmInMessage likeds(MessageInDs);
ParmOutMessage likeds(MessageOutDs);
End-pr;
// Main procedure interface
dcl-pi Test_ws1;
ParmInMessage likeds(MessageInDs);
ParmOutMessage likeds(MessageOutDs);
End-pi;
getOutMessage();
*Inlr = *On;
Return;
//--------------------------------------------------------
// getOutMessage subprocedure
//--------------------------------------------------------
dcl-proc getOutMessage;
ParmOutMessage.MessageSentIn = 'You said ' + %trim(ParmInMessage.MessageIn);
ParmOutMessage.MessageSentOut = 'I said goodbye';
end-proc;
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
サーバーの作成の場合と同様に、ここでは、サービスでBasic認証を使用できるようにするのに必要となる手順を示すのみとします。
IWSウィザードのステップ3に進んで、「Protect using authentication method:(認証方式を使用した保護:)」オプションで「*BASIC」を選択します。このオプションは、WebサービスにBasic認証を使用するように指示します(図5)。
ウィザードのステップ6で、このサービスのユーザーIDが、このサービスで使用するためにIBM i でセットアップしているユーザー プロファイルになるように設定しました。そのユーザーIDが、Basic認証で使用されます(図6)。
これでサービスが作成されたので、それをテストしてみましょう。
ここでは、SoapUiを使用してWebサービスを実行しますが、これは単なる個人的な好みに過ぎません。Postmanを使用するというのでも構いません。どちらのツールも使えます。
SoapUiでプロジェクトをセットアップしました(図7)。非公開にしておきたいので、エンドポイントを黒塗りにしていることに注意してください。また、サービスに渡されるJSONオブジェクトをセットアップしています。
次に、SoapUiでBasic認証をセットアップする必要があります。それを行うには、「Auth(認証)」タブをクリックして、「Authorization:(認証:)」で「Basic」を選択します(図8)。
Basic認証で使用するためにIBM i でセットアップしたプロファイルのユーザー名およびパスワードを入力します。
サービスを実行してみると、予想していたレスポンスを確認できました(図9)。
サービスに不正な認証情報を送信していたとしたら、どうなったでしょうか。では、試してみましょう。IBM i 上に存在していないプロファイルで、サービスを実行してみます(図10)。
サービスを実行したところ、不許可のレスポンスを受け取りました(図11)。
これは、予想していた通りのレスポンスです。
システムおよびプロセスをよりセキュアにすることは、常に重要なことです。そして、IBMは、IWSツールを使用して作成されたWebサービスに簡単にBasic認証を適用できるようにしてくれました。この手法は、現在作業中のWebサービスで初めて使用したのですが、今後も使用し続けようと思っています。