カスタム同意フォーム・テンプレート

OAuth 許可サーバーには、特定のスコープの保護リソースにアクセスできる OAuth クライアントに関するユーザー同意情報を取得するためのテンプレートが用意されています。OAuth クライアントからの許可要求には、テンプレートからの要求されたスコープのリストが含まれます。

WebSphere® Application Server では、同意フォーム・テンプレートを静的 HTML ページまたは動的 Web ページのいずれかにすることができます。どちらの場合でも、保護されていない Web リソースとしてテンプレートを提供する必要があります。WebSphere Application Server 統合のフォーム・リトリーバーは、このテンプレート URL へのアクセス時に認証を実行しません。

WebSphere Application Server OAuth プロバイダーには、サンプル同意フォーム・テンプレートが含まれており、oauthFormData 変数を使用してカスタマイズできます。

同意フォームをカスタマイズするには、Javascript を使用して oauthFormData 変数を編集する必要があります。 フォーム・データには以下の変数が含まれています。
  • authorizationUrl - フォームの送信元の許可 URL
  • clientDisplayName - クライアントの表示名
  • nonce - クロスサイト要求偽造 (CSRF) を防止するためのランダム生成の数値
  • client_id - OAuth 2.0 仕様を参照
  • response_type - OAuth 2.0 仕様を参照
  • redirect_uri - OAuth 2.0 仕様を参照
  • state - OAuth 2.0 仕様を参照
  • scope - OAuth 2.0 仕様を参照

フォーム・テンプレートの開発者は、JavaScript を使用して、oauthFormData 変数の内容を組み込む必要があります。 開発者は、スコープ値を解釈して、ユーザーにとって意味のある値にする必要があります。ユーザーが要求を許可すると、開発者は submitForm(oauthFormData) メソッドを呼び出して、許可を実行します。 submitForm メソッドはデフォルトで提供されています。 ただし、開発者は、OAuth 2.0 プロトコルを熟知している場合、OAuth 許可要求を送信するための独自の関数を実装できます。

cancel(oauthFormData) メソッドがデフォルトで用意されており、このメソッドを使用して、ユーザーが許可要求をキャンセルできるようにすることが可能です。

また、ユーザーの同意選択をキャッシュに入れることができるように同意フォームを変更することもできます。つまり、同じ OpenID Connect クライアントが同等以下の承認スコープで新規許可要求を行った場合、同意フォームでユーザーにプロンプトが出されなくなります。代わりに、以前に許可されたスコープが許可済みと見なされ、それが保護リソースに渡されます。

クライアント登録が localStore モードの場合、ユーザーの同意選択は、ブラウザー・セッションにキャッシュされます。セッションが閉じられるか、一定時間 (サーバー構成で指定) 経過するまで、特定のユーザーの承認スコープはキャッシュに入れられたままになります。

クライアント登録が databaseStore モードの場合、ユーザーの同意選択は、データベース表 OAuthDBSchema.OAUTH20CONSENTCACHE に永続化できます。一定時間 (サーバー構成で指定) 経過するまで、特定のユーザーのスコープはキャッシュに入れられたままになります。OpenID Connect プロバイダーは同意キャッシュ表を自動的に作成しようとしますが、OAuth2.0 プロバイダーおよび OpenID Connect プロバイダーのデータベースの構成時に同意表をユーザーが明示的に作成することをお勧めします。詳しくは、『パーシスタント OAuth サービスの構成』を参照してください。

この機能を使用するには、フォーム・テンプレートの開発者は、oauthFormData JavaScript オブジェクト内に prompt 値を含める必要があります。ユーザーの肯定応答をキャッシュにいれ、同じセッションで再び同意フォームが表示されないようにするには、prompt 値をストリング none に設定します。承認をキャッシュに入れずに、ユーザーが肯定応答を送信できるようにするには、prompt 値をストリング consent に設定します。

要求内の Accept-Language ヘッダーに従ってグローバル化されたコンテンツを返す動的ページを使用できます。テンプレートの取得時に、Accept-Language ヘッダーが転送されます。テンプレート開発者は、優先言語に関して返すコンテンツを決定する必要があります。
注: clientDisplayName 変数は HTML ではエスケープされません。値はクライアント登録時にユーザーによって入力されるため、テンプレート開発者は値をサニタイズする必要があります。
特定の OAuth 2.0 サービス・プロバイダー用のカスタム同意フォーム・テンプレート・ページを使用するには、server.xml ファイルでサービス・プロバイダー定義を更新する必要があります。プロバイダー構成で、oauthProvider エレメントの authorizationFormTemplate 属性を使用して、テンプレート URL を値として追加する必要があります。以下の例で、プロバイダー構成のサンプル・テンプレート・エントリーを示します。
<oauthProvider id="OAuthConfigSample"
  authorizationFormTemplate="https://acme.com:9043/oath20/template.html
  ...>
以下の例で、サンプル同意フォームを示します。
<oauthProvider id="OAuthConfigSample"
  authorizationLoginURL="https://acme.com:9043/oath20/login.jsp"
  ...>

function escapeHTML(str) {
    var ele = document.createElement("div");
    ele.innerText = ele.textContent = str;
    return ele.innerHTML;
}
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>OAuth authorization form</title>
<script language="javascript">
function init() {
	var scope = oauthFormData.scope;
	var scopeEle = document.getElementById("oauth_scope");
	var ul = document.createElement("ul");
	if(scope) {
		for(var i=0; i< scope.length; i++) {
			var n = document.createElement("li");
			n.innerHTML = scope[i];
			ul.appendChild(n);
		}
	}
	scopeEle.appendChild(ul);
	// set client name
	var clientEle = document.getElementById("client_name");
	clientEle.innerHTML = escapeHTML(oauthFormData.clientDisplayName);
}

function escapeHTML(str) {
    var ele = document.createElement("div");
    ele.innerText = ele.textContent = str;
    return ele.innerHTML;
}
</script>
</head>
<body onload="init()">
       <div>Do you want to allow client <span id=client_name style="font-weight:bold">xxxxxxx</span> to access your data?</div>
       <div id="oauth_scope">
       </div>
       <div>
              <form action="javascript:submitForm(oauthFormData);">    
                     <input type="submit" value="Allow, remember my decision" onclick="javascript:oauthFormData.prompt = 'none';"/>
                     <input type="submit" value="Allow once" onclick="javascript:oauthFormData.prompt = 'consent';"/>
                     <input type="button" value="Cancel" onclick="javascript:cancel(oauthFormData);"/>
              </form>  
       </div>
</body>
</html>

トピックのタイプを示すアイコン 概念トピック



タイム・スタンプ・アイコン 最終更新: Tuesday, 6 December 2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cwlp_oauth_customconsent
ファイル名: cwlp_oauth_customconsent.html