このエンドツーエンドの例では、Liberty のインストールから OpenID Connect の構成
までを説明するため、Liberty での OpenID Connect (OIDC) の構成を理解するのに役立ちます。結果として、
クライアント・アプリケーションは OpenID Connect プロバイダーからの認証を利用してユーザーの ID を
検証できます。
このタスクについて
以下の手順に従って、OpenID Connect プロバイダーおよび OpenID
Connect リライング・パーティーをセットアップできます。
- Liberty をインストールします。
- 2 つのサーバーを作成します。
- Snoop サーブレットなど、IBM® 提供のテスト・
アプリケーションをダウンロードし、インストールします。
- localhost ホスト名を使用して相互に通信するように、OpenID Connect プロバイダーおよび OpenID Connect リライング・パーティーを構成します。
- ログインします。
- 実際のホスト名を使用するように、OpenID Connect プロバイダーおよび OpenID Connect リライング・
パーティーの構成を編集します。
- ログインします。
以下の事項は、手順を実行する過程で発生している事象を説明しています。
- OpenID Connect リライング・パーティー・サーバーと OpenID Connect
プロバイダー・サーバーは、どちらも同じシステム上で実行されます。
- OpenID Connect リライング・パーティー・サーバーと OpenID Connect
プロバイダー・サーバーは、localhost というホスト名で開始します。これは、ご使用のシステムで
外部からの接続を許可するホストに発生する可能性のある問題を克服するためです。
- ファイルベースのレジストリーは、OpenID Connect プロバイダー・サーバーの
server.xml ファイルでハードコーディングされます。
これには、ユーザー名とパスワード用に 2 つのエントリーが含まれます。1 つはユーザー名
Jackson とパスワード Password 用です。
もう 1 つは、ユーザー名 Andrea とパスワード
Password 用です。実稼働環境では、ユーザーは OpenID
Connect プロバイダーに対して認証するため、例えば代わりに LDAP ユーザー・レ
ジストリーを使用する場合があります。OpenID Connect プロバイダーにはレジストリーが必要
となります。OpenID Connect リライング・パーティーは、ユーザーの成果物、例えば
OpenID Connect プロバイダーから取得するトークンなどを信頼しているので、レジストリーは必要ありません。
- デフォルトの鍵ストアはプレーン・テキストのパスワードを使用します。securityUtility
コマンドを使用して、エンコードされ暗号化されたパスワードを生成することができます。
- 単純にするため、HS256 署名アルゴリズムが使用されます。HS256 署名アルゴリズムのサポートは、
OpenID Connect 仕様では必須ではありません。多くの OpenID プロバイダーが HS256 署名
アルゴリズムをサポートしていません。
- 便宜上、テスト・アプリケーションを dropins デ
ィレクトリーに置きますが、実稼働環境ではこの慣例は避けてください。
- エラーが発生した場合にサーバーの trace.log
ファイルを表示できるように、OIDC トレースが使用可能です。
手順
- WebSphere®
Liberty をインストールします。
- WebSphere Liberty
.zip ファイルを、WASdev
からインストール用の新規ディレクトリーにダウンロードします。
- ダウンロードしたファイルを解凍します。
unzip wlp-webProfile7-17.0.0.4.zip
この例では、以降のパスは、インストールのために作成したディレクトリーに相対的です。
- サンプル Liberty デフォルト・アプリケーションを ダウンロードします。
このデフォルト・アプリケーションは、libertyDefaultApplication.ear ファイル内にあり、この例の手順で使用する Snoop サーブレットを含んでいます。
- Liberty OpenID Connect クライアントおよび Liberty OpenID Connect プロバイダーのフィーチャーをインストールします。
wlp/bin ディレクトリーから以下のコマンドを実行します。
installUtility install openidConnectClient-1.0
installUtility install openidConnectServer-1.0
- Liberty サーバーを作成します。
- OpenID Connect リライング・パーティー・サーバーを作成します。
wlp/bin ディレクトリーから次のコマンドを実行します。
server create Liberty_RP
- OpenID Connect プロバイダー・サーバーを作成します。
wlp/bin ディレクトリーから次のコマンドを実行します。
server create Liberty_OP
- OpenID Connect リライング・パーティー・サーバーの server.xml ファイルを作成します。
- wlp/usr/servers/Liberty_RP ディレクトリーに移動します。
- server.xml ファイルの内容を以下で置き換えます。
<server description="Liberty_RP">
<featureManager>
<feature>openidConnectClient-1.0</feature>
<feature>appSecurity-2.0</feature>
</featureManager>
<!-- To access this server from anything other than localhost or the loopback address, add a host attribute to the following element, e.g. host="*" -->
<httpEndpoint httpPort="9081" httpsPort="9444" id="defaultHttpEndpoint"/>
<keyStore id="defaultKeyStore" password="Password"></keyStore>
<openidConnectClient id="RP"
clientId="oidcclient"
clientSecret="password"
authorizationEndpointUrl="https://localhost:9443/oidc/endpoint/OP/authorize"
tokenEndpointUrl="https://localhost:9443/oidc/endpoint/OP/token" >
</openidConnectClient>
<logging traceSpecification="*=info:
com.ibm.ws.security.*=all:com.ibm.ws.webcontainer.security.*=all:com.ibm.oauth.*=all:com.ibm.wsspi.security.oauth20.*=all:com.ibm.ws.transport.http.*=all:org.apache.http.cli.e.nt.*=all" traceFileName="trace.log" maxFileSize="20" maxFiles="10" traceFormat="BASIC" />
</server>
- OpenID Connect プロバイダーの server.xml ファイルを作成します。
- wlp/usr/servers/Liberty_OP ディレクトリーに移動します。
- server.xml ファイルの内容を以下で置き換えます。
<server description="Liberty_OP">
<featureManager>
<feature>openidConnectServer-1.0</feature>
<feature>appSecurity-2.0</feature>
</featureManager>
<!-- To access this server from anything other than localhost or the loopback address, add a host attribute to the following element, e.g. host="*" -->
<httpEndpoint httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint"/>
<keyStore id="defaultKeyStore" password="Password"/>
<basicRegistry>
<user name="Jackson" password="Password"/>
<user name="Andrea" password="Password"/>
</basicRegistry>
<openidConnectProvider id="OP" oauthProviderRef="oauth"/>
<oauthProvider id="oauth">
<localStore>
<!-- The default redirect URL pattern is: https://<hostname>:<sslport>/oidcclient/redirect/<openidConnectClientID> -->
<client name="oidcclient" secret="password" scope="openid" redirect="https://localhost:9444/oidcclient/redirect/RP" />
</localStore>
</oauthProvider>
<!-- To grant all authenticated users access to the OIDC protected resource, grant them the oauth-role authenticated -->
<oauth-roles>
<authenticated>
<special-subject type="ALL_AUTHENTICATED_USERS"/>
</authenticated>
</oauth-roles>
<logging traceSpecification="*=info:
com.ibm.ws.security.*=all:com.ibm.ws.webcontainer.security.*=all:com.ibm.oauth.*=all:com.ibm.wsspi.security.oauth20.*=all:com.ibm.ws.transport.http.*=all:org.apache.http.client.*=all" traceFileName="trace.log" maxFileSize="20" maxFiles="10" traceFormat="BASIC" />
</server>
- デフォルトの鍵ストアおよび鍵を作成します。
wlp/bin ディレクトリーから以下のコマンドを実行します。
server start Liberty_RP
server stop Liberty_RP
server start Liberty_OP
server stop Liberty_OP
- Liberty_OP サーバー用の署名者証明書を、信頼できる証明書として Liberty_RP サーバーに追加します。
- Liberty_OP サーバーの鍵ストアから個人証明書をエクスポートします。
- ディレクトリーを wlp/usr/servers/Liberty_OP/resources/security に変更します。
- Liberty_OP サーバーのデフォルト個人証明書をエクスポートします。
keytool -exportcert -keystore key.jks -storepass Password -alias default -file libertyOP.cer
Liberty_OP サーバーのこのデフォルト個人証明書は、署名者証明書です。
- 署名者証明書を Liberty_OP サーバーから Liberty_RP サーバーの鍵ストアにインポートします。
- libertyOP.cer ファイルを wlp/usr/servers/Liberty_RP/resources/security ディレクトリーにコピーする。
- ディレクトリーを wlp/usr/servers/Liberty_RP/resources/security に変更します。
- 次のコマンドを実行してインポートを行います。
keytool -importcert -keystore key.jks -storepass Password -alias libertyop -file libertyOP.cer -noprompt
- オプション: Liberty_RP サーバーの鍵ストアを表示します。
keytool -list -v -keystore key.jks -storepass Password
- Liberty デフォルト・アプリケーションを Liberty_RP サーバーにインストールします。
前のステップでダウンロードした libertyDefaultApplication.ear ファイルを
wlp/usr/servers/Liberty_RP/dropins ディレクトリーにコピーします。
- Liberty_OP サーバーおよび Liberty_RP サーバーを始動します。
wlp/bin ディレクトリーから以下のコマンドを実行します。
server start Liberty_RP
server start Liberty_OP
- Liberty_RP サーバーのログイン・ページを開きます。
- ブラウザーのアドレス・バーに Liberty_RP サーバーの URL を入力します。
http://localhost:9081/snoop
- Enter キーを押します。
ログイン・ウィンドウが表示されます。
重要: 接続が保護されていないというブラウザー警告が出される場合、接続を許可するための手順をブラウザーで実行します。
- Liberty_OP サーバーにログインし、Liberty_RP サーバーを許可します。
- ユーザーを Liberty_OP サーバーに対して認証します。
- ユーザー名 Jackson、パスワード Password でログインします。
- 「ログイン」をクリックします。
「openid」の項目にチェック・マークが付いた「Allow client to access the following data」ページが表示されます。
- Liberty_OP サーバーを許可して、Liberty_RP サーバーがユーザーの個
人情報にアクセスできるようにします。
「Allow once」または
「Allow, remember my decision」をクリックします。
重要: 接続が保護されていないというブラウザー警告が出される場合、接続を許可するための手順をブラウザーで実行します。
Liberty_RP サーバーと Liberty_OP サーバーの両方の httpEndpoint エレメントで
使用される鍵ストアが、自己署名証明書のみを含んでいることが原因で、この警告を
受け取る可能性があります。
ログインに成功すると、「Snoop Servlet - Request/Client Information」
ページに Snoop サーブレットが表示されます。重要: 再度ログインするには、
以下のオプションのうち少なくとも 1 つを実行してください。
- 別のブラウザー製品からログインする。
- 現行のブラウザーで Cookie をクリアして、ログインに関するこれまでの手順を実行する。
- ログインに使用したブラウザーのすべてのウィンドウを閉じ、再度ブラウザーをオープンしてログインする。
- Liberty_RP サーバーを再始動してから、ログインに関するこれまでの手順を実行する。
- サーバー名を完全に修飾します。
- Liberty_RP サーバーの server.xml ファイルで、localhost ホスト名を完全
修飾名に変更します。
- wlp/usr/servers/Liberty_RP/server.xml ファイルを編集します。
- 属性 host="*" を httpEndpoint エレメントに追加します。
- openidConnectClient エレメントの属性である
authorizationEndpointUrl および tokenEndpointUrl を変更して、
localhost ホスト名ではなくサーバーのホスト名を使用するようにします。
以下のサンプル・コードは、
完全修飾サーバー・ホスト名を指定します。
<openidConnectClient id="RP"
clientId="oidcclient"
clientSecret="password"
authorizationEndpointUrl="https://wks1.acme.com:9443/oidc/endpoint/OP/authorize"
tokenEndpointUrl="https://wks1.acme.com:9443/oidc/endpoint/OP/token" >
</openidConnectClient>
- ファイルを保存します。
ファイルを保存するときに、サーバーを再始動しな
くていいように、Liberty の構成変更が発生します。
- Liberty_OP サーバーの server.xml ファイルで、localhost ホスト名を完全修飾名に変更します。
- wlp/usr/servers/Liberty_OP/server.xml ファイルを編集します。
- 属性 host="*" を httpEndpoint エレメントに追加します。
- クライアント・エレメント (oauthProvider/localStore/client) のリダイレクト属性を変更して、
localhost ホスト名ではなく完全修飾サーバー・ホスト名を使用するようにします。
以下のサンプル・コード
は、完全修飾サーバー・ホスト名を指定します。
<client name="oidcclient" secret="password" scope="openid" redirect="https://wks1.acme.com:9444/oidcclient/redirect/RP" />
- ファイルを保存します。
ファイルを保存するときに、サーバーを再始動しなくて
いいように、Liberty の構成変更が発生します。
- 完全修飾ホスト名を使用して、ログイン・ページを開きます。
- ブラウザーのアドレス・バーに Liberty_RP サーバーを含む URL を入力します。
http://<host_name>:9081/snoop
- Enter キーを押します。
ログイン・ウィンドウが表示されます。
重要: 接続が保護されていないというブラウザー警告が出される場合、接続を許可するための手順をブラウザーで実行します。
- Liberty_OP サーバーにログインし、Liberty_RP サーバーを許可します。
- ユーザーを Liberty_OP サーバーに対して認証します。
- ユーザー名 Jackson、パスワード Password でログインします。
- 「ログイン」をクリックします。
「openid」の項目にチェック・ マークが付いた「Allow client to access the following data」ページ
が表示されます。
- Liberty_OP サーバーを許可して、Liberty_RP サーバーがユーザーの個人情報にアクセスできるようにします。
「Allow once」または
「Allow, remember my decision」をクリックします。
重要: 接続が保護されていないというブラウザー警告が出される場合、接続を許可するための手順をブラウザーで実行します。
Liberty_RP サーバーと Liberty_OP サーバーの両方の httpEndpoint エレメントで使用される鍵ストアが、自己署名証明書のみを含んでいることが
原因で、この警告を受け取る可能性があります。
ログインに成功すると、「Snoop Servlet - Request/Client
Information」ページに Snoop サーブレットが表示されます。
タスクの結果
OpenID Connect リライング・パーティーに保護されている Snoop サーブレッ
トを含む Liberty サーバーがあります。OpenID Connect リライング・パーティーは、
認証に OpenID Connect プロバイダーを使用します。
表 1. 結果に関する質問質問 |
回答 |
Snoop サーブレットと libertyDefaultApplication テスト・アプリケーシ
ョンが OpenID Connect 構成で記述されていないにもかかわらず、テスト・ア
プリケーションが OpenID Connect リライング・パーティーに保護されるのはなぜですか。 |
テスト・アプリケーションは、その web.xml ファイルに Java™
EE セキュリティー対応コンテナーがサポートするセキュリティー制約を含むため、保護さ
れました。OpenID Connect リライング・パーティーが Liberty で実行中の場合、デフォルトで、
リライング・パーティーはセキュリティー制約を持つ URL に対するすべての要求を許可することを試みます。
テスト・アプリケーションには使用中の URL でのセキュリティー制約があるため、
リライング・パーティーは要求を許可します。 |