定制同意书模板
OAuth 授权服务器提供了一个模板来获取有关已授权哪些 OAuth 客户机访问所给定范围中的受保护资源的用户同意信息。来自 OAuth 客户机的授权请求显示了该模板中所请求范围的列表。
WebSphere® Application Server 允许同意书模板为静态 HTML 页面或者动态 Web 页面。在这两种情况下,必须将模板作为不受保护的 Web 资源来提供。访问此模板 URL 时,WebSphere Application Server 集成中的同意书检索器不会执行任何认证。
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 方法。但是,如果开发者熟悉 OAuth2 协议,那么他们可以实现自己的功能来提交 OAuth 授权请求。
如果需要全球化,那么可以使用动态页面,此页面将根据请求中的 Accept-Language 头来返回全球化的内容。检索模板时,还会转发 Accept-Language 头,并且模板开发者必须决定要返回哪些有关首选语言的内容。
避免故障: 在 HTML 中,clientDisplayName 变量未转义。模板开发者必须审查值,因为值是由用户在客户机注册期间输入。gotcha

要使用特定 OAuth20 服务提供程序的定制同意书模板页面,您必须更新服务提供程序配置文件。在提供程序配置中,您必须更新 oauth20.authorization.form.template 参数,并添加模板 URL 作为值。以下示例显示了提供者配置中的样本模板条目:
<parameter name="oauth20.authorization.form.template" type="cc" customizable="true">
<value>https://acme.com:9043/oath20/template.html</value>
</parameter>
以下示例说明了一个样本同意书:
<parameter name="oauth20.authorization.loginURL" type="cc" customizable="true">
<value>https://acme.com:9043/oath20/login.jsp</value>
</parameter>
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>
<input type="button" value="Yes" onclick="javascript:submitForm(oauthFormData);"/>
<input type="button" value="No, Thanks"/>
</div>
</body>
</html>