Comments
Description
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>&resource_owner=</xsl:text> <xsl:value-of select="/input/resource_owner"/> <xsl:text>&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>&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>&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>&</xsl:text> </xsl:if> <xsl:text>refresh_token=</xsl:text> <xsl:value-of select="/input/refresh_token"/> <xsl:text>&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>&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>&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>&resource_owner=</xsl:text> <xsl:value-of select="/input/verified-token/resource_owner"/> <xsl:text>&token_type=</xsl:text> <xsl:value-of select="/input/operation/@token-type"/> <xsl:text>&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