Modèle de formulaire d'accord personnalisé
Le serveur d'autorisation OAuth fournit un modèle d'acquisition des informations d'accord relatives aux clients OAuth autorisés à accéder à la ressource protégée dans des portées données. La demande d'autorisation formulée par le client OAuth inclut une liste de portées demandées depuis le modèle.
Dans WebSphere Application Server, le modèle de formulaire d'accord peut être une page HTML statique ou une page Web dynamique. Dans les deux cas, le modèle doit être fourni en tant que ressource Web non protégée. L'extracteur de formulaire de l'intégration WebSphere Application Server ne procède à aucune authentification lors de l'accès à ce modèle d'URL.
Le fournisseur OAuth WebSphere Application Server inclut un exemple de modèle de formulaire d'accord et permet la personnalisation à l'aide de la variable oauthFormData.
- authorizationUrl - URL d'autorisation dans laquelle le formulaire est soumis
- clientDisplayName - nom affiché du client
- nonce - numéro aléatoire généré pour éviter les falsifications de requêtes intersites (CSRF)
- client_id - voir la spécification OAuth 2.0
- response_type - voir la spécification OAuth 2.0
- redirect_uri - voir la spécification OAuth 2.0
- state - voir la spécification OAuth 2.0
- scope - voir la spécification OAuth 2.0
Le développeur d'un modèle de formulaire doit inclure le contenu de la variable oauthFormData avec JavaScript. Il doit interpréter la valeur de portée comme étant une valeur significative pour un utilisateur. Lorsqu'un utilisateur autorise la demande, le développeur peut appeler la méthode submitForm(oauthFormData) pour procéder à l'autorisation. La méthode submitForm est fournie par défaut. Toutefois, si les développeurs maîtrisent bien le protocole OAuth 2.0, ils peuvent implémenter leur propre fonction pour soumettre la demande d'autorisation OAuth.
Une méthode cancel(oauthFormData) est fournie par
défaut et elle peut être utilisée pour autoriser un utilisateur à
annuler la demande d'autorisation.
Il est possible également de modifier le formulaire d'accord
afin de permettre la mise en cache du choix d'accord de
l'utilisateur. Cela signifie que si le même client OpenID Connect
effectue une nouvelle demande d'autorisation avec les mêmes portées
approuvées ou portées réduites, l'utilisateur n'est pas invité à
remplir le formulaire d'accord. Au lieu de cela, les portées
préalablement approuvées sont considérées comme étant autorisées et
transmises comme il convient à la ressource protégée.
Si l'enregistrement du client est en mode
localStore, le choix d'accord de
l'utilisateur est mis en cache dans la session de navigation. Les
portées approuvées restent en cache pour l'utilisateur concerné
jusqu'à la clôture de session ou jusqu'à ce que le délai défini
(indiqué dans la configuration de serveur) soit écoulé.
Si l'enregistrement du client est en mode databaseStore, le choix d'accord de l'utilisateur
peut être permanent dans une table de base de données,
OAuthDBSchema.OAUTH20CONSENTCACHE. Les portées restent en cache pour l'utilisateur concerné jusqu'à ce
que le délai défini (indiqué dans la configuration de serveur) soit
écoulé. Le fournisseur OpenID Connect essaie de créer la table
d'accord en cache de manière automatique, mais il est préférable
que l'utilisateur crée de manière explicite cette table lors de la
configuration d'une base de données pour un fournisseur OAuth2.0 et
un fournisseur OpenID Connect ; voir
Configuration
de service OAuth permanent pour plus de détails.
Pour utiliser cette fonctionnalité, le développeur d'un modèle de
formulaire doit inclure une valeur prompt dans
l'objet JavaScript oauthFormData. Pour permettre la
mise en cache de la réponse affirmative de l'utilisateur et empêcher
le réaffichage du formulaire d'accord dans la même session, la
valeur prompt est définie sur la chaîne
none. Pour permettre à l'utilisateur de
soumettre une réponse affirmative sans la mise en cache de
l'approbation, la valeur prompt est définie sur la
chaîne 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>