はじめに
本書では、チュートリアル「Financial-grade API Basics」(以下 “FAPI Basics”) の設定を行った Authlete サービスにリファレンス実装を統合し、 FAPI 準拠の認可フローと API リクエストの動作を確認します。前提条件
手順の実施にあたっては、以下のチュートリアルの実施とナレッジベース記事の通読を行い、 OpenID Connect と Authlete に関する基本的な理解を有していることが必須です。 また、以下のチュートリアル (FAPI Basics) の手順に従って、 Authlete が設定されている必要があります。 とくに、設定した環境が「設定完了後の実行例」の記述通りに動作することを確認してください。 本チュートリアルでは、動作確認に以下のソフトウェアを用います。 これらを実行可能な環境をご用意ください。- チュートリアル実施に必須
- authlete/java-oauth-server: 認可サーバーのリファレンス実装
- authlete/java-resource-server: リソースサーバーのリファレンス実装
- 同等の機能を有する別のソフトウェアにて代替も可能
- Apache HTTP Server (以下 Apache): 認可サーバーおよびリソースサーバーのリバースプロキシー
- curl: API クライアント
- OpenSSL: 秘密鍵・公開鍵証明書の生成
認可サーバーの設定
本セクションでは以下の作業を行います。- java-oauth-server の導入
- 接続テスト
java-oauth-server の設定
java-oauth-server のドキュメントに従い、ダウンロードと設定を行います。ダウンロード
git コマンドを用いて java-oauth-server をダウンロードします。
設定
設定ファイルauthlete.properties の以下の行を編集します。
FAPI Basics の設定が済んでいる Authlete サービスの、API キーと API シークレットを指定してください。
起動
mvn コマンドを用いて java-oauth-server を起動します。
動作確認
Web ブラウザから http://localhost:8080 にアクセスし、以下のページが表示されることを確認します。
FAPI 認可フローの実行 (1)
FAPI Basics チュートリアルの手順に従いリクエストオブジェクトを作成し、認可リクエストを組み立てます。本チュートリアルにて用いている内容は以下の通りです。- ペイロード(
client_idの値 (1756...3766) を FAPI Basics にて自動生成された値に変更してください)
- Signed JWT(FAPI Basics にて生成した署名鍵を用いてください)
- 認可リクエスト(
client_idとrequestパラメーターの値 (それぞれ1756...3766,eyJr...YifQ.ewoi...iCn0.ztl2...tjAA) を適宜変更してください)

john / john と入力し、Authorize ボタンをクリックします。

https://client.example.org/cb/example.com/#code=... にリダイレクトされます。しかし、
ホスト client.example.org は存在しないため、Web ブラウザはエラーページを表示します。

認可レスポンス
Web ブラウザの表示したエラーページの URL をコピーします。本チュートリアルでは以下の内容になります。code パラメーターを取り出します。
トークンリクエスト
先に得たcode の値を含むトークンリクエストを組み立て、java-oauth-server のトークンエンドポイント (/api/token) に送信します。
ここではまず、client_id / client_secret によるクライアント認証を試みます。
本チュートリアルでの各値は 0Io2...sdkQ, 1756...3766, EXE7...UxHg
となっていますが、適宜変更してください。
本チュートリアルでは curl を用いますが、
別のツールを利用してもかまいません。
トークンレスポンス
上記のトークンリクエストの結果、トークンレスポンスは以下のような内容になります。
本チュートリアルではレスポンスに
このエラーを解消するために、次のセクションにて、java-oauth-server がクライアント証明書を受け取れるように設定していきます。
"error_description", "error_uri" を含んでいますが、
これらは Authlete の設定により省略可能です。
詳細は サービス管理をご参照ください。認可サーバーの TLS 化
本セクションでは以下の作業を行います。- リバースプロキシーの設定
- クライアントの設定
リバースプロキシーの設定 (1)
FQDN の設定
この後ローカル環境にインストールする Apache に対して、Web ブラウザと curl がas.example.com という FQDN でアクセスできるように、本チュートリアルでは /etc/hosts に以下を追加します。
Apache のインストール
チュートリアルの実行環境に Apache をインストールします。本チュートリアルでは Homebrew を用いて Mac にインストールしますが、
そのほかのインストール方法や、あるいは Apache ではない別のリバースプロキシーを用いてもかまいません。
/usr/local/etc/httpd 以下に配置されたものとします。
サーバ証明書の作成・配置
本チュートリアルでは簡易的な動作確認のために自己署名証明書を用います。
RSA 秘密鍵と公開鍵証明書の生成
OpenSSL を用いて、Apache に設定する秘密鍵と公開鍵証明書を生成します。本チュートリアルでは OpenSSL を用いますが、
別のツールを利用してもかまいません。
server.key(秘密鍵)と server.crt(公開鍵証明書)の 2 つのファイルが生成されます。
秘密鍵と公開鍵証明書の配置
生成された 2 つのファイルを任意の場所に配置します。本チュートリアルでは配置場所を/usr/local/etc/httpd とします。
Apache の TLS 設定
設定ファイルの記述は Apache のインストール形態によって異なる可能性があります。
環境に応じて適宜修正してください。
httpd.conf
本チュートリアルでは Apache の基本的な設定として以下を行います。- ポート 8080 をリッスンしない(java-oauth-server が 8080 を使うため)
- mod_proxy, mod_ssl 関連を有効化(リバースプロキシーかつ TLS 接続を受けつけるため)
httpd.conf に対する具体的な変更点は以下の通りです。
TLS 関連の設定は別のファイル (extra/httpd-ssl.conf) に記述した内容をインクルードします。
extra/httpd-ssl.conf
本チュートリアルの設定は簡易的な動作確認のために最低限必要な項目のみになっています。
実サービスにおける TLS 設定としては不十分であることにご留意ください。
本チュートリアルでは Apache の TLS 関連の設定として以下を行います。
- FQDN を as.example.com に変更(ポートは 8443 のまま)
- FAPI 準拠(TLS 1.2 に限定し、また使用可能な暗号スイートを制限)
- クライアント証明書を X-Ssl-Cert ヘッダに格納(このヘッダにクライアント証明書がセットされている場合、java-oauth-server の /api/token エンドポイントはそれを抽出し、Authlete API (/auth/token API) へのリクエストに含める)
- https://as.example.com:8443/ へのリクエストを http://localhost:8080/ (java-oauth-server) に転送するリバースプロキシーとして設定
extra/httpd-ssl.conf に対する具体的な変更点は以下の通りです。
Apache の起動
apachectl コマンドを用いて Apache を起動します。
クライアントの設定
クライアント証明書の作成
本チュートリアルでは簡易的な動作確認のために自己署名証明書を用います。
RSA 秘密鍵と公開鍵証明書の生成
以下のコマンドを実行し、秘密鍵と公開鍵証明書を生成します。client.key(秘密鍵)と client.crt(公開鍵証明書)の 2 つのファイルが生成されます。
これらを、curl を用いたトークンリクエスト送信の際に用います。
FAPI 認可フローの実行 (2)
認可リクエスト・認可レスポンス
FAPI 認可フローの実行 (1) と同様に認可リクエストを行います。認可リクエストの送信先は、
先ほどと同じ http://localhost:8080/api/authorization でも、
Apache https://as.example.com:8443/api/authorization でも、どちらでもかまいません。
返却される認可レスポンスから code パラメーターの値を抽出します。本チュートリアルでは次の値となります。
トークンリクエスト
トークンリクエストを組み立て、java-oauth-server のトークンエンドポイント (/api/token) に送信します。 FAPI 認可フローの実行 (1) とは以下の点が異なります。http://localhost:8080ではなく、https://as.example.com:8443に接続するclient_secretではなく、秘密鍵 (client.key) および公開鍵証明書 (client.crt) を用いる
client_id, code の値は適宜変更してください)
トークンレスポンス
上記のトークンリクエストの結果、トークンレスポンスは以下のような内容になります。nbN3...LAU8)
を取得できました。この処理の裏では、Authlete が、アクセストークンとクライアント証明書をひもづけています。
次のセクションでは、アクセストークンを用いてリソースサーバーの API にアクセスを試みます。
リソースサーバーの設定
本セクションでは以下の作業を行います。- java-resource-server の導入
- 接続テスト
java-resource-server の設定
java-resource-server のドキュメントに従い、ダウンロードと設定を行います。ダウンロード
git コマンドを用いて java-resource-server をダウンロードします。
設定
設定ファイルauthlete.properties の以下の行を編集します。
java-oauth-server に設定したものと同じ API キーと API シークレットを指定してください。
起動
mvn コマンドを用いて java-resource-server を起動します。
動作確認
Web ブラウザから http://localhost:8081 にアクセスし、以下のページが表示されることを確認します。
API リクエストの実行 (1)
curl コマンドを用いて、java-resource-server の「カントリーエンドポイント」に、アクセストークン付きの API リクエストを試みます。
まず FAPI 認可フローの実行 (2) によりアクセストークンを取得します。
本チュートリアルでは以下の値となります。
Authorization ヘッダーにセットし、API リクエストを行います。
以下はリクエスト・レスポンスの例です。curl コマンドに -v オプションを付与し、
ヘッダー情報を出力しています。
リソースサーバーの TLS 化
本セクションでは以下の作業を行います。 基本的には、前半のセクションにて java-oauth-server に関して行った設定と同様です。- リバースプロキシーの追加設定
リバースプロキシーの設定 (2)
FQDN の設定
Apache に対して、curl がrs.example.com という FQDN でアクセスできるよう、リバースプロキシーの設定 (1)
にて追加した /etc/hosts の行に、以下のように追記します。
Apache の TLS 設定
extra/httpd-ssl.conf
Apache の TLS 関連の設定として、以下をextra/httpd-ssl.conf ファイルに追記します。
サーバー名やプロキシー先を除けば、先のリバースプロキシーの設定 (1) における内容と同様です。
- rs.example.com:8443 に対する処理の内容を定義
- FAPI 準拠(TLS 1.2 に限定し、また使用可能な暗号スイートを制限)
- クライアント証明書を X-Ssl-Cert ヘッダに格納(このヘッダにクライアント証明書がセットされている場合、java-resource-server の /api/country エンドポイントはそれを抽出し、Authlete API (/auth/introspection API) へのリクエストに含める)
- https://rs.example.com:8443/ へのリクエストを http://localhost:8081/ (java-resouce-server) に転送するリバースプロキシーとして設定
Apache の起動
apachectl コマンドを用いて Apache を停止・起動します。
API リクエストの実行 (2)
API リクエストの実行 (1) と同様に、curl コマンドを用いて API リクエストを試みます。
まず FAPI 認可フローの実行 (2) によりアクセストークンを取得します。
本チュートリアルでは以下の値となります。
http://localhost:8081ではなく、https://rs.example.com:8443に接続する- アクセストークンに加えて、秘密鍵 (
client.key) および公開鍵証明書 (client.crt) も用いる
