自訂同意表單範本
OAuth 授權伺服器會提供一個範本,用來取得關於在給定的範圍內,哪些 OAuth 用戶端獲授權存取受保護之資源的使用者同意資訊。 OAuth 用戶端的授權要求包括範本中所要求的範圍清單。
WebSphere® Application Server 接受同意表單範本是靜態的 HTML 頁面或動態網頁。 不論哪一種情況,範本都必須是作為一項未受保護的 Web 資源來提供。 當存取這個範本 URL 時,WebSphere Application Server 整合中的表單擷取器不會執行任何鑑別。
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 提供者會嘗試自動建立同意快取表格,但是若有為 OAuth 2.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];
callbackHandler.handle(callbacks);
}
}
callbackHandler.handle(callbacks);
// 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>