...

IBM DataPower Gateway (IDG) OAuth構成ガイド

by user

on
Category: Documents
350

views

Report

Comments

Transcript

IBM DataPower Gateway (IDG) OAuth構成ガイド
IBM DataPower Gateway (IDG)
OAuth構成ガイド
© 2016 IBM Corporation
Disclaimer

当資料の位置づけ
当資料は、IBM DataPower Gateway (IDG) におけるOAuth機能の概要と、実装方
法および考慮点をまとめたものです。
 Firmware v7.2.0.2を前提としています。


注意事項
当資料に含まれる情報は可能な限り正確を期しておりますが、当資料に記載された内
容に関して何ら保証するものではありません。ここでの記載内容はあくまでも支援情
報であり、使用者の責任において取扱われるものとし、資料の内容によって受けたい
かなる損害に関して一切の保証をいたしません。
 製品の新しいリリース、修正などによって動作/仕様が変わる可能性がありますので、
必ずマニュアル等で最新の情報をご確認ください。

2
© 2016 IBM Corporation
目次

OAuth概要
OAuth構成要素
 IDGにおけるOAuthプロトコルのサポート


OAuth構成トポロジー

IDGが認証・許可するパターン

OAuth処理フロー (Basic認証 / Form認証)
認証と許可が分離するパターン
 IDGの冗長構成について


OAuth構成方法


OAuth構成手順概要および詳細
OAuthプロセスのカスタマイズ
カスタム・スコープ検査
 許可フォームのカスタマイズ
 リソース所有者カスタム処理
 追加OAuth処理


トークン失効管理
IDGにおけるトークン失効方法
 IDGにおけるトークン失効管理



3
IDG内部キャッシュの利用と考慮点
外部リポジトリーの利用と考慮点
© 2016 IBM Corporation
OAuth概要
4
© 2016 IBM Corporation
OAuth構成要素 (1/2)

リソース・オーナー(Resource Owner)
OAuthの詳細についてはRFC 6749を参照
保護されたリソースへのアクセスを許可するエンティティー
 人間の場合はエンド・ユーザーに相当


OAuthクライアント(Client)
リソース・オーナーの許可を得て、リソース・オーナーの代理として保護されたリソー
スに対するリクエストを行うアプリケーション
 アクセス・トークンを使用して保護されたリソースにアクセスする


許可サーバー(Authorization Server)
リソース・オーナーの認証とリソース・オーナーからの許可取得が成功した後、アクセ
ス・トークンをクライアントに発行するサーバー
 リソース・サーバーと同一サーバーの場合と異なるサーバーの場合がある


リソース・サーバー(Resource Server)

保護されたリソースをホストし、保護されたリソースへのリクエストを受理してレスポ
ンスを返すサーバー
RFC6749の日本語訳では、 Authorization serverは「認可サーバー」、 Authorization Codeは「認可コード」と記述されていますが、本製品の製品マニュアル
KnowledgeCenterの日本語訳では、「許可サーバー」、「許可コード」と訳されており、本資料中でもその記述を踏襲します。あらかじめご了承ください。
5
© 2016 IBM Corporation
OAuth構成要素 (2/2)

アクセス・トークン
OAuthの詳細についてはRFC 6749を参照
リソース・オーナーの保護リソースにアクセスするためのクレデンシャル
 OAuthクライアントが保護リソースへアクセスする際にリソース・サーバーに送信する


リフレッシュ・トークン
アクセス・トークンを取得するためのクレデンシャル
 アクセス・トークンの期限が切れた場合に、許可サーバーから新規アクセス・トークン
を要求したり、同一スコープまたはより狭いスコープを持つアクセス・トークンを要求
するために使用
 リソース・サーバーには送信されない

6
© 2016 IBM Corporation
IDGにおけるOAuthプロトコルのサポート (1/5)

IDGはOAuth 2.0をサポート


プロトコルフロー

7
厳密には、RFC6749 「The OAuth 2.0 Authorization Framework」のド
ラフト版 (draft-ietf-oauth-v2-31)がベース
IDGは2者間フローと3者間フローをサポート
© 2016 IBM Corporation
IDGにおけるOAuthプロトコルのサポート (2/5)

2者間フロー

以下のいずれかの場合に使用可能



OAuthクライアント=リソース・オーナー
OAuthクライアントが信頼できる (リソース・オーナーの資格情報を知っている)
以下のグラント・タイプが使用可能


リソース・オーナー・パスワード・クレデンシャル
クライアント・クレデンシャル
リソース・オーナー&
OAuthクライアント
許可サーバー
リソース・サーバー
アクセス許可要求
認証 / 許可 w/リソース・オーナー資格情報
アクセス・トークン (+リフレッシュ・トークン)
リソース・アクセス w/アクセス・トークン
アクセス・トークン再発行要求 w/リフレッシュ・トークン
アクセス・トークン
8
© 2016 IBM Corporation
IDGにおけるOAuthプロトコルのサポート (3/5)

3者間フロー
リソース・オーナーの資格情報をOAuthクライアントに知らせることなく、OAuthク
ライアントがリソース・サーバーによって保護されたリソースへアクセスすることを
許可することが可能
 許可コード (または暗黙的付与)のグラント・タイプを使用

リソース・オーナー
OAuthクライアント
許可サーバー
リソース・サーバー
Initiate
アクセス許可要求 (302 リダイレクト)
認証 / 許可 w/リソース・オーナー資格情報
許可コード (302 リダイレクト)
アクセス・トークン発行要求
w/許可コード + OAuthクライアント資格情報
アクセス・トークン (+リフレッシュ・トークン)
リソース・アクセス w/アクセス・トークン
アクセス・トークン再発行要求 w/リフレッシュ・トークン
アクセス・トークン
9
© 2016 IBM Corporation
IDGにおけるOAuthプロトコルのサポート (4/5)

以下のOAuthクライアントのロールのいずれかまたは両方をサポート

許可サーバー・エンドポイント (許可エンドポイントおよびトークン・エンドポイント)


リソース・サーバーの適用ポイント




10
IDGは保護されたリソースへのアクセス許可をリソース・オーナーから取得し、OAuthクライア
ントに対してアクセス・トークンを発行する
IDGはサービス提供者が保持するリソースを保護し、OAuthクライアントが保護されたリソース
へアクセスするための要求に対して応答する
アクセス・トークンを使用して要求の受け入れ可否を判断する
ロールは「OAuthクライアント・プロファイ
ル」にて指定
同じOAuthクライアント・グループに属する
すべてのOAuthクライアント・プロファイル
は、同じロールまたはグループ内で定義され
たロールのサブセットを持っている必要があ
る
© 2016 IBM Corporation
IDGにおけるOAuthプロトコルのサポート (5/5)


OAuthロールが許可サーバー・エンドポイントの場合、グラント・タイプの指定が必要
以下のグラント・タイプをサポート

許可コード



暗黙的付与 (Implicit)






JWTを使用してアクセス許可を取得する
2者間フローでのみ使用可能
OpenID Connect (OIDC)

11
クライアントのクレデンシャルを使用してアクセス許可を取得する
2者間フローでのみ使用可能
JSON Web Token (JWT)


OAuthクライアントはリソース・オーナーのパスワード・クレデンシャルを使用してアクセス許可を取得す
る
2者間フローでのみ使用可能
クライアント・クレデンシャル


OAuthクライアントはアクセス・トークンを取得する際に用いられる仲介のクレデンシャルを利用せず (=
暗黙)、直接アクセス・トークンを取得する
3者間フローでのみ使用可能
リソース・オーナー・パスワード・クレデンシャル


OAuthクライアントは許可コードによってアクセス許可を取得する
3者間フローでのみ使用可能
上記グラント・タイプの一部としてOIDCをサポート
© 2016 IBM Corporation
OAuth構成トポロジー
12
© 2016 IBM Corporation
IDGが認証・許可するパターン

IDGにて認証およびOAuth許可を行うことが可能
リソース・オーナー
モバイル・アプリ
ユーザー情報
ブラウザー
リソース
IBM DataPower
Gateway (IDG)
OAuthクライアント
・アプリケーション
認証サーバー
許可サーバー・
エンドポイント
アプリケーション・
サーバー
リソース・サーバー
リソース・サーバー
適用ポイント
トークン失効管理
サーバー
トークン
失効情報
13
© 2016 IBM Corporation
OAuth処理フロー (Basic認証 & 許可コード)
リソース・オーナー
OAuthクライアント
POST /oauth_request
IBM DataPower Gateway (IDG)
許可サーバー・エンドポイント&
リソース・サーバー適用ポイント
リソース・サーバー
302 Found
Location:
/oauth/authz?response_type=code&client_id=<client>
&redirect_uri=<uri>&scope=<scope>&state=<state>
401 Unauthorized
WWW-Authenticate: “Basic realm=login”
Authorization: Basic: <username>:<password>
GET
/oauth/authz?response_type=code&client_id=<client>&
redirect_uri=<uri>&scope=<scope>&state=<state>
Scope Accept
Basic Authentication
Authorization Form
200 OK
POST /oauth/authz
selectedscope=<scope>&dp-state=<ticket>& resourceowner=<owner>&redirect_uri=<uri>&scope=<scope>
&client_id=<client_id>&approve=true&
Publish code
POST /oauth/token
Authorization: Basic: <client_id>:<secret>
grant_type=authorization_code&code=<code
>&redirect_uri=<uri>
{ "token_type":"bearer",
"access_token":“<access_token>",
"expires_in":3600, "scope":“<scope>",
"refresh_token":“<refresh_token>" }
GET /resource
Authorization: Bearer <access_token>
14
302 Processed
Location: <uri>?code=<code>&state=<state>
Validate code & Publish token
200 OK
Check token
© 2016 IBM Corporation
OAuth処理フロー (Form認証 & 許可コード)
リソース・オーナー
OAuthクライアント
POST /oauth_request
IBM DataPower Gateway (IDG)
許可サーバー・エンドポイント&
リソース・サーバー適用ポイント
302 Found
Location:
/form/oauth/authz?response_type=code&client_id=<clien
t>&redirect_uri=<uri>&scope=<scope>&state=<state>
Authentication Form
POST /form/j_security_check
J_username=<username>&j_password=<password>&login=Log
in&originalUrl=/form/oauth/authz?response_type=code&client_id
=<client>&redirect_uri=<uri>&scope=<scope>&state=<state>
Scope Accept
Authorization Form
15
200 OK
Set Cookie: JSESSIONID=xxxxxxxx
Publish code
POST /oauth/token
Authorization: Basic: <client_id>:<secret>
grant_type=authorization_code&code=<code
>&redirect_uri=<uri>
GET /resource
Authorization: Bearer <access_token>
200 OK
Form Authentication
POST /form/oauth/authz
selectedscope=<scope>&dp-state=<ticket>& resourceowner=<owner>&redirect_uri=<uri>&scope=<scope>
&client_id=<client_id>&approve=true&
{ "token_type":"bearer",
"access_token":“<access_token>",
"expires_in":3600, "scope":“<scope>",
"refresh_token":“<refresh_token>" }
リソース・サーバー
302 Processed
Set Cookie: JSESSIONID=yyyyyyyy
Location: <uri>?code=<code>&state=<state>
Validate code & Publish token
200 OK
Check token
© 2016 IBM Corporation
認証と許可が分離するパターン (1/2)

認証は既存の認証サーバーを使用することも可能

認証サーバーがリバース・プロキシーとして動作する場合
リソース・オーナー
モバイル・アプリ
ユーザー情報
ブラウザー
OAuthクライアント
・アプリケーション
認証サーバー
(リバース・プロキシー)
※認証後はパススルー
IBM DataPower
Gateway (IDG)
許可サーバー・
エンドポイント
リソース・サーバー
適用ポイント
リソース
アプリケーション・
サーバー
リソース・サーバー
トークン失効管理
サーバー
トークン
失効情報
16
© 2016 IBM Corporation
認証と許可が分離するパターン (2/2)

認証は既存の認証サーバーを使用することも可能

IDGがゲートウェイとして動作する場合
リソース・オーナー
モバイル・アプリ
ブラウザー
OAuthクライアント
・アプリケーション
認証サーバー
IBM DataPower
Gateway (IDG)
許可サーバー・
エンドポイント
リソース・サーバー
適用ポイント
ユーザー情報
リソース
アプリケーション・
サーバー
リソース・サーバー
トークン失効管理
サーバー
トークン
失効情報
17
© 2016 IBM Corporation
IDGの冗長構成について

OAuthを使用する場合のIDGの冗長構成
複数台のIDGでActive-Active構成が可能
 許可コードやトークンに必要な情報が含まれるため、セッション維持の必
要はない
 許可コードやトークンに含まれる有効期限情報で有効/無効を判断するため、
すべてのIDGで時刻設定を合わせる必要がある



当方で検証した限りでは、使用済みの許可フォームや許可コード、リフ
レッシュ・トークンを再利用できないようにするために、IDGでは情報を
内部にキャッシュすることを確認した。複数台で冗長構成とする場合、
キャッシュを共有できないため、IDG台数分は許可フォーム/許可コード/リ
フレッシュ・トークンが再利用できてしまう可能性がある。


18
NTPを使用するなど
キャッシュは「状況」>「暗号」>「OAuthキャッシュ」より確認可能
キャッシュの説明については当資料「IDG内部キャッシュの利用 (2/3)」を参照
© 2016 IBM Corporation
OAuth構成方法
19
© 2016 IBM Corporation
OAuth構成方法


OAuthプロトコルを使用するためには、AAAポリシーを構成する必要が
あり、下表のいずれかの方法で構成可能
構成方法によりサポートされるOAuthロールが異なる
構成方法
サポートされるOAuthロール
Webトークン・サービス (WTS)
許可サーバー・エンドポイント
マルチプロトコル・ゲートウェイ (MPG)
許可サーバー・エンドポイント
リソース・サーバーの適用ポイント
※当資料では、MPGを使用する場合の構成手順を記載します
20
© 2016 IBM Corporation
OAuth構成手順概要 (1/2)

前提事項

クライアントからIDGへのアクセスはHTTPSを使用

SSL接続に必要な暗号鍵および証明書の設定が済んでいること

IDGにおける自己署名証明書の作成方法は、後述の「(参考) サーバー証明書および秘密鍵の作成」を参照
認証はIDG内で行い、Basic認証またはForm認証を使用
 OAuthのグラント・タイプとして「許可コード」を使用
 サンプルとしてリソース・サーバーもIDGを使用し、XML Firewallサービスにてリ
ソースを提供する


本資料で使用するXML Firewallサービスのサンプルは、下記リンク先で提供されるサンプル・
コードを元に作成


http://www.ibm.com/developerworks/apps/download/index.jsp?contentid=829237&filename=
AccountLoopback.zip&method=http&locale=
事前に上記サンプル・コードをIDGの任意のドメインにインポートし、更に以下の点を修正し
て使用

ポート番号を5071に変更
 「サービス」>「XMLファイアウォール」>「XMLファイアウオールの編集」より該当XML Firewallサービ
スを選択し、「一般」タブより設定変更

「local:///json_response.xsl」内のリソース・オーナーを取得するヘッダー名を修正
修正前
<xsl:variable name="resource-owner" select="str:decode-uri(dp:http-request-header('ResourceOwner'))"/>
修正後
<xsl:variable name="resource-owner" select="str:decode-uri(dp:http-request-header('DP-OWNER'))"/>
21
© 2016 IBM Corporation
OAuth構成手順概要 (2/2)

構成手順概要
1.
OAuthクライアントの登録
1.
2.
2.
AAAポリシー作成
1.
2.
3.
3.
OAuthクライアント・プロファイルの作成
OAuthクライアント・グループの作成
OAuth許可およびトークン・エンドポイント用 (Form認証用)
OAuth許可およびトークン・エンドポイント用 (Basic認証用)
リソース・サーバー適用ポイント用
AAAポリシーを使用してマルチプロトコル・ゲートウェイを構成
1.
2.
マルチプロトコル・ゲートウェイの作成
処理ポリシーの作成
1.
2.
3.
4.
5.
6.
3.
22
favicon用リクエスト・ルール
Form認証およびOAuth許可用リクエスト・ルール
Basic認証およびOAuth許可用リクエスト・ルール
リソース・サーバー適用ポイント用リクエスト・ルール
レスポンス・ルール
エラー・ルール
HTTPSフロント・サイド・ハンドラーの作成
© 2016 IBM Corporation
(再掲) OAuth構成手順概要

構成手順概要
1.
OAuthクライアントの登録
1.
2.
2.
AAAポリシー作成
1.
2.
3.
3.
OAuthクライアント・プロファイルの作成
OAuthクライアント・グループの作成
OAuth許可およびトークン・エンドポイント用 (Form認証用)
OAuth許可およびトークン・エンドポイント用 (Basic認証用)
リソース・サーバー適用ポイント用
AAAポリシーを使用してマルチプロトコル・ゲートウェイを構成
1.
2.
マルチプロトコル・ゲートウェイの作成
処理ポリシーの作成
1.
2.
3.
4.
5.
6.
3.
23
favicon用リクエスト・ルール
Form認証およびOAuth許可用リクエスト・ルール
Basic認証およびOAuth許可用リクエスト・ルール
リソース・サーバー適用ポイント用リクエスト・ルール
レスポンス・ルール
エラー・ルール
HTTPSフロント・サイド・ハンドラーの作成
© 2016 IBM Corporation
1. OAuthクライアントの登録 (1/5)
1.
OAuthクライアント・プロファイルの作成

メニューより、「オブジェクト」 > 「暗号構成」 > 「OAuthクライアン
ト・プロファイル」を選択し、新規作成
OAuthクライアント毎にロールを指定。
ここでは、両方にチェックを入れる。
サポートするグラント・タイプを指定。
ここでは、「許可コード」にチェック
を入れる。
24
© 2016 IBM Corporation
1. OAuthクライアントの登録 (2/5)
1.
OAuthクライアント・プロファイルの作成 (続き)
クライアント・タイプおよびクライアントの認証方式
を指定。
ここでは、クライアント・タイプを「機密」とし、ク
ライアント・シークレットで認証する。
※クライアント・シークレットを明示的に定義する場
合、事前に「クライアント・シークレットの生成」欄
のチェックを外す必要があります。
スコープを正規表現 (PCRE)で指定。
ここでは、「/getAccountInfo」または
「/getCustomerInfo」を許可する
「^/getAccountInfo|/getCustomerInfo」を入力。
トークン保護のための共有秘密鍵を指定。(次頁参照)
クライアントに許可コードのトークンを渡すためのリ
ダイレクトURLを指定。 (複数指定可能)
ここでは、正規表現でHTTPSのすべてのURIに合致
する「https://{1}¥S+」を指定。
リソース・オーナーに送信する許可フォームを生成す
るためのXSLTを指定。
ここでは、OAuth用にデフォルトで提供されるXSLT
を選択。
25
© 2016 IBM Corporation
(参考) OAuthクライアントの共有秘密鍵



IDGで発行するトークンを暗号化するために使用する秘密鍵
32バイト以上の任意の16進数
共有秘密鍵の例:

sharedSecretKey.txt
0x1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF
26
© 2016 IBM Corporation
1. OAuthクライアントの登録 (3/5)
1.
OAuthクライアント・プロファイルの作成 (続き)
キャッシュ方式の指定。
ここでは、デフォルトの「リプレイのみ」
を選択。
OAuth処理エラーとしてクライアントに詳
細なエラーを返答するかどうかの指定 (デ
フォルトはチェックなし) 。
チェックを入れるとOAuthエラー応答に詳
細情報が含まれる。
リクエストにスコープが指定されていない
場合のデフォルト値。
許可フォームの有効期間 (1~600秒/デ
フォルト値:300)。
許可コードの有効期間 (1~600秒/デフォ
ルト値:300)。
アクセス・トークンの有効期間 (1~
2678400秒/デフォルト値:3600)。
27
© 2016 IBM Corporation
1. OAuthクライアントの登録 (4/5)
1.
OAuthクライアント・プロファイルの作成 (続き)
IDGが生成できるリフレッシュ・トー
クンの総数 (0~2048個/デフォルト
値:0)
リフレッシュ・トークンの有効期間 (1
~2682000秒/デフォルト値:5400)
リソース・サーバーに対してヘッダー
で情報を付加するかどうかの指定。
ここでは、すべてにチェックを入れる。
28
© 2016 IBM Corporation
1. OAuthクライアントの登録 (5/5)
2.
OAuthクライアント・グループの作成

メニューより、「オブジェクト」 > 「暗号構成」 > 「OAuthクライアン
ト・グループ」を選択し、新規作成
グループ内のOAuthロールを指定。
ここでは、両方にチェックを入れる。
OAuthクライアントを選択。
29
© 2016 IBM Corporation
(再掲) OAuth構成手順概要

構成手順概要
1.
OAuthクライアントの登録
1.
2.
2.
AAAポリシー作成
1.
2.
3.
3.
OAuthクライアント・プロファイルの作成
OAuthクライアント・グループの作成
OAuth許可およびトークン・エンドポイント用 (Form認証用)
OAuth許可およびトークン・エンドポイント用 (Basic認証用)
リソース・サーバー適用ポイント用
AAAポリシーを使用してマルチプロトコル・ゲートウェイを構成
1.
2.
マルチプロトコル・ゲートウェイの作成
処理ポリシーの作成
1.
2.
3.
4.
5.
6.
3.
30
favicon用リクエスト・ルール
Form認証およびOAuth許可用リクエスト・ルール
Basic認証およびOAuth許可用リクエスト・ルール
リソース・サーバー適用ポイント用リクエスト・ルール
レスポンス・ルール
エラー・ルール
HTTPSフロント・サイド・ハンドラーの作成
© 2016 IBM Corporation
2. AAAポリシー作成 (1/13)
1.
OAuth許可およびトークン・エンドポイント用AAAポリシー (Form認
証用) (OAuth_AZ_Form)

メニューより、「オブジェクト」 >
「XML処理」 > 「AAAポリシー」を
選択し、フォーム認証用AAAポリシー
を新規作成
ID抽出方法を指定。
「HTMLフォーム・ベース認証」および
「OAuth」にチェックを入れる。
デフォルトで提供され
るHTMLフォームを使用。
ログインフォームを指定。
ここでは、「OAuth_HTMLForm」
を新規作成。
前手順で作成したOAuthクラ
イアント・グループを指定。
31
© 2016 IBM Corporation
2. AAAポリシー作成 (2/13)
1.
OAuth許可およびトークン・エンドポイント用AAAポリシー (Form認
証用) (OAuth_AZ_Form) (続き)
認証方式を指定。
ここでは、「AAA情報ファイルの使用」
を選択し、ファイルを指定する。
(ファイル例は次頁参照。)
32
© 2016 IBM Corporation
2. AAAポリシー作成 (3/13)

AAA情報ファイル (OAuth_AAAInfo.xml)

IDGローカルにデフォルトで提供される「store:///AAAInfo.xml」を編集
して使用
<?xml version="1.0" encoding="utf-8"?>
<AAAInfo xmlns="http://www.datapower.com/AAAInfo">
<FormatVersion>1</FormatVersion>
<Filename>local:///xml/OAuth_AAAInfo.xml</Filename>
<Summary>This is an example of the file format.</Summary>
<Authenticate>
<Username>user01</Username>
<Password>password</Password>
<OutputCredential>USER01</OutputCredential>
</Authenticate>
OutputCredentialがリソース・オーナーとなる
<Authenticate>
<Username>user02</Username>
<Password>password</Password>
<OutputCredential>USER02</OutputCredential>
</Authenticate>
</AAAInfo>
33
© 2016 IBM Corporation
2. AAAポリシー作成 (4/13)
1.
OAuth許可およびトークン・エンドポイント用AAAポリシー (Form認
証用) (OAuth_AZ_Form) (続き)
リソース抽出方法を指定。
「処理メタデータ」を選択し、デフォルト
で提供される「oauth-scope-metadata」
を指定する。
34
© 2016 IBM Corporation
2. AAAポリシー作成 (5/13)
1.
OAuth許可およびトークン・エンドポイント用AAAポリシー (Form認
証用) (OAuth_AZ_Form) (続き)
許可方式を指定。
ここでは許可制御をしないため、「すべて
の認証クライアントを許可」を選択する。
35
© 2016 IBM Corporation
2. AAAポリシー作成 (6/13)
2.
OAuth許可およびトークン・エンドポイント用AAAポリシー (Basic認
証用) (OAuth_AZ_Basic)

メニューより、「オブジェクト」
> 「XML処理」 > 「AAAポリシ
ー」を選択し、OAuth許可および
トークン・エンドポイント用AAA
ポリシーを新規作成
ID抽出方法を指定。
「HTTP認証ヘッダー」および
「OAuth」にチェックを入れる。
前手順で作成したOAuthクラ
イアント・グループを指定。
36
© 2016 IBM Corporation
2. AAAポリシー作成 (7/13)
2.
OAuth許可およびトークン・エンドポイント用AAAポリシー (Basic認
証用) (OAuth_AZ_Basic) (続き)
認証方式を指定。
ここでは、「AAA情報ファイルの使用」を選択し、
作成した「OAuth_AAAInfo.xml」を指定。
37
© 2016 IBM Corporation
2. AAAポリシー作成 (8/13)
2.
OAuth許可およびトークン・エンドポイント用AAAポリシー (Basic認
証用) (OAuth_AZ_Basic) (続き)
リソース抽出方法を指定。
「処理メタデータ」を選択し、デフォルト
で提供される「oauth-scope-metadata」
を指定する。
38
© 2016 IBM Corporation
2. AAAポリシー作成 (9/13)
2.
OAuth許可およびトークン・エンドポイント用AAAポリシー (Basic認
証用) (OAuth_AZ_Basic) (続き)
許可方式を指定。
前フェーズにてスコープ検査を行っているため、
「すべての認証クライアントを許可」を選択する。
39
© 2016 IBM Corporation
2. AAAポリシー作成 (10/13)
3.
リソース・サーバー適用ポイント用AAAポリシー (OAuth_RS)

メニューより、「オブジェクト
」 > 「XML処理」 > 「AAA
ポリシー」を選択し、 リソー
ス・サーバー適用ポイント用
AAAポリシーを新規作成
ID抽出方法を指定。
「OAuth」にチェックを入れる。
前手順で作成したOAuthクラ
イアント・グループを指定。
40
© 2016 IBM Corporation
2. AAAポリシー作成 (11/13)
3.
リソース・サーバー適用ポイント用AAAポリシー (OAuth_RS) (続き)
認証方式を指定。
「ID抽出」フェーズでトークンによるリク
エスト検査を行っているため、「許可
フェーズにIDトークンを渡す」を選択する。
41
© 2016 IBM Corporation
2. AAAポリシー作成 (12/13)
3.
リソース・サーバー適用ポイント用AAAポリシー (OAuth_RS) (続き)
リソース抽出方法を指定。
「クライアントにより送信されたURL」と
「処理メタデータ」を選択し、デフォルト
で提供される「oauth-scope-metadata」
を指定する。
42
© 2016 IBM Corporation
2. AAAポリシー作成 (13/13)
3.
リソース・サーバー適用ポイント用AAAポリシー (OAuth_RS) (続き)
許可方式を指定。
前フェーズにてトークン検査を行っているため、
「すべての認証クライアントを許可」を選択する。
43
© 2016 IBM Corporation
(再掲) OAuth構成手順概要

構成手順概要
1.
OAuthクライアントの登録
1.
2.
2.
AAAポリシー作成
1.
2.
3.
3.
OAuthクライアント・プロファイルの作成
OAuthクライアント・グループの作成
OAuth許可およびトークン・エンドポイント用 (Form認証用)
OAuth許可およびトークン・エンドポイント用 (Basic認証用)
リソース・サーバー適用ポイント用
AAAポリシーを使用してマルチプロトコル・ゲートウェイを構成
1.
2.
マルチプロトコル・ゲートウェイの作成
処理ポリシーの作成
1.
2.
3.
4.
5.
6.
3.
44
favicon用リクエスト・ルール
Form認証およびOAuth許可用リクエスト・ルール
Basic認証およびOAuth許可用リクエスト・ルール
リソース・サーバー適用ポイント用リクエスト・ルール
レスポンス・ルール
エラー・ルール
HTTPSフロント・サイド・ハンドラーの作成
© 2016 IBM Corporation
3. マルチプロトコル・ゲートウェイを構成 (1/11)
1.
マルチプロトコル・ゲートウェイの作成 (OAuthMPG)

メニューより、「コントロール・パネル」 > 「マルチプロトコル・ゲート
ウェイ」を選択して作成
⇒「2. 処理ポリシーの作成」へ
⇒「3. HTTPSフロント・サ
イド・ハンドラーの作成」へ
ここでは、バックエンドのサービスとしてXML Firewallを
使用するため、「静的バックエンド」を選択し、URLとし
てループバックアドレスとXML Firewallのポートを指定。
45
© 2016 IBM Corporation
3. マルチプロトコル・ゲートウェイを構成 (2/11)
1.
マルチプロトコル・ゲートウェイの作成 (OAuthMPG) (続き)
バックエンド・システムとHTTPSで通信する場合は、
SSLクライアント・プロファイルを構成する。
ここでは、バックエンドへのアクセスはHTTPを使
用するため省略。
応答タイプの指定。
ここでは、「非XML」を選択。
46
要求タイプの指定。
ここでは、「非XML」を選択。
© 2016 IBM Corporation
3. マルチプロトコル・ゲートウェイを構成 (3/11)
2.
処理ポリシーの作成 (OAuthPolicy)
1.
favicon用リクエスト・ルール (OAuthPolicy_rule_favicon)

「favicon.ico」に対するリクエストについては、何もせずにそのままバックエンドへ送信する
「クライアントからサーバー」を選択。
「マッチング」アクション
47
「結果」アクション
© 2016 IBM Corporation
3. マルチプロトコル・ゲートウェイを構成 (4/11)
2.
処理ポリシーの作成 (OAuthPolicy) (続き)
2.
Form認証およびOAuth許可用リクエスト・ルール (OAuthPolicy_rule_az_form)

Form認証を実施し、OAuth許可処理を行うルール
「クライアントからサーバー」を選択。
「マッチング」アクション
「照会パラメーターをXML
に変換する」アクション
(設定はデフォルト)
48
「結果」アクション
「AAA」アクション
(AAAポリシー「OAuth_AZ_Form」
を指定。)
© 2016 IBM Corporation
3. マルチプロトコル・ゲートウェイを構成 (5/11)
2.
処理ポリシーの作成 (OAuthPolicy) (続き)
3.
Basic認証およびOAuth許可用リクエスト・ルール (OAuthPolicy_rule_az_basic)

Basic認証を実施し、OAuth許可処理を行うルール
「クライアントからサーバー」を選択。
「マッチング」アクション
「照会パラメーターをXML
に変換する」アクション
(設定はデフォルト)
49
「結果」アクション
「AAA」アクション
(AAAポリシー「OAuth_AZ_Basic」
を指定。)
© 2016 IBM Corporation
3. マルチプロトコル・ゲートウェイを構成 (6/11)
2.
処理ポリシーの作成 (OAuthPolicy) (続き)
4.
リソース・サーバー適用ポイント用リクエスト・ルール (OAuthPolicy_rule_rs)

アクセス・トークン検査を行うルール
「クライアントからサーバー」を選択。
「マッチング」アクション
「照会パラメーターをXML
に変換する」アクション
(設定はデフォルト)
50
「結果」アクション
「AAA」アクション
(AAAポリシー「OAuth_RS」
を指定。)
© 2016 IBM Corporation
3. マルチプロトコル・ゲートウェイを構成 (7/11)
2.
処理ポリシーの作成 (OAuthPolicy) (続き)
5.
レスポンス・ルール (OAuthPolicy_rule_response)

ここでは、レスポンスに対する処理は何も実施しない
「サーバーからクライアント」を選択。
「マッチング」アクション
「結果」アクション
51
© 2016 IBM Corporation
3. マルチプロトコル・ゲートウェイを構成 (8/11)
2.
処理ポリシーの作成 (OAuthPolicy) (続き)
6.
エラー・ルール (OAuthPolicy_rule_error)

デフォルト (エラー・ルールがない場合)
は、処理エラーがSOAP/XMLになります。
処理ルール内のエラー時に、エラー・メッセージをJSON形式へ変換する処理を実施
「エラー」を選択。
「マッチング」アクション
「結果」アクション
「XSLTスタイルシートを使用
して変換する」を選択。
「フェッチ」アクション
「変換」アクション
任意のXMLファイルを作成し、
IDGローカルにアップロード。
dummy.xmlの例:
<a>dummy</a>
52
XSLTスタイルシートを作成し、IDG
ローカルにアップロード。 (次頁参照)
© 2016 IBM Corporation
3. マルチプロトコル・ゲートウェイを構成 (9/11)

XSLTスタイルシート (error.xsl)

エラー・メッセージ (サービス変数:error-message)をJSON形式で出力
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dp="http://www.datapower.com/extensions"
extension-element-prefixes="dp"
exclude-result-prefixes="dp">
<xsl:output method="text" encoding="utf-8" indent="no" media-type="application/json"/>
<xsl:template match="/">
<xsl:text>{"errorMsg" : "</xsl:text><xsl:value-of select="dp:variable('var://service/error-message')"/><xsl:text>"}</xsl:text>
</xsl:template>
</xsl:stylesheet>
53
© 2016 IBM Corporation
(参考) バックエンド・エラーの処理


バックエンド・サーバーからエラー・コードを
受信した場合のIDGでの処理を設定可能
設定箇所

マルチプロトコル・ゲートウェイの「拡張」タブ
の「バックエンド・エラーの処理」

「オン」 (デフォルト)


「オフ」


54
レスポンス・ルールで処理する
エラー・ルールで処理し、処理が正常終了した場合、
クライアントにエラー・ルールで指定した応答コード
を返す
エラー・ルール内で「変換 (Transform)」アクション
などを使用してエラー・コードの扱いを定義する必要
がある
© 2016 IBM Corporation
3. マルチプロトコル・ゲートウェイを構成 (10/11)
3.
HTTPSフロント・サイド・ハンドラーの作成 (OAuthFSH)
リクエストを受け付けるポート番号を指定。
ここでは、「5070」を使用する。
デフォルトからGETメソッドを追加。
SSLサーバー設定 (次頁参照)
55
© 2016 IBM Corporation
3. マルチプロトコル・ゲートウェイを構成 (11/11)
3.
HTTPSフロント・サイド・ハンドラーの作成 (OAuthFSH) (続き)
秘密鍵を指定。
サーバー証明書を指定。
56
© 2016 IBM Corporation
(参考) サーバー証明書および秘密鍵の作成

IDGにて自己署名証明書を生成可能

57
「管理」 > 「その他」 > 「暗号
ツール」
© 2016 IBM Corporation
実行結果例 (1/6)

アクセス許可要求 (Basic認証)

Webブラウザーにて以下のURLにアクセス
https://<IDG_IPAddress>:5070/oauth/authz?response_type=code&client_i
d=OAuthClient01&redirect_uri=https://localhost&scope=/getAccountInfo
%20/getCustomerInfo&state=MyTest
リソース・オーナーは許可サーバー上のユーザー名/パスワードを入力して認証
認証後、リソース・オーナーは許可するスコープを選択してSubmit
許可コード取得
58
© 2016 IBM Corporation
実行結果例 (2/6)

アクセス許可要求 (Form認証)

Webブラウザーにて以下のURLにアクセス
https://<IDG_IPAddress>:5070/form/oauth/authz?response_type=code&cli
ent_id=OAuthClient01&redirect_uri=https://localhost&scope=/getAccoun
tInfo%20/getCustomerInfo&state=MyTest
リソース・オーナーは許可サーバー上のユーザー名/パスワードを入力して認証
認証後、リソース・オーナーは許可するスコープを選択してSubmit
許可コード取得
59
© 2016 IBM Corporation
実行結果例 (3/6)

アクセス・トークン発行

cURLにて以下のコマンドを実行
curl -k https://<IDG_IPAddress>:5070/oauth/token -d
"grant_type=authorization_code&code=<Authorization_Code>&redirect_ur
i=https://localhost" --user OAuthClient01:passw0rd

応答電文:
{ "token_type":"bearer",
"access_token":"AAENT0F1dGhDbGllbnQwMRGCj7LJVASb6cEx82JLcoSVw3qEgYXI
1W3340IktnooV02aDzKZ6mLFkV3x88HpPz17_GKlqSvN3SFcLJd3YR94GKM8tpp8omrs
-yTyQQGLgwUOZy_sz3n44XgPv4VAOQ", "expires_in":3600,
"scope":"/getAccountInfo /getCustomerInfo",
"refresh_token":"AAEHtq9c8-YLOKSkQaxgyIW0VQ1uQUF7FfEtLG8hf8sEckgbLTakJd8a1CgRP8O5dh1fcG05MIMv3qp53W_y6TpygthAtv87O
mdjLM_i5U23Kf828-qWaJXa_R_B8UONFQ" }
60
© 2016 IBM Corporation
実行結果例 (4/6)

リソース・アクセス

cURLにて以下のコマンドを実行

/getAccountInfo
curl -k https://<IDG_IPAddress>:5070/getAccountInfo -H
"Authorization:Bearer <Access_Token>"

応答電文:
{
"name": "myAccount",
"balance":1.00
}

/getCustomerInfo
curl -k https://<IDG_IPAddress>:5070/getCustomerInfo -H
"Authorization:Bearer <Access_Token>"

応答電文:
[ { "id":0, "name":"USER01",
"access_token":"AAENT0F1dGhDbGllbnQwMRGCj7LJVASb6cEx82JLcoSVw3qEgYXI1W3340IktnooV
02aDzKZ6mLFkV3x88HpPz17_GKlqSvN3SFcLJd3YR94GKM8tpp8omrsyTyQQGLgwUOZy_sz3n44XgPv4VAOQ" } ]
61
© 2016 IBM Corporation
実行結果例 (5/6)

アクセス・トークンの検査

cURLにて以下のコマンドを実行
curl -k https://<IDG_IPAddress>:5070/oauth/token -d
"grant_type=urn:ibm:datapower:validate&access_token=<Access_Token>"
--user OAuthClient01:passw0rd

応答電文:

OK (トークンが有効な場合)
{ "valid":true, "token_type":"bearer", "client_id":"OAuthClient01",
"not_after":"133528131", "not_after_text":"2016-03-25T11:08:51Z",
"not_before":"133524531", "not_before_text":"2016-03-25T10:08:51Z",
"resource_owner":"USER01", "scope":"/getAccountInfo /getCustomerInfo" }

NG (トークンが期限切れの場合)
{ "valid":false }
62
© 2016 IBM Corporation
実行結果例 (6/6)

リフレッシュ・トークンによるアクセス・トークンの再発行

cURLにて以下のコマンドを実行
curl -k https://<IDG_IPAddress>:5070/oauth/token -d
"grant_type=refresh_token&refresh_token=<Refresh_Token>&scope=/getAc
countInfo%20/getCustomerInfo" --user OAuthClient01:passw0rd

応答電文:
{ "token_type":"bearer",
"access_token":"AAENT0F1dGhDbGllbnQwMX0mij_6CZvofVbL87RvVxhHPYOiNZiy
xpnm9eO-7Xz86MzeNw11_XBOYqTXezw5NobD_AIhVOHeEN8pS1HhzEvZONpVSvXghHPzmXJVf9t-FAfy10UPasIawztAZH0xg",
"expires_in":3600, "scope":"/getAccountInfo /getCustomerInfo",
"refresh_token":"AAG6viMfP_kwEE0YObrBuWju0bFpV9fnOA1lQdBPjgBiESyKld0fSBO5iU2pAMrjGcuGdW1BXd6Fe3jm5SeVWgsOToS4O1Pur6Ukq0BisnOtMqCR83lw92gp1LMNrBFvs"
}
63
© 2016 IBM Corporation
(参考) バックエンド・サーバーへの情報連携

HTTPヘッダーにリソース・オーナー、クライアントID、スコープを付
加することが可能

64
OAuthクライアント・プロファイルの「拡張」タブ > 「HTTPヘッダーの作
成対象」にて設定
© 2016 IBM Corporation
Tips:

許可コード

アクセストークン発行後は、同じ許可コードは有効期限内であっても再利用不可


リフレッシュトークン

有効なアクセストークンがある場合でもリフレッシュトークンで新規アクセストーク
ンを発行可能。その際、古いアクセス・トークンは失効されない。


ただし、冗長構成の場合は注意が必要です。詳細は当資料「IDGの冗長構成について」を参照
してください。
スコープ

IDGではスコープを厳密にチェックするため、正確に定義する必要がある。


65
そのため、有効なアクセストークンが複数できてしまうことが考えられます。
アクセストークン再発行に使用したリフレッシュトークンは、有効期限内であっても
再利用不可。


ただし、冗長構成の場合は注意が必要です。詳細は当資料「IDGの冗長構成について」を参照
してください。
例えば、許可スコープが「/getAccountInfo」の場合、「/getAccountInfo/xxxx」はスコー
プ検査により拒否される
許可スコープを「/getAccountInfo*」とすることで、「/getAccountInfo/xxxx」へのアクセ
スも許可される
© 2016 IBM Corporation
エラー応答例 (1/7)

OAuth処理エラー

例:不正なresponse_typeが指定された場合

リクエスト
curl -i -k
"https://<IDG_IPAddress>:5070/oauth/authz?response_type=test&client_id=OA
uthClient01&redirect_uri=https://localhost&scope=/getAccountInfo%20/getCu
stomerInfo&state=MyTest" --user user01:password

レスポンス

OAuthクライアント・プロファイルの「詳細エラー」設定にチェックがない場合
302 Processed
Location: https://localhost?error=unsupported_response_type&state=MyTest

OAuthクライアント・プロファイルの「詳細エラー」設定にチェックがある場合
302 Processed
Location:https://localhost?error=unsupported_response_type&error_descript
ion=Unsupported+response_type&state=MyTest
OAuth処理エラーはOAuth 2.0の仕様に準拠したエラー・レスポンスとなります。
詳細エラー (error_description)を応答させたい場合は設定が必要です。(当資料「1.
OAuthクライアントの登録 (3/5)」を参照。)
66
© 2016 IBM Corporation
エラー応答例 (2/7)

OAuth処理エラー (続き)

例:不正なスコープが指定された場合

リクエスト
curl -i -k
"https://<IDG_IPAddress>:5070/oauth/authz?response_type=code&client_id=OA
uthClient01&redirect_uri=https://localhost&scope=/getResouce&state=MyTest
" --user user01:password

レスポンス

OAuthクライアント・プロファイルの「詳細エラー」設定にチェックがない場合
302 Processed
Location: https://localhost?error=invalid_scope&state=MyTest

OAuthクライアント・プロファイルの「詳細エラー」設定にチェックがある場合
302 Processed
Location:
https://localhost?error=invalid_scope&error_description=Invalid+or+unsupp
orted+scope&state=MyTest
OAuth処理エラーはOAuth 2.0の仕様に準拠したエラー・レスポンスとなります。
詳細エラー (error_description)を応答させたい場合は設定が必要です。(当資料「1.
OAuthクライアントの登録 (3/5)」を参照。)
67
© 2016 IBM Corporation
エラー応答例 (3/7)

OAuth処理エラー (続き)

例:不正なgrant_typeが指定された場合

リクエスト
curl -i -k https://<IDG_IPAddress>:5070/oauth/token -d
"grant_type=test&code=AAK9YRSPjG3TrpyJKYr1RQ93uh_YMlJVt79g1zHozdUwFHsLKXW
pNU7ffoxokAvoQJ10cwuFtPuM2RnPnuVH_Is_qMv8Ns9TLMwAm2-vJDbWCaFezS5l_9djFnmACUYNfY&redirect_uri=https://localhost" --user
OAuthClient01:passw0rd

レスポンス

OAuthクライアント・プロファイルの「詳細エラー」設定にチェックがない場合
400 Processed
{ "error":"unsupported_grant_type "}
OAuthクライアント・プロファイルの「詳細エラー」設定にチェックがある場合
400 Processed
{ "error":"unsupported_grant_type", "error_description":"grant_type or code not
supported" }

OAuth処理エラーはOAuth 2.0の仕様に準拠したエラー・レスポンスとなります。
詳細エラー (error_description)を応答させたい場合は設定が必要です。(当資料「1.
OAuthクライアントの登録 (3/5)」を参照。)
68
© 2016 IBM Corporation
エラー応答例 (4/7)

OAuth処理エラー (続き)

例:クライアント認証失敗 (不正なクライアント・シークレット)

リクエスト
curl -i -k https://<IDG_IPAddress>:5070/oauth/token -d
"grant_type=authorization_code&code=AAKMMjbTa5zKfbhWN2nj1gmRoz5Fe07qFbSZd
Y6JYK8PuBcmwKvas9i0lDgkRilpqEtToKHUzNCDS674UOp6dLyV7XlmaU66EhCTfchPi4XyjZNFT_ztQn2Lfy6gnpIJg8&redirect_uri=https://localhost" --user
OAuthClient01:12345

レスポンス

OAuthクライアント・プロファイルの「詳細エラー」設定にチェックがない場合
401 Processed
{ "error":"invalid_client"}

OAuthクライアント・プロファイルの「詳細エラー」設定にチェックがある場合
401 Processed
{ "error":"invalid_client", "error_description":"Missing or invalid
client_secret" }
OAuth処理エラーはOAuth 2.0の仕様に準拠したエラー・レスポンスとなります。
詳細エラー (error_description)を応答させたい場合は設定が必要です。(当資料「1.
OAuthクライアントの登録 (3/5)」を参照。)
69
© 2016 IBM Corporation
エラー応答例 (5/7)

OAuth処理エラー (続き)

例:許可コードの有効期限が切れている場合

リクエスト
curl -i -k https://<IDG_IPAddress>:5070/oauth/token -d
"grant_type=authorization_code&code=AAJO1PYnapEAYNDYftNZT3OiWk2eYoQj3RTjX
NIn6CTcX3lTOGwnzagALZsE-Ahb046if1rTL8GIaYaZyyjS0OplciatSSAExWkQ5mqgVGHhp83Tgx-_WyWuXdAwMfXHSE&redirect_uri=https://localhost" -user OAuthClient01:passw0rd

レスポンス

OAuthクライアント・プロファイルの「詳細エラー」設定にチェックがない場合
400 Processed
{ "error":"invalid_grant" }

OAuthクライアント・プロファイルの「詳細エラー」設定にチェックがある場合
400 Processed
{ "error":"invalid_grant", "error_description":"*[OAuthClient01] code
expired*" }
OAuth処理エラーはOAuth 2.0の仕様に準拠したエラー・レスポンスとなります。
詳細エラー (error_description)を応答させたい場合は設定が必要です。(当資料「1.
OAuthクライアントの登録 (3/5)」を参照。)
70
© 2016 IBM Corporation
エラー応答例 (6/7)

OAuth処理エラー (続き)

例:アクセス・トークンの有効期限が切れている場合

リクエスト
curl -i -k https://<IDG_IPAddress>:5070/getCustomerInfo -H
"Authorization:Bearer AAENT0F1dGhDbGllbnQwMSNTqk4K8nZ5fvO_DH6KGZjX6BwQMKuqX_kN6uOEwvdyzmR_2887rMfod7VMaO3ulVOhjD1shPvtvID5MxzBPTY5tD
UVM5Hm7khv_sE_l-sZEx4d47Eig86dgUSntgOBA“

レスポンス

OAuthクライアント・プロファイルの「詳細エラー」設定にチェックがない場合
401 Unauthorized
WWW-Authenticate: Bearer error="invalid_token"
{"errorMsg" : "Failed to verify OAuth information."}

OAuthクライアント・プロファイルの「詳細エラー」設定にチェックがある場合
401 Unauthorized
WWW-Authenticate: Bearer
error="invalid_token",error_description="*[OAuthClient01] access_token
expired*"
{"errorMsg" : "Failed to verify OAuth information."}
OAuth処理エラーはOAuth 2.0の仕様に準拠したエラー・レスポンスとなります。
詳細エラー (error_description)を応答させたい場合は設定が必要です。(当資料「1.
OAuthクライアントの登録 (3/5)」を参照。)
71
© 2016 IBM Corporation
エラー応答例 (7/7)

IDG内部処理ルール・エラー

例:アクセス許可要求時に不正なクライアントIDが指定されている場合

リクエスト
curl -i -k
"https://<IDG_IPAddress>:5070/oauth/authz?response_type=code&client_id=OA
uthClient99&redirect_uri=https://localhost&scope=/getAccountInfo%20/getCu
stomerInfo&state=MyTest" --user user01:password

レスポンス
400 Error
{"errorMsg" : "Failed to verify OAuth information."}

例:不正なユーザーからのアクセス許可要求

リクエスト
curl -i -k
"https://9.188.255.85:5070/oauth/authz?response_type=code&client_id=OAuth
Client01&redirect_uri=https://localhost&scope=/getAccountInfo%20/getCusto
merInfo&state=MyTest" --user user99:password

レスポンス
401 Unauthorized
{"errorMsg" : "Rejected by policy."}
72
エラー電文はエラー・ルールにて定義したも
のです。(当資料「3. マルチプロトコル・
ゲートウェイを構成 (8-9/11)」を参照。)
© 2016 IBM Corporation
OAuthプロセスのカスタマイズ
73
© 2016 IBM Corporation
OAuthプロセスのカスタマイズ (1/3)

IDGではXSLTまたはGatewayScriptを使用して、以下のOAuth処理のカスタマ
イズが可能

カスタマイズOAuthクライアント


XSLTまたはGatewayScriptにてロールおよび動作をより細かく定義可能
カスタム・スコープ検査



デフォルトでは、スコープ検査に正規表現を使用
カスタム・スコープ検査により、スコープ一覧を使用した検査などが可能
以下の場合に使用可能




許可フォームのカスタマイズ


リソース・オーナーが許可要求を事前承認するためのHTMLフォームのカスタマイズが可能
リソース所有者カスタム処理



デフォルトでは、IDGによってリソース・オーナーの資格情報が判別される
カスタム処理により、認証から取得したリソース・オーナーに関する情報をオーバーライド可
能
以下の場合に使用可能



74
許可要求時 (authorization_request)
アクセス・トークン要求時 (access_request)
リソース要求時 (resource_request)
リソース・オーナーに許可フォームを示す場合 (authorization_request)
許可コード発行する場合 (authorization_request)
アクセス・トークン発行する場合 (access_request)
© 2016 IBM Corporation
OAuthプロセスのカスタマイズ (2/3)

IDGではXSLTまたはGatewayScriptを使用して、以下のOAuth処理の
カスタマイズが可能 (続き)

追加OAuth処理
OAuth処理
説明
authorization_form
リソース・オーナーが許可フォームをIDGに返答後の処理のカスタマイズ。
グラント・タイプが許可コードおよびインプリシットの場合に使用可能。
authorization_request
許可コード生成後の処理のカスタマイズ。
OAuthクライアントへ許可コード送信時に追加情報を付加可能。
access_request
アクセス・トークンを生成してからOAuthクライアントへ送信するまでの間の処理のカスタマイズ。
OAuthクライアントへアクセス・トークン送信時にJOSNメッセージに追加情報を付加可能。
validate_request
アクセス・トークン検査要求に対して、検査成功後の処理のカスタマイズ。
OAuthクライアントへの検査結果応答時のJSONメッセージに追加情報を付加可能。
resource_request
リソース要求に対して、アクセス・トークン検査成功後の処理のカスタマイズ。
リソース・サーバーに対するリクエストにHTTPヘッダーなど追加情報 (例えばリソース・オーナーのID
情報など)を付加可能。
revoke_request
トークン失効要求を受信した際の処理のカスタマイズ。
check_revocation_request
トークン検査時に失効チェックを実施することが可能。
preapproved_check
リソース・オーナーが許可要求を事前承認するか、事前拒否するか、許可フォームを表示するかの検査。
許可フォームのバイパスが可能。
グラント・タイプが許可コードおよびインプリシットの場合に使用可能。
miscinfo_request
許可コードやトークンに追加情報 (最大512文字)を付与可能。
許可サーバーは各種情報をトークンに追加し、OAuthクライアントへ応答する。
75
© 2016 IBM Corporation
OAuthプロセスのカスタマイズ (3/3)
リソース・オーナー
IBM DataPower Gateway (IDG)
許可サーバー・エンドポイント&
リソース・サーバー適用ポイント
OAuthクライアント
リソース・サーバー
アクセス許可要求
認証
Basic Authentication
許可フォーム
Scope Accept
2. 許可フォームのカスタマイズ
11. preapproved_check処理
4. authorization_form処理
1.
カスタム・スコープ検査
カスタム・スコープ検査
Publish code
12.
miscinfo_request処理
miscinfo_request処理
許可コード
5. authorization_request処理
アクセス・トークン発行要求
3. リソース所有者カスタム処理
Validate code & Publish token
アクセス・トークン
6. access_request処理
リソース要求
10. check_revocation_request処理
Check token
8. resource_request処理
アクセス・トークン検査要求
Validate token
7. validate_request処理
アクセス・トークン失効要求
Revoke token
success
76
9. revoke_request処理
© 2016 IBM Corporation
カスタム・スコープ検査 (1/5)
1. カスタム・スコープ検査

設定方法

OAuthクライアント・プロファイルにて設定



カスタマイズ・サンプル

許可要求に含まれるスコープが事前定義した許可スコープ一覧に合致してい
るかを検査し、合致しているスコープのみを許可フォームに表示する

実装方法


77
メニューより「オブジェクト」 > 「暗号構成」 > 「OAuthクライアント・プロ
ファイル」で、カスタマイズしたいプロファイルを選択表示し、「メイン」タブの
「カスタマイズ・スコープ検査」にチェックを入れる
「スコープ・カスタマイズ処理」にて作成したXSLT (またはGatewayScript)を指
定する
許可スコープ一覧の定義ファイル (OAuth_Scopes.xml)の作成
スコープ・カスタマイズ処理のXSLTファイル (dp-custom-validate-scope.xsl)の
作成
© 2016 IBM Corporation
カスタム・スコープ検査 (2/5)
1. カスタム・スコープ検査

許可スコープ一覧の定義ファイル (OAuth_Scopes.xml)
<?xml version="1.0" encoding="UTF-8"?>
<scopes>
<scope>/getAccountInfo</scope>
<scope>/getCustomerInfo</scope>
</scopes>
78
© 2016 IBM Corporation
カスタム・スコープ検査 (3/5)
1. カスタム・スコープ検査

スコープ・カスタマイズ処理のXSLTファイル (dp-custom-validatescope.xsl)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:dp="http://www.datapower.com/extensions"
xmlns:dpconfig="http://www.datapower.com/param/config"
xmlns:dpfunc="http://www.datapower.com/extensions/functions"
xmlns:str="http://exslt.org/strings"
xmlns:regexp="http://exslt.org/regular-expressions"
extension-element-prefixes="dp dpfunc"
exclude-result-prefixes="dp dpfunc dpconfig str regexp">
許可スコープ定義ファイルの読み込み
<xsl:template match="/">
<xsl:variable name="props">
<xsl:copy-of select="document(concat('local:///xml/OAuth_Scopes.xml'))"/>
</xsl:variable>
<xsl:if test="string($props) = ''">
<dp:set-variable name="'var://context/error/errMsg'" value="concat('Error on loading Property XML File
(XMLName=OAuth_Scopes.xml)')" />
<dp:reject/>
<xsl:message dp:type="xslt" dp:priority="warn" terminate="yes" />
</xsl:if>
<xsl:variable name="translated-scope-from-url">
<xsl:value-of select="translate(/input/scope, '%20', ' ')"/>
</xsl:variable>
79
リクエストのスコープの”%20”を半角ス
ペースに変換 (Form認証用)
© 2016 IBM Corporation
カスタム・スコープ検査 (4/5)
1. カスタム・スコープ検査

スコープ・カスタマイズ処理のXSLTファイル (dp-custom-validatescope.xsl) (続き)
<xsl:variable name="splited-scopes">
<xsl:copy-of select="str:tokenize($translated-scope-from-url, ' ')"/>
</xsl:variable>
<xsl:variable name="resource">
<xsl:for-each select="$splited-scopes/token">
<xsl:if test="text() = $props//scope">
<xsl:value-of select="text()"/>
<xsl:text> </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:variable>
スコープを半角スペース区切りで分割
分割したスコープから、許可スコープ定
義ファイルと一致するもののみを抽出
<result>
<xsl:choose>
<xsl:when test="$resource != ''">
<dp:set-request-header name="'X-Account-Modified'" value="'yes'"/>
<scope><xsl:value-of select="normalize-space($resource)"/></scope>
</xsl:when>
<xsl:otherwise>
<error>requested scope is not allowed</error>
</xsl:otherwise>
</xsl:choose>
</result>
</xsl:template>
</xsl:stylesheet>
80
© 2016 IBM Corporation
カスタム・スコープ検査 (5/5)
1. カスタム・スコープ検査

確認結果

リクエストURL
https://9.188.255.85:5070/oauth/authz?response_type=code&client_id=O
AuthClient01&redirect_uri=https://localhost&scope=/getAccountInfo%20
/getCustomerInfo%20/getProfile&state=MyTest

許可フォーム
許可されていないスコープ
許可されるスコープのみ表示される
81
© 2016 IBM Corporation
許可フォームのカスタマイズ (1/3)
2. 許可フォームのカスタマイズ

設定方法

OAuthクライアント・プロファイルにて設定


メニューより「オブジェクト」 > 「暗号構成」 > 「OAuthクライアント・プロ
ファイル」で、カスタマイズしたいプロファイルを選択表示し、「メイン」タブ
の「許可フォーム」にて、カスタマイズしたXSLT (またはGatewayScript)を指
定する
カスタマイズ・サンプル

スコープの文字列を日本語に変換して許可フォームに表示する

実装方法

カスタマイズしたXSLTファイル (OAuth-Generate-HTML_custom.xsl)の作成

82
ここでは、デフォルトで提供される「store:///OAuth-Generate-HTML.xsl」をカスタ
マイズ
© 2016 IBM Corporation
許可フォームのカスタマイズ (2/3)
2. 許可フォームのカスタマイズ

OAuth-Generate-HTML_custom.xsl
<body>
~~~ 途中省略 ~~~
<xsl:for-each select="$scopes">
<xsl:choose>
<xsl:when test="text() = '/getAccountInfo'">
<br/><input type="checkbox" checked="yes" name="selectedscope" value="{text()}"/><xsl:value-of
select="'アカウント照会'"/>
</xsl:when>
<xsl:when test="text() = '/getCustomerInfo'">
<br/><input type="checkbox" checked="yes" name="selectedscope" value="{text()}"/><xsl:value-of
select="'顧客照会'"/>
</xsl:when>
<xsl:otherwise>
<br/><input type="checkbox" checked="yes" name="selectedscope" value="{text()}"/><xsl:value-of
select="text()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
<br/><br/>
</xsl:if>
~~~ 途中省略 ~~~
</body>
83
© 2016 IBM Corporation
許可フォームのカスタマイズ (3/3)
2. 許可フォームのカスタマイズ

確認結果

リクエストURL
https://9.188.255.85:5070/oauth/authz?response_type=code&client_id=O
AuthClient01&redirect_uri=https://localhost&scope=/getAccountInfo%20
/getCustomerInfo&state=MyTest

84
許可フォーム
© 2016 IBM Corporation
リソース所有者カスタム処理 (1/6)
3. リソース所有者カスタム処理

設定方法

OAuthクライアント・プロファイルにて設定



カスタマイズ・サンプル

許可コード発行時にリソース・オーナーの情報を暗号化する

実装方法

85
メニューより「オブジェクト」 > 「暗号構成」 > 「OAuthクライアント・プロ
ファイル」で、カスタマイズしたいプロファイルを選択表示し、「拡張」タブの
「リソース所有者カスタム処理」にチェックを入れる
「リソース所有者処理」で作成したXSLT (またはGatewayScript)を指定する
カスタマイズしたXSLTファイル (dp-encrypted-resource-owner.xsl)の作成
© 2016 IBM Corporation
リソース所有者カスタム処理 (2/6)
3. リソース所有者カスタム処理

dp-encrypted-resource-owner.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:dp="http://www.datapower.com/extensions"
xmlns:dpconfig="http://www.datapower.com/param/config"
xmlns:dpfunc="http://www.datapower.com/extensions/functions"
extension-element-prefixes="dp dpfunc"
exclude-result-prefixes="dp dpfunc dpconfig">
<xsl:template match="/">
<result>
<!-- encrypt the credential, so it will not be shown on the html page -->
<xsl:variable name="oauth-identity" select="/input/identity/entry[@type='oauth']"/>
<!-- determine the actual resource owner identity -->
<xsl:variable name="name">
<xsl:choose>
<xsl:when test="string(/input//mapped-credentials//username) != ''">
<xsl:value-of select="/input//mapped-credentials//username"/>
</xsl:when>
<xsl:when test="string(/input//mapped-credentials//dn) != ''">
<xsl:value-of select="/input//mapped-credentials//dn"/>
</xsl:when>
<xsl:when test="string(/input//mapped-credentials/entry[@type='xmlfile']/*[localname()='OutputCredential']/text()) != ''">
<xsl:value-of select="/input//mapped-credentials/entry[@type='xmlfile']/*[localname()='OutputCredential']/text()"/>
</xsl:when>
<xsl:when test="string(/input/credentials//usernname) != ''">
<xsl:value-of select="/input/credentials//usernname"/>
</xsl:when>
86
リソース・オーナー情報
の指定
© 2016 IBM Corporation
リソース所有者カスタム処理 (3/6)
3. リソース所有者カスタム処理

dp-encrypted-resource-owner.xsl (続き)
<xsl:when test="string(/input/credentials//usernname) != ''">
リソース・オーナー情報
<xsl:value-of select="/input/credentials//usernname"/>
の指定
</xsl:when>
<xsl:when test="string(/input/identity//entry[@type='oauth']//resource_owner) != ''">
<xsl:value-of select="/input/identity//entry[@type='oauth']//resource_owner"/>
</xsl:when>
<xsl:when test="string(/input/identity//entry[@type='oauth']//username) != ''">
<xsl:value-of select="/input/identity//entry[@type='oauth']//username"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="/input/identity//usernname"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:when test="$oauth-identity//oauth-id/@type = 'authorization_request'">
<!-- this only occurs during initial request with either authorization code or implicit grant type -->
<resource-owner-name><xsl:value-of select="dp:encrypt-string('http://www.w3.org/2001/04/xmlenc#aes256-cbc',
'hex:8374613847475628394384524354234243543254371643821764398714348900', $name)"/></resource-owner-name>
</xsl:when>
<xsl:otherwise>
<resource-owner-name><xsl:value-of select="$name"/></resource-owner-name>
</xsl:otherwise>
リソース・オーナー情報を
</xsl:choose>
暗号化してオーバーライド
</result>
</xsl:template>
</xsl:stylesheet>
87
© 2016 IBM Corporation
リソース所有者カスタム処理 (4/6)
3. リソース所有者カスタム処理

88
リソース・オーナー暗号化結果
© 2016 IBM Corporation
リソース所有者カスタム処理 (5/6)
3. リソース所有者カスタム処理

リソース・サーバーに対してリソース・オーナー情報を連携する場合な
どは、以下のコードで復号化可能

例:追加OAuth処理のカスタマイズにより復号化
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:dp="http://www.datapower.com/extensions"
xmlns:dpconfig="http://www.datapower.com/param/config"
xmlns:dpfunc="http://www.datapower.com/extensions/functions"
extension-element-prefixes="dp dpfunc"
resource_request処理のカスタマイズに
exclude-result-prefixes="dp dpfunc dpconfig">
より復号化し、ヘッダーに追加
<xsl:template match="/">
<xsl:choose>
<xsl:when test="/input/operation = 'resource_request'">
<xsl:variable name="result" select="/input/container/identity/entry[@type='oauth']/oauth-verified[@state='ok']/result" />
<xsl:variable name="resOwner" select="$result/verified-access-token/resource_owner" />
<xsl:variable name="decrypted" select="dp:decrypt-data('http://www.w3.org/2001/04/xmlenc#aes256-cbc',
'hex:8374613847475628394384524354234243543254371643821764398714348900',$resOwner)"/>
<dp:set-request-header name="'DP-ResourceOwner'" value="$decryptedOwner"/>
</xsl:when>
<xsl:otherwise />
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
89
© 2016 IBM Corporation
リソース所有者カスタム処理 (6/6)
3. リソース所有者カスタム処理

90
リソース・オーナー復号化結果
© 2016 IBM Corporation
追加OAuth処理

設定方法

OAuthクライアント・プロファイルにて設定

91
メニューより「オブジェクト」 > 「暗号構成」 > 「OAuthクライアント・プロ
ファイル」で、カスタマイズしたいプロファイルを選択表示し、「拡張」タブの
「追加OAuth処理」にて作成したXSLTファイル (またはGatewayScript)を指定
する
© 2016 IBM Corporation
追加OAuth処理 – authorization_request (1/3)
5. authorization_request処理

authorization_request処理のカスタマイズ・サンプル

許可コード応答時に追加情報 (ここでは、リソース・オーナーのユーザー
名)を付加する

実装方法

92
カスタマイズしたXSLTファイル (add-process_az-request.xsl)の作成
© 2016 IBM Corporation
追加OAuth処理 – authorization_request (2/3)
5. authorization_request処理

add-process_az-request.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:dp="http://www.datapower.com/extensions"
xmlns:dpconfig="http://www.datapower.com/param/config"
xmlns:dpfunc="http://www.datapower.com/extensions/functions"
extension-element-prefixes="dp dpfunc"
exclude-result-prefixes="dp dpfunc dpconfig">
authorization_request処理の操作
<xsl:template match="/">
<xsl:choose>
<xsl:when test="/input/operation = 'authorization_request'">
<xsl:variable name="clientid" select="/input/container/identity/entry[@type = 'oauth']//OAuthSupportedClient/client-id"/>
<xsl:choose>
クライアントIDが”OAuthClient01”の場合、
<xsl:when test="$clientid = 'OAuthClient01'">
<xsl:if test="/input/container/identity/entry//username[1]">
<result>に<username>を付加
<result>
<username><xsl:value-of select="/input/container/identity/entry//username[1]"/></username>
</result>
</xsl:if>
</xsl:when>
<xsl:when test="/input/container/identity/entry[@type = 'oauth']//OAuthSupportedClient/client-id = 'OtherClient'">
<!-- this set information in a context variable for future processing -->
<dp:set-variable name="'var://context/MYOAuth/Logging'" value="concat('code:', $clientid, ':', /input/result/code)"/>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
93
© 2016 IBM Corporation
追加OAuth処理 – authorization_request (3/3)
5. authorization_request処理

確認結果 (ブラウザー)

アクセス許可要求 (「user01」でBasic認証)
https://<IDG_IPAddress>:5070/oauth/authz?response_type=code&client_id=OAu
thClient01&redirect_uri=https://localhost&scope=/getAccountInfo%20/getCus
tomerInfo&state=MyTest

許可コード発行結果
許可コード応答時に
ユーザー名が含まれる
94
© 2016 IBM Corporation
追加OAuth処理 – access_request (1/3)
6. access_request処理

access_request処理のカスタマイズ・サンプル

アクセス・トークン要求に対する応答メッセージに追加情報 (ここでは、
OAuthクライアントのクライアントIDと任意のID)を付加する

実装方法


カスタマイズしたXSLTファイル (add-process_access-request.xsl)の作成
add-process_access-request.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:dp="http://www.datapower.com/extensions"
xmlns:dpconfig="http://www.datapower.com/param/config"
xmlns:dpfunc="http://www.datapower.com/extensions/functions"
extension-element-prefixes="dp dpfunc"
exclude-result-prefixes="dp dpfunc dpconfig">
access_request処理の操作
<xsl:template match="/">
<xsl:choose>
<xsl:when test="/input/operation = 'access_request'">
<xsl:variable name="clientid" select="/input/container/identity/entry[@type = 'oauth']//OAuthSupportedClient/client-id"/>
(次頁へ続く)
95
© 2016 IBM Corporation
追加OAuth処理 – access_request (2/3)
6. access_request処理

add-process_access-request.xsl (続き)
クライアントIDが”OAuthClient01”の場合、
<xsl:choose>
<xsl:when test="$clientid = 'OAuthClient01'">
<result>に<username>と<id_token>
<xsl:if test="/input/container/identity/entry//username[1]">
を付加
<result>
<username><xsl:value-of select="/input/container/identity/entry//username[1]"/></username>
<!-- this allow you to provide your own id_token support -->
<id_token><xsl:value-of select="'1234567890'"/></id_token>
</result>
</xsl:if>
</xsl:when>
<xsl:when test="/input/container/identity/entry[@type = 'oauth']//OAuthSupportedClient/client-id = 'OtherClient'">
<!-- this set information in a context variable for future processing -->
<dp:set-variable name="'var://context/MYOAuth/Logging'" value="concat('access_token:', $clientid, ':',
/input/result/access_token)"/>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
96
© 2016 IBM Corporation
追加OAuth処理 – access_request (3/3)
6. access_request処理

確認結果 (cURL)
$ curl -i -k https://9.188.255.85:5070/oauth/token -d
"grant_type=authorization_code&code=AAJjQSAGj_hJqgUv9cJCPZOKnQB25Yn09ZsJhNIKpVIWJDfKCKeWV
tAShg2sv2elVLmmw36_AkvxXXRqcfwY2jnyMZR5kUQT4vHjgNz0MM2ubE1XVjR7ZOInxh0TM2x4pSY&redirect_u
ri=https://localhost" --user OAuthClient01:passw0rd
% Total
% Received % Xferd Average Speed
Time
Time
Time Current
Dload Upload
Total
Spent アクセス・トークン発行要求
Left Speed
100658
0
461 100
197
1477
631 --:--:-- --:--:-- --:--:-- 1557
101HTTP/1.1 200 OK
X-Backside-Transport: FAIL FAIL
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
アクセス・トークン発行時の応答にク
Cache-Control: private, no-store, no-cache, must-revalidate
ライアントIDと任意のIDが付加される
Pragma: no-cache
{ "token_type":"bearer",
"access_token":"AAENT0F1dGhDbGllbnQwMZTLYZeJqUh5RafKoFv7eBBztOXqQenmIMXHU8h9R8ws51VkChbd3
1qCzArFJ9AzGON2DoLRUyME-kM8KNc1eu4hAwYSXzbpvpR__UE1AyXCDbpUGUe1J0NK-zuSFIowEw",
"expires_in":3600, "scope":"/getAccountInfo /getCustomerInfo",
"refresh_token":"AAHD7ghQrJu51NJHXJHM_5hdPRjOPj6qzEIvvunS80hms3wZBJxuEWRug6G7QiOPps38R5N4oRmFILodKmePABOCxWdSjAO-G3LihWYeIwntmFAeaaiEx-3Z1lhY30CvY", "username":"OAuthClient01", "id_token":"1234567890" }
97
© 2016 IBM Corporation
追加OAuth処理 – validate_request (1/3)
7. validate_request処理

validate_request処理のカスタマイズ・サンプル

アクセス・トークン検査要求に対する応答メッセージに追加情報 (ここでは、
IDGが生成するトランザクションID)を付加する

実装方法

98
カスタマイズしたXSLTファイル (add-process_validate-request.xsl)の作成
© 2016 IBM Corporation
追加OAuth処理 – validate_request (2/3)
7. validate_request処理

add-process_validate-request.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:dp="http://www.datapower.com/extensions"
xmlns:dpconfig="http://www.datapower.com/param/config"
xmlns:dpfunc="http://www.datapower.com/extensions/functions"
extension-element-prefixes="dp dpfunc"
exclude-result-prefixes="dp dpfunc dpconfig">
validate_request処理の操作
<xsl:template match="/">
<xsl:choose>
<xsl:when test="/input/operation = 'validate_request'">
<!-<result>
<addinfo>ddd</addinfo>
...
<times type='json:number'>text</times>
レスポンスにトランザクションIDを付加
</result>
-->
<result>
<uuid><xsl:value-of select="dp:generate-uuid()"/></uuid>
</result>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
99
© 2016 IBM Corporation
追加OAuth処理 – validate_request (3/3)
7. validate_request処理

確認結果 (cURL)
$ curl -i -k https://9.188.255.85:5070/oauth/token -d
"grant_type=urn:ibm:datapower:validate&access_token=AAENT0F1dGhDbGllbnQwMTBKsybiacSbktaT6_rR1by53Hdf6FoCcDhZE8itsjRZeRodpeUGb5x3ENpItuK5qo2zEUvhHx0hyFz6mwIp7oD2fBm_jWBXL0qrmuSSq9EYhKrrD4wG9kH
oMM9P1OZQ" --user OAuthClient01:passw0rd
% Total
% Received % Xferd Average Speed
Time
Time
Time Current
Dload Upload
Total
Spent アクセス・トークン検査要求
Left Speed
100
521
0
320 100
201
1077
676 --:--:-- --:--:-- --:--:-- 1077
HTTP/1.1 200 OK
X-Backside-Transport: FAIL FAIL
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
応答メッセージにIDGが生成するト
Cache-Control: private, no-store, no-cache, must-revalidate
ランザクションIDが付加される
Pragma: no-cache
{ "valid":true, "token_type":"bearer", "client_id":"OAuthClient01",
"not_after":"133777339", "not_after_text":"2016-03-28T08:22:19Z",
"not_before":"133773739", "not_before_text":"2016-03-28T07:22:19Z",
"resource_owner":"USER01", "scope":"/getAccountInfo /getCustomerInfo", "uuid":"39df2d82f1f2-4d1d-887f-b25ceb27abbb" }
100
© 2016 IBM Corporation
追加OAuth処理 – resource_request (1/3)
8. resource_request処理

resource_request処理のカスタマイズ・サンプル

保護リソースへのアクセス時に以下の処理を行う



実装方法

101
IDGコンテキスト変数に情報 (ここでは、OAuthクライアントIDとリソース・
オーナー名)を格納
リクエスト・ヘッダーに情報 (ここでは、クライアントID)を付加
カスタマイズしたXSLTファイル (add-process_resource-request.xsl)の作成
© 2016 IBM Corporation
追加OAuth処理 – resource_request (2/3)
8. resource_request処理

add-process_resource-request.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:dp="http://www.datapower.com/extensions"
xmlns:dpconfig="http://www.datapower.com/param/config"
xmlns:dpfunc="http://www.datapower.com/extensions/functions"
extension-element-prefixes="dp dpfunc"
exclude-result-prefixes="dp dpfunc dpconfig">
resource_request処理の操作
<xsl:template match="/">
<xsl:choose>
<xsl:when test="/input/operation = 'resource_request'">
<xsl:variable name="clientid" select="/input/container/identity/entry[@type = 'oauth']//OAuthSupportedClient/client-id"/>
<xsl:if test="$clientid = 'OAuthClient01'">
<dp:set-variable name="'var://context/MYOAuth/Logging'" value="concat('resource:', $clientid, ':',
/input/container/identity/entry//username[1])"/>
<dp:set-request-header name="'ForBackEnd'" value="$clientid"/>
</xsl:if>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
クライアントIDが”OAuthClient01”の場合、
</xsl:template>
</xsl:stylesheet>
コンテキスト変数にクライアントIDとリ
ソース・オーナー名を格納し、リクエス
ト・ヘッダーにクライアントIDを付加
102
© 2016 IBM Corporation
追加OAuth処理 – resource_request (3/3)
8. resource_request処理

確認結果 (cURL)

リソース要求
curl -i -k https://<IDG_IPAddress>:5070/getCustomerInfo -H
"Authorization:Bearer <Access_Token>"

カスタマイズ処理後のリクエスト・ヘッダーとコンテキスト変数
リクエスト・ヘッダー
コンテキスト変数
コンテキスト変数にクラ
イアントIDとリソース・
オーナー名が付加される
ForBackEndヘッダーにク
ライアントIDが付加される
103
© 2016 IBM Corporation
追加OAuth処理 – preapproved_check (1/3)
11. preapproved_check処理

preapproved_check処理のカスタマイズ・サンプル

リソース・オーナーに対する許可要求を事前承認し、許可フォームをバイパ
スする

実装方法

104
カスタマイズしたXSLTファイル (add-process_preapproved-check.xsl)の作成
© 2016 IBM Corporation
追加OAuth処理 – preapproved_check (2/3)
11. preapproved_check処理

add-process_preapproved-check.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:dp="http://www.datapower.com/extensions"
xmlns:dpconfig="http://www.datapower.com/param/config"
xmlns:dpfunc="http://www.datapower.com/extensions/functions"
extension-element-prefixes="dp dpfunc"
exclude-result-prefixes="dp dpfunc dpconfig">
preapproved_checkt処理の操作
<xsl:template match="/">
<xsl:choose>
<xsl:when test="/input/operation = 'preapproved_check'">
<!-<result>
<approved>yes|no</approved> return an empty node will force the authorization form to be displayed
</result>
-->
クレデンシャルが”USER01”の場合、
<xsl:choose>
<approved>の値をyesに設定
<xsl:when test="/input/container/credentials/entry = 'USER01'">
<result><approved>yes</approved></result>
</xsl:when>
<xsl:when test="/input/container/credentials/entry = 'notauthenticated'">
<result><approved>no</approved></result>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
105
© 2016 IBM Corporation
追加OAuth処理 – preapproved_check (3/3)
11. preapproved_check処理

確認結果 (cURL)
$ curl -i -k
"https://<IDG_IPAddress>:5070/oauth/authz?response_type=code&client_id=OAuthClient01&redirect_uri=https://localhost
&scope=/getAccountInfo%20/getCustomerInfo&state=MyTest" --user user01:password -v -o test.html
<途中省略>
アクセス許可要求 (user01でBasic認証)
> GET
/oauth/authz?response_type=code&client_id=OAuthClient01&redirect_uri=https://localhost&scope=/getAccountInfo%20/get
CustomerInfo&state=MyTest HTTP/1.1
> Authorization: Basic dXNlcjAxOnBhc3N3b3Jk
> User-Agent: curl/7.23.1 (x86_64-pc-win32) libcurl/7.23.1 OpenSSL/0.9.8r zlib/1.2.5
> Host: 9.188.255.85:5070
> Accept: */*
>
0
0
0
0
0
0
0
0 --:--:-- --:--:-- --:--:-0<
HTTP/1.1 302 Processed
< X-Backside-Transport: FAIL FAIL
< Connection: Keep-Alive
< Transfer-Encoding: chunked
< Location: https://localhost?code=AAKWWs4YeARL1-RykN1e6Sg5-n_Q7o8gtJ3GVElImwMen7b3_eF4z7L5Z0ms6RZeJ3iPv2OsmcjEnE8CYm-wVxorHZ7KymGDO_-QJ7SzF32L1K27Ps-Cj6CEd5D1tNdFw8&state=MyTest
< Content-Type: text/xml
< Cache-Control: private, no-cache, no-store, must-revalidate
<
許可フォームによる承認をバイパス
{ [data not shown]
100
73
0
73
0
0
275
0 --:--:-- --:--:-- --:--:-- して許可コードが発行される
275
* Connection #0 to host 9.188.255.85 left intact
* Closing connection #0
* SSLv3, TLS alert, Client hello (1):
} [data not shown]
106
© 2016 IBM Corporation
追加OAuth処理 – miscinfo_request (1/3)
12. miscinfo_request処理

miscinfo_request処理のカスタマイズ・サンプル

アクセス・トークンに含まれる情報を追加する

実装方法


カスタマイズしたXSLTファイル (add-process_miscinfo-request.xsl)の作成
Tips:
情報は<miscinfo>タグで追加する必要がある
 miscinfo_requestは以下の各オペレーションで処理される




107
dp-state → az-code → access-tokenの順で処理される
情報は自動的に後続処理に渡される
後続処理で情報をオーバーライド可能
operation type
カスタマイズ内容
dp-state
許可フォームに追加情報を含めることが可能。
az-code
許可コードに追加情報含めることが可能。
access-token
アクセス・トークンに追加情報を含めることが可能。
© 2016 IBM Corporation
追加OAuth処理 – miscinfo_request (2/3)
12. miscinfo_request処理

add-process_miscinfo-request.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:dp="http://www.datapower.com/extensions"
xmlns:dpconfig="http://www.datapower.com/param/config"
xmlns:dpfunc="http://www.datapower.com/extensions/functions"
extension-element-prefixes="dp dpfunc"
exclude-result-prefixes="dp dpfunc dpconfig">
miscinfo_request処理の操作
<xsl:template match="/">
<xsl:choose>
<xsl:when test="/input/operation = 'miscinfo_request'">
<xsl:choose>
<xsl:when test="/input/operation/@type = 'dp-state'">
<xsl:if test="/input/container/identity/entry[@type='oauth']//OAuthSupportedClient/client-id = 'AddClientId'">
<result><miscinfo><xsl:value-of select="/input/container/credentials/entry//sso-sessionid"/></miscinfo></result>
</xsl:if>
</xsl:when>
<xsl:when test="/input/operation/@type = 'az-code'">
<xsl:if test="/input/container/identity/entry[@type='oauth']//OAuthSupportedClient/client-id = 'AddClientId'">
<result><miscinfo><xsl:value-of select="/input/container/identity/entry//sso-sessionid"/></miscinfo></result>
</xsl:if>
</xsl:when>
<xsl:when test="/input/operation/@type = 'access-token'">
<xsl:if test="/input/container/identity/entry[@type='oauth']//OAuthSupportedClient/client-id = 'OAuthClient01'">
<result><miscinfo>1234567890</miscinfo></result>
</xsl:if>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:when>
operation typeが”access-token”の処理時に、
<xsl:otherwise/>
<miscinfo>の値に追加の文字列を設定
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
108
© 2016 IBM Corporation
追加OAuth処理 – miscinfo_request (3/3)
12. miscinfo_request処理

確認結果 (cURL)
$ curl -i -k https://9.188.255.85:5070/oauth/token -d
"grant_type=urn:ibm:datapower:validate&access_token=AAENT0F1dGhDbGllbnQwMXzABbS7UF_D1FrQp
fOSo07oB16piKeeZytqya8gqQ95077kLUhiezHwL1hXKi7Gqk48Qp8Xjkryyl4YeTo14ldmArGnDZv1Vcl3lvreiu__W-pRPoEqbdx30EY_QGp9a8a5Py5gQdXZeYr-A4hQw" --user OAuthClient01:passw0rd
% Total
% Received % Xferd Average Speed
Time
Time
Time Current
Dload Upload
Total
Spent アクセス・トークン検査要求
Left Speed
100
522
0
300 100
222
1067
790 --:--:-- --:--:-- --:--:-- 1067
HTTP/1.1 200 OK
X-Backside-Transport: FAIL FAIL
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Cache-Control: private, no-store, no-cache, must-revalidate
Pragma: no-cache
{ "valid":true, "token_type":"bearer", "client_id":"OAuthClient01",
"not_after":"133866135", "not_after_text":"2016-03-29T09:02:15Z",
"not_before":"133862535", "not_before_text":"2016-03-29T08:02:15Z",
"resource_owner":"USER01", "scope":"/getAccountInfo /getCustomerInfo",
"miscinfo":“1234567890" }
アクセス・トークン検査要求で
miscinfoが追加されていることを
確認可能
109
© 2016 IBM Corporation
トークン失効管理
110
© 2016 IBM Corporation
IDGにおけるトークン失効方法 (1/2)

事前にIDGにてトークン失効の有効化が必要


設定方法は、トークン失効管理方法により異なる (後述)
OAuthクライアントまたはリソース・オーナーから失効リクエスト送信が可能

OAuthクライアントから失効する場合

特定のトークンの失効が可能
OAuthクライアントのクレデンシャルが必要

cURLによる失効リクエスト例


アクセス・トークンの失効要求
curl -k https://<IDG_IPAddress>:5070/oauth/revoke -d
"grant_type=urn%3Aibm%3Adatapower%3Aclient%3Arevoke&access_token=<Access_Token>" --user
OAuthClient01:passw0rd

リフレッシュ・トークンの失効要求
curl -k https://<IDG_IPAddress>:5070/oauth/revoke -d
"grant_type=urn%3Aibm%3Adatapower%3Aclient%3Arevoke&refresh_token=<Refresh_Token>" --user
OAuthClient01:passw0rd

アクセス・トークンおよびリフレッシュ・トークンの失効要求
curl -k https://<IDG_IPAddress>:5070/oauth/revoke -d
"grant_type=urn%3Aibm%3Adatapower%3Aclient%3Arevoke&access_token=<Access_Token>&refresh_t
oken=<Refresh_Token>" --user OAuthClient01:passw0rd

応答電文例


111
OK:HTTP 200 { "status":"success" }
NG:HTTP 200 { "status":"failure" }
© 2016 IBM Corporation
IDGにおけるトークン失効方法 (2/2)

OAuthクライアントまたはリソース・オーナーから失効リクエスト送信が可能
(続き)

リソース・オーナーから失効する場合

特定のOAuthクライアントの失効が可能
リソース・オーナーのクレデンシャルが必要

cURLによる失効リクエスト例


OAuthクライアントの失効要求
curl -k https://<IDG_IPAddress>:5070/oauth/revoke -d
"grant_type=urn%3Aibm%3Adatapower%3Aowner%3Arevoke&client_id=<OAuth_Client_ID>" --user
user01:password

応答電文例


112
OK:HTTP 200 { "status":"success" }
NG:HTTP 200 { "status":"failure" }
© 2016 IBM Corporation
IDGにおけるトークン失効管理

IDGではトークン失効管理として以下の2つの方法が考えられる

IDG内部キャッシュを利用



外部リポジトリーを利用 ※推奨


113
IDGがトークン失効要求を受信した際に、 内部キャッシュにてトークン失効情報
を管理する
IDGはリソース・アクセス時に内部キャッシュを参照してトークン失効検査を実施
する
IDGがトークン失効要求を受信した際に、外部リポジトリーへ失効情報を連携し、
外部リポジトリーにてトークン失効情報を管理する
IDGはリソース・アクセス時に外部リポジトリーを参照してトークン失効検査を実
施する
© 2016 IBM Corporation
IDG内部キャッシュの利用 (1/3)

IDG設定方法

OAuthクライアント・プロファイルにて設定

114
メニューより「オブジェクト」 > 「暗号構成」 > 「OAuthクライアント・プロ
ファイル」で、カスタマイズしたいプロファイルを選択表示し、「拡張」タブの
「キャッシング」にて「トークン・キャッシュ」を選択
© 2016 IBM Corporation
IDG内部キャッシュの利用 (2/3)

IDGは定期的に内部キャッシュをチェックし、期限切れエントリーを削除する


更新間隔は変更不可
OAuthキャッシュは、メニューより「状況」 > 「暗号」 > 「OAuthキャッ
シュ」にて確認可能
タイプ
備考
更新間隔
許可フォーム状態
許可フォーム状態 (dpstate)のキャッシュ。
リソース・オーナーからIDGへ許可フォーム返答後に表示される。
15分
許可コード
許可コード (azcode)のキャッシュ。
アクセス・トークン発行後に表示される。
アクセス・トークン *
アクセス・トークン (access)のキャッシュ。
アクセス・トークンを失効させた場合に表示される。
リフレッシュ・トークン
リフレッシュ・トークン (refresh)のキャッシュ。
リフレッシュ・トークンを使用した場合、または失効させた場合に表示される。
30分
* OAuthクライアント・プロファイルの「拡張」タブ > 「キャッシング」設定が「トークン・キャッシュ」の場合のみ表示されます。
115
© 2016 IBM Corporation
IDG内部キャッシュ利用時の考慮点

OAuthキャッシュはIDGシステム (筐体)停止により消滅する
ドメイン再起動では消滅しません
 IDGが起動した際に、有効期限内のトークンでかつ失効されているトークン
は再度失効リクエストを送信する必要があります。



複数台のIDGで冗長構成とする場合、各IDGに失効リクエストを送信する
必要がある
そのため、以下の検討が必要

失効リクエストは誰がどのように送信するのか


IDGの監視方法

116
例えば、IDG管理者が外部アプリケーションからIDGに対して失効リクエストを送
信するなど
例えば、IDGに対して定期的にヘルスチェックするなど
© 2016 IBM Corporation
外部リポジトリーの利用 (1/11)

前提

トークンを管理するための外部リポジトリーが必要


ここでは、サンプルとしてNode.jsを使用し、IDGからNode.jsに対してHTTPで
失効要求および失効チェックを行います。
Node.jsのサンプル・コードは下記リンク先developerWorksより入手可能です。



事前にNode.jsおよびnode-cacheモジュールをインストールする必要があります。

117
http://www.ibm.com/developerworks/apps/download/index.jsp?contentid=100
5010&filename=code_sample.zip&method=http&locale=
サンプル・コードの使用方法は、上記リンク先で提供されるREADMEファイルを参照し
てください。
node-cacheモジュールは以下のコマンドでインストール可能です。
npm install node-cache
© 2016 IBM Corporation
外部リポジトリーの利用 (2/11)
6. access_request処理

IDG設定方法

OAuthクライアント・プロファイルにて設定


10. revoke_request処理
メニューより「オブジェクト」 > 「暗号構成」 > 「OAuthクライアント・プロ
ファイル」で、カスタマイズしたいプロファイルを選択表示し、「拡張」タブの
「キャッシング」にて「カスタム」を選択
「追加OAuth処理」にてカスタマイズしたXSLTファイル (または
GatewayScript)を選択

118
9. check_revocation_request処理
XSLTファイル (またはGatewayScript)にて”revoke_request”
/ ”check_revocation_request” / “access_request”処理の操作をカスタマイズし、
外部リポジトリーに問い合わせる
© 2016 IBM Corporation
外部リポジトリーの利用 (3/11)

revoke_addprocess.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:dp="http://www.datapower.com/extensions"
xmlns:dpconfig="http://www.datapower.com/param/config"
xmlns:dpfunc="http://www.datapower.com/extensions/functions"
extension-element-prefixes="dp dpfunc"
exclude-result-prefixes="dp dpfunc dpconfig">
外部リポジトリーの宛先URLを指定
<xsl:variable name="cache-server-url" select="'http://192.168.10.200:7088'"/>
<xsl:template match="/">
revoke_request処理のカスタマイズ
<xsl:choose>
<xsl:when test="/input/operation = 'revoke_request'">
<!-- call to store the information -->
<result>
<xsl:choose>
<xsl:when test="/input/resource_owner and /input/client_id">
<xsl:variable name="url-query">
<xsl:value-of select="$cache-server-url"/>
外部リポジトリーに対する
<xsl:text>/owner-revoke?client_id=</xsl:text>
リクエストURLの形成
<xsl:value-of select="/input/client_id"/>
<xsl:text>&amp;resource_owner=</xsl:text>
<xsl:value-of select="/input/resource_owner"/>
<xsl:text>&amp;access_token_ttl=</xsl:text>
<xsl:value-of select="/input/entry/OAuthSupportedClient/access-token-lifetime"/>
<xsl:if test="/input/entry/OAuthSupportedClient/refresh-token-lifetime">
<xsl:text>&amp;refresh_token_ttl=</xsl:text>
<xsl:value-of select="/input/entry/OAuthSupportedClient/refresh-token-lifetime"/>
</xsl:if>
</xsl:variable>
<xsl:message dp:priority="info"><xsl:value-of select="$url-query"/></xsl:message>
(次頁へ続く)
119
© 2016 IBM Corporation
外部リポジトリーの利用 (4/11)

revoke_addprocess.xsl (続き)
<!-- in reality, we should check for the return code to make sure the cache is actually stored -->
<xsl:variable name="message-response">
外部リポジトリーへアクセス
<dp:url-open target="{$url-query}"
response="responsecode-ignore">
</dp:url-open>
</xsl:variable>
<status>success</status>
</xsl:when>
<xsl:when test="/input/access_token or /input/refresh_token">
<xsl:variable name="url-query">
<xsl:value-of select="$cache-server-url"/>
<xsl:text>/client-revoke?</xsl:text>
<xsl:if test="/input/access_token">
<xsl:text>access_token=</xsl:text>
<xsl:value-of select="/input/access_token"/>
<xsl:text>&amp;access_token_ttl=</xsl:text>
<xsl:value-of select="/input/OAuthSupportedClient/access-token-lifetime"/>
</xsl:if>
<xsl:if test="/input/refresh_token">
<xsl:if test="/input/access_token">
<xsl:text>&amp;</xsl:text>
</xsl:if>
<xsl:text>refresh_token=</xsl:text>
<xsl:value-of select="/input/refresh_token"/>
<xsl:text>&amp;refresh_token_ttl=</xsl:text>
<xsl:value-of select="/input/OAuthSupportedClient/refresh-token-lifetime"/>
</xsl:if>
</xsl:variable>
<xsl:message dp:priority="info"><xsl:value-of select="$url-query"/></xsl:message>
(次頁へ続く)
120
© 2016 IBM Corporation
外部リポジトリーの利用 (5/11)

revoke_addprocess.xsl (続き)
<!-- in reality, we should check for the return code to make sure the cache is actually stored -->
<xsl:variable name="message-response">
<dp:url-open target="{$url-query}"
response="responsecode-ignore">
</dp:url-open>
</xsl:variable>
<status>success</status>
</xsl:when>
<xsl:otherwise>
<status>failure</status>
<error>invalid_request</error>
<error_description>not enough info for operation</error_description>
</xsl:otherwise>
</xsl:choose>
</result>
</xsl:when> <!-- End of revoke-request -->
access_request処理のカスタマイズ
<xsl:when test="/input/operation = 'access_request'">
<xsl:choose>
<xsl:when test="/input/container/identity/entry[@type='oauth']/oauth-id[@type='access_request']/grant_type =
'refresh_token'">
<!-- record the refresh token as revoked -->
<xsl:variable name="url-query">
<xsl:value-of select="$cache-server-url"/>
<xsl:text>/client-revoke?</xsl:text>
<xsl:text>refresh_token=</xsl:text>
<xsl:value-of select="/input/container/identity/entry[@type='oauth']/oauthid[@type='access_request']/refresh_token"/>
<xsl:text>&amp;refresh_token_ttl=</xsl:text>
<xsl:value-of select="/input/container//OAuthSupportedClient/refresh-token-lifetime"/>
</xsl:variable>
(次頁へ続く)
121
© 2016 IBM Corporation
外部リポジトリーの利用 (6/11)

revoke_addprocess.xsl (続き)
<xsl:message dp:priority="info"><xsl:value-of select="$url-query"/></xsl:message>
<!-- in reality, we should check for the return code to make sure the cache is actually stored -->
<xsl:variable name="message-response">
<dp:url-open target="{$url-query}"
response="responsecode-ignore">
</dp:url-open>
</xsl:variable>
</xsl:when>
<xsl:when test="/input/container/identity/entry[@type='oauth']/oauth-id[@type='access_request']/grant_type =
'authorization_code'">
<!-- record the refresh token as revoked -->
<xsl:variable name="url-query">
<xsl:value-of select="$cache-server-url"/>
<xsl:text>/client-revoke?</xsl:text>
<xsl:text>az_code=</xsl:text>
<xsl:value-of select="/input/container/identity/entry[@type='oauth']/oauth-id[@type='access_request']/code"/>
<xsl:text>&amp;az_code_ttl=</xsl:text>
<xsl:value-of select="/input/container//OAuthSupportedClient/au-code-lifetime"/>
</xsl:variable>
<xsl:message dp:priority="info"><xsl:value-of select="$url-query"/></xsl:message>
<!-- in reality, we should check for the return code to make sure the cache is actually stored -->
<xsl:variable name="message-response">
<dp:url-open target="{$url-query}"
response="responsecode-ignore">
</dp:url-open>
</xsl:variable>
</xsl:when>
</xsl:choose>
</xsl:when> <!-- End of access_request -->
(次頁へ続く)
122
© 2016 IBM Corporation
外部リポジトリーの利用 (7/11)

revoke_addprocess.xsl (続き)
<xsl:when test="/input/operation = 'check_revocation_request'">
<xsl:variable name="url-query">
check_revocation_request処理の
<xsl:value-of select="$cache-server-url"/>
カスタマイズ
<xsl:text>/check-revoke?client_id=</xsl:text>
<xsl:value-of select="/input/verified-token/client_id"/>
<xsl:text>&amp;resource_owner=</xsl:text>
<xsl:value-of select="/input/verified-token/resource_owner"/>
<xsl:text>&amp;token_type=</xsl:text>
<xsl:value-of select="/input/operation/@token-type"/>
<xsl:text>&amp;token=</xsl:text>
<xsl:value-of select="/input/token"/>
<!-- in theory, user has the created date of the token, and they can write
more complex logic to only revoke those access created before resource owner revoke the client -->
</xsl:variable>
<xsl:message dp:priority="info"><xsl:value-of select="$url-query"/></xsl:message>
<!-- in reality, we should check for the return code to make sure the cache is actually stored -->
<xsl:variable name="message-response">
<dp:url-open target="{$url-query}"
response="responsecode-ignore">
</dp:url-open>
</xsl:variable>
<xsl:if test="$message-response/url-open/headers/header[@name='X-DP-Revoked'] = 'true'">
<result><revoked>revoked by checking external storage</revoked></result>
</xsl:if>
</xsl:when> <!-- End of check_revocation_request -->
<xsl:when test="/input/operation = 'preapproved_check'">
<result><approved>yes</approved></result>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
123
© 2016 IBM Corporation
外部リポジトリーの利用 (8/11)

確認結果

アクセス・トークン発行
cURL
外部リポジトリー (Node.js)
$ curl -i -k https://192.168.10.1:5070/oauth/token -d
"grant_type=authorization_code&code=AAIZI878LONO9aeC1xqpffWpMsoJdsC_ud4gwIZLs2H4MxwZAPtcHy_WEzE48V80jjLgB_JqMAZdp2HV6a1iga8QyMAnttf1cXpR
6Abag2_AwBNGK6sSDzci9GgCzqb2A&redirect_uri=https://localhost" -user OAuthClient01:passw0rd
>node --harmony cache-svr.js
cache server running on, , port 7088.
receive request, /checkrevoke?client_id=OAuthClient01&resource_owner=U
SER01&tok
en_type=az-code&token=AAIZI878LONO9aeC1xqpffWpMsoJdsC_ud4-gwIZLs2H4MxwZAPtcHy_W
EzE48V80jjLgB_JqMAZdp2HV6a1iga8QyMAnttf1cXpR6Ab
ag2_AwBNGK6sSDzci9GgCzqb2A, at Th
u Mar 31 2016 08:10:28 GMT+0900 (東京 (標準時))
HTTP/1.1 200 OK
X-Backside-Transport: FAIL FAIL
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Cache-Control: private, no-store, no-cache, must-revalidate
Pragma: no-cache
{ "token_type":"bearer",
"access_token":"AAENT0F1dGhDbGllbnQwMcQE_HPxFxePnP8gVK8vtj23SUwuT
xdavsNvMFTbvPK5tHRla6ROlxsb7dC_oR4UbhccQh7BKzPFrbNlaEuPOwSrr0l5fn
wkdv6DderAJ30Ul87YOlG_sFDGBAzNRb7gdg", "expires_in":3600,
"scope":"/getAccountInfo /getCustomerInfo",
"refresh_token":"AAFbzncgpHbYu_y4zqQ3tJ_OfArYv9H_ahJhLMx_zGVgGKi1
zQNe3fJwxM5YhTDsrE0ghG8eb98qQvuhr8sWSQkgC8_Wt5yiMdoRlpUi6PA9IBUm6
ZXrq-pn9oR1nUEf_Us" }
アクセス・トークン発行時に、外部
リポジトリーに対してアクセス・
トークンの失効チェックを行う
124
check revocation
not revoked
receive request, /clientrevoke?az_code=AAIZI878LONO9aeC1xqpffWpMsoJdsC_ud4-gwI
ZLs2H4MxwZAPtcHy_WEzE48V80jjLgB_JqMAZdp2HV6a1ig
a8QyMAnttf1cXpR6Abag2_AwBNGK6sSDz
ci9GgCzqb2A&az_code_ttl=300, at Thu Mar 31 2016
08:10:28 GMT+0900 (東京 (標準時)
)
cache client revoke info for at undefined and
rt undefined
© 2016 IBM Corporation
外部リポジトリーの利用 (9/11)

確認結果 (続き)

アクセス・トークン失効
cURL
外部リポジトリー (Node.js)
$ curl -i -k https://192.168.10.1:5070/oauth/token -d
"grant_type=urn:ibm:datapower:client:revoke&access_token=AAENT0F1
dGhDbGllbnQwMcQE_HPxFxePnP8gVK8vtj23SUwuTxdavsNvMFTbvPK5tHRla6ROl
xsb7dC_oR4UbhccQh7BKzPFrbNlaEuPOwSrr0l5fnwkdv6DderAJ30Ul87YOlG_sF
DGBAzNRb7gdg" --user OAuthClient01:passw0rd
receive request, /clientrevoke?access_token=AAENT0F1dGhDbGllbnQwMcQE_HP
xFxePnP8
gVK8vtj23SUwuTxdavsNvMFTbvPK5tHRla6ROlxsb7dC_oR
4UbhccQh7BKzPFrbNlaEuPOwSrr0l5fnw
kdv6DderAJ30Ul87YOlG_sFDGBAzNRb7gdg&access_toke
n_ttl=3600, at Thu Mar 31 2016 08
:12:29 GMT+0900 (東京 (標準時))
HTTP/1.1 200 OK
X-Backside-Transport: FAIL FAIL
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Cache-Control: private, no-store, no-cache, must-revalidate
Pragma: no-cache
{ "status":"success" }
cache client revoke info for at
AAENT0F1dGhDbGllbnQwMcQE_HPxFxePnP8gVK8vtj23SUw
u
TxdavsNvMFTbvPK5tHRla6ROlxsb7dC_oR4UbhccQh7BKzP
FrbNlaEuPOwSrr0l5fnwkdv6DderAJ30U
l87YOlG_sFDGBAzNRb7gdg and rt undefined
IDGはアクセス・トークン失効要
求を受けて、外部リポジトリーに
失効情報を連携
125
© 2016 IBM Corporation
外部リポジトリーの利用 (10/11)

確認結果 (続き)

アクセス・トークン検査
cURL
外部リポジトリー (Node.js)
$ curl -i -k https://192.168.10.1:5070/oauth/token -d
"grant_type=urn:ibm:datapower:validate&access_token=AAENT0F1dGhDb
GllbnQwMcQE_HPxFxePnP8gVK8vtj23SUwuTxdavsNvMFTbvPK5tHRla6ROlxsb7d
C_oR4UbhccQh7BKzPFrbNlaEuPOwSrr0l5fnwkdv6DderAJ30Ul87YOlG_sFDGBAz
NRb7gdg" --user OAuthClient01:passw0rd
receive request, /checkrevoke?client_id=OAuthClient01&resource_owner=U
SER01&tok
en_type=access_token&token=AAENT0F1dGhDbGllbnQw
McQE_HPxFxePnP8gVK8vtj23SUwuTxdav
sNvMFTbvPK5tHRla6ROlxsb7dC_oR4UbhccQh7BKzPFrbNl
aEuPOwSrr0l5fnwkdv6DderAJ30Ul87YO
lG_sFDGBAzNRb7gdg, at Thu Mar 31 2016 08:13:41
GMT+0900 (東京 (標準時))
HTTP/1.1 200 OK
X-Backside-Transport: FAIL FAIL
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Cache-Control: private, no-store, no-cache, must-revalidate
Pragma: no-cache
{ "valid":false }
126
check revocation
revoked by client
IDGはアクセス・トークン検査要
求を受けて、外部リポジトリーに
失効情報を確認
© 2016 IBM Corporation
外部リポジトリーの利用 (11/11)

確認結果 (続き)

失効させたアクセス・トークンによるリソース・アクセス
cURL
外部リポジトリー (Node.js)
$ curl -i -k https://192.168.10.1:5070/getCustomerInfo -H
"Authorization:Bearer
AAENT0F1dGhDbGllbnQwMcQE_HPxFxePnP8gVK8vtj23SUwuTxdavsNvMFTbvPK5t
HRla6ROlxsb7dC_oR4UbhccQh7BKzPFrbNlaEuPOwSrr0l5fnwkdv6DderAJ30Ul8
7YOlG_sFDGBAzNRb7gdg"
receive request, /checkrevoke?client_id=OAuthClient01&resource_owner=U
SER01&tok
en_type=access_token&token=AAENT0F1dGhDbGllbnQw
McQE_HPxFxePnP8gVK8vtj23SUwuTxdav
sNvMFTbvPK5tHRla6ROlxsb7dC_oR4UbhccQh7BKzPFrbNl
aEuPOwSrr0l5fnwkdv6DderAJ30Ul87YO
lG_sFDGBAzNRb7gdg, at Thu Mar 31 2016 08:14:45
GMT+0900 (東京 (標準時))
HTTP/1.1 500 Error
Content-Type: text/html
X-Backside-Transport: FAIL FAIL
Connection: close
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 4.0 Transitional//EN">
<!-Licensed Materials - Property of IBM
IBM WebSphere DataPower Appliances
Copyright IBM Corporation 2013. All Rights Reserved.
US Government Users Restricted Rights - Use, duplication or
disclosure
restricted by GSA ADP Schedule Contract with IBM Corp.
-->
<html>
<title>Connectivity Error</title>
<body>
<h1>Web Application Gateway Error</h1><P/>
<h2><font color="red">Gateway detected an error during
processing of service request.</font></h2><P/>
<h2>Please contact the service administrator.</h2>
</body>
</html>
127
check revocation
revoked by client
IDGはリソース・アクセス時に
外部リポジトリーに対して失効
チェックを行う
© 2016 IBM Corporation
外部リポジトリー利用時の考慮点

外部リポジトリー側で以下の検討が必要
データベースの性能 (トークンのレコード件数、パフォーマンス など)
 冗長化

128
© 2016 IBM Corporation
参考資料

IBM developerWorks

Implementing OAuth on IBM WebSphere DataPower Appliances


Knowledge Center

IBM DataPower Gateway 7.2.0


http://www.ibm.com/support/knowledgecenter/SS9H2Y_7.2.0/com.ibm.
dp.doc/welcome.html
IETF

RFC 6749:The OAuth 2.0 Authorization Framework

129
http://www.ibm.com/developerworks/websphere/library/techarticles/12
08_rasmussen/1208_rasmussen.html
http://tools.ietf.org/html/rfc6749?cm_mc_uid=84097136393314055812
225&cm_mc_sid_50200000=1447599990
© 2016 IBM Corporation
© Copyright IBM Corporation 2015. All rights reserved. The information contained in these materials is provided for informational purposes only, and is provided AS IS without warranty of any kind,
express or implied. IBM shall not be responsible for any damages arising out of the use of, or otherwise related to, these materials. Nothing contained in these materials is intended to, nor shall have
the effect of, creating any warranties or representations from IBM or its suppliers or licensors, or altering the terms and conditions of the applicable license agreement governing the use of IBM
software. References in these materials to IBM products, programs, or services do not imply that they will be available in all countries in which IBM operates. Product release dates and/or capabilities
referenced in these materials may change at any time at IBM’s sole discretion based on market opportunities or other factors, and are not intended to be a commitment to future product or feature
availability in any way. IBM, the IBM logo, and other IBM products and services are trademarks of the International Business Machines Corporation, in the United States, other countries or both. Other
company, product, or service names may be trademarks or service marks of others.
130
© 2016 IBM Corporation
Fly UP