定制同意表单模板
OAuth 授权服务器提供一个模板,用以获取有关获授权来访问给定作用域中受保护资源的 OAuth 客户机的用户许可信息。来自 OAuth 客户机的授权请求包含了模板中所请求作用域的列表。
WebSphere® Application Server 允许同意书模板为静态 HTML 页面或者动态 Web 页面。在两种情况下,都必须提供该模板作为未受保护的 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 提供者尝试自动创建同意缓存表,但建议为 OAuth2.0 提供者和 OpenID Connect 提供者配置数据库时用户显式创建同意表,有关进一步详细信息,请参阅持久 OAuth 服务配置。
要使用此功能,表单模板的开发者必须将 prompt 值包含在 oauthFormData JavaScript 对象中。为缓存用户的肯定响应并阻止同一会话中再次显示同意表单,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>