カスタム同意フォーム・テンプレート
OAuth 許可サーバーには、特定のスコープの保護リソースにアクセスできる OAuth クライアントに関するユーザー同意情報を取得するためのテンプレートが用意されています。OAuth クライアントからの許可要求には、テンプレートからの要求されたスコープのリストが含まれます。
WebSphere® Application Server では、同意フォーム・テンプレートを静的 HTML ページまたは動的 Web ページのいずれかにすることができます。どちらの場合でも、保護されていない Web リソースとしてテンプレートを提供する必要があります。WebSphere Application Server 統合のフォーム・リトリーバーは、このテンプレート URL へのアクセス時に認証を実行しません。
WebSphere Application Server OAuth プロバイダーには、サンプル同意フォーム・テンプレートが含まれており、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 に設定します。
<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>