Plantilla de formulario de consentimiento personalizado
El servidor de autorización OAuth proporciona una plantilla para adquirir información de consentimiento del usuario sobre qué clientes de OAuth están autorizados para acceder al recurso protegido en determinados ámbitos. La solicitud de autorización del cliente de OAuth incluye una lista de ámbitos solicitados desde la plantilla.
WebSphere Application Server permite que la plantilla de formulario de consentimiento sea una página HTML estática o una página web dinámica. En ambos casos, la plantilla debe proporcionarse como un recurso web desprotegido. El recuperador del formulario en la integración de WebSphere Application Server no realiza ninguna autenticación cuando accede a este URL de plantilla.
El proveedor OAuth de WebSphere Application Server incluye una plantilla de formulario de consentimiento de ejemplo y permite la personalización utilizando la variable oauthFormData.
- authorizationUrl - el URL de autorización donde se está enviando el formulario
- clientDisplayName - el nombre de visualización del cliente
- nonce - número generado aleatoriamente para evitar la falsificación de solicitudes entre distintos sitios (CSRF, por sus siglas en inglés)
- client_id - consulte la especificación OAuth 2.0
- response_type - consulte la especificación OAuth 2.0
- redirect_uri - consulte la especificación OAuth 2.0
- state - consulte la especificación OAuth 2.0
- scope - consulte la especificación OAuth 2.0
El desarrollador de una plantilla de formulario debe incluir el contenido de la variable oauthFormData, utilizando Javascript. El desarrollador debe interpretar el valor del ámbito para que sea un valor significativo para un usuario. Cuando un usuario autoriza la solicitud, el desarrollador puede llamar al método submitForm(oauthFormData) para realizar la autorización. El método submitForm se proporciona de forma predeterminada. Sin embargo, si los desarrolladores están familiarizados con el protocolo OAuth 2.0, pueden implementar su propia función para enviar la solicitud de autorización OAuth.
De forma predeterminada se proporciona un método cancel(oauthFormData) que se puede utilizar para permitir que un usuario cancele la solicitud de autorización.
El formulario de consentimiento también se puede modificar para permitir que se almacene en la memoria caché la selección de consentimiento del usuario. Esto significa que si el mismo cliente de OpenID Connect realiza una nueva solicitud de autorización con los mismos ámbitos aprobados o ámbitos reducidos, no se envía una solicitud al usuario con el formulario de consentimiento. En su lugar, se consideran autorizados los ámbitos permitidos anteriormente y se pasan al recurso protegido como corresponde.
Si el registro del cliente está en modalidad localStore, la selección de consentimiento del usuario se almacena en la memoria caché en la sesión del navegador. Los ámbitos aprobados permanecen en la memoria caché para el usuario en concreto hasta que se cierra la sesión o hasta que ha transcurrido un periodo de tiempo establecido, el cual se especifica en la configuración del servidor.
Si el registro del cliente está en la modalidad databaseStore, la selección del consentimiento del usuario puede persistir en una tabla de base de datos, OAuthDBSchema.OAUTH20CONSENTCACHE. Los ámbitos permanecen en la memoria caché para el usuario en concreto hasta que ha transcurrido un periodo de tiempo establecido, el cual se especifica en la configuración del servidor. El proveedor de OpenID Connect intenta crear automáticamente la tabla de memoria caché de consentimiento pero se recomienda que el usuario cree de forma explícita la tabla de consentimiento cuando configure una base de datos para un proveedor de OAuth2.0 y un proveedor de OpenID Connect. Para obtener información adicional, consulte Configuración del servicio OAuth persistente.
Para utilizar esta función, el desarrollador de una plantilla de formulario debe incluir un valor prompt en el objeto JavaScript oauthFormData. Para guardar en la memoria caché la respuesta afirmativa del usuario e impedir que se vuelva a mostrar el formulario de consentimiento en la misma sesión, se debe establecer el valor de prompt en la serie none. Para permitir que el usuario envíe una respuesta afirmativa sin que la aprobación se guarde en la memoria caché, el valor de prompt se ha de establecer en la serie 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);
// establecer nombre de cliente
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>¿Desea permitir que el cliente <span id=client_name style="font-weight:bold">xxxxxxx</span> acceda a sus datos?</div>
<div id="oauth_scope">
</div>
<div>
<form action="javascript:submitForm(oauthFormData);">
<input type="submit" value="Permitir, recordar mi decisión" onclick="javascript:oauthFormData.prompt = 'none';"/>
<input type="submit" value="Permitir una vez" onclick="javascript:oauthFormData.prompt = 'consent';"/>
<input type="button" value="Cancelar" onclick="javascript:cancel(oauthFormData);"/>
</form>
</div>
</body>
</html>