Médiateur personnalisé
Un médiateur OAuth 2.0 est utilisé en tant que rappel dans le cadre du traitement de message OAuth 2.0 pour exécuter un post-traitement personnalisé.
Ecriture d'un médiateur OAuth20
Pour écrire un médiateur, vous devez
implémenter l'interface nommée com.ibm.oauth.core.api.oauth20.mediator.OAuth20Mediator. Vous
pouvez implémenter une ou plusieurs méthodes mediate* pour procéder au post-traitement
personnalisé.
void init(OAuthComponentConfiguration config)
Cette
méthode est appelée par une fabrique lors de la création d'une instance de cet objet.void mediateAuthorize(AttributeList attributeList)
Cette
méthode est appelée par un composant central après la validation et le traitement d'un message de base,
afin de permettre à l'utilisateur du composant de procéder au post-traitement personnalisé dans la méthode
processAuthorization.void mediateAuthorizeException(AttributeList attributeList, OAuthException exception)
Cette
méthode est appelée par le composant central en cas d'exception de protocole, afin de permettre
à l'utilisateur du composant de procéder au post-traitement personnalisé dans la méthode
processAuthorization.void mediateResource(AttributeList attributeList)
Cette
méthode est appelée par un composant central après la validation et le traitement d'un message de base,
afin de permettre à l'utilisateur du composant de procéder au post-traitement personnalisé dans la méthode
processResourceRequest.void mediateResourceException(AttributeList attributeList, OAuthException exception)
Cette
méthode est appelée par le composant central en cas d'exception de protocole, afin de permettre
à l'utilisateur du composant de procéder au post-traitement personnalisé dans la méthode
processResourceRequest.void mediateToken(AttributeList attributeList)
Cette
méthode est appelée par un composant central après la validation et le traitement d'un message de base,
afin de permettre à l'utilisateur du composant de procéder au post-traitement personnalisé dans la méthode
processTokenRequest.void mediateTokenException(AttributeList attributeList, OAuthException exception)
Cette
méthode est appelée par le composant central en cas d'exception de protocole, afin de permettre
à l'utilisateur du composant de procéder au post-traitement personnalisé dans la méthode
processTokenRequest.Activation du médiateur OAuth20 pour un fournisseur OAuth
Pour ajouter un médiateur
personnalisé à un fournisseur de services OAuth20 particulier, mettez à jour le fichier de configuration
du fournisseur de services (OauthConfigSample.xml, par exemple).
Recherchez le paramètre
oauth20.mediator.classnames et ajoutez le nom de classe des médiateurs. Vous pouvez
également indiquer plusieurs noms de classe des médiateurs pour les paramètres
oauth20.mediator.classnames.
Si plusieurs médiateurs sont spécifiés, ils sont démarrés dans
l'ordre dans lequel ils sont indiqués dans le paramètre. L'exemple ci-dessous illustre un exemple d'entrée de
médiateur personnalisé dans le fichier de configuration du fournisseur :
<parameter name="oauth20.mediator.classnames" type="cc" customizable="false">
<value>org.acme.oauth2.sampleMediator</value>
<value>org.acme.oauth2.sampleMediator2</value>
</parameter>
L'exemple de code ci-dessous implémente la validation de
données personnelles à l'aide du registre d'utilisateurs WebSphere
Application Servers dans le flux de données personnelles de mmot de passe du propriétaire de la ressource.
package com.ibm.ws.security.oauth20.mediator;
import com.ibm.oauth.core.api.attributes.AttributeList;
import com.ibm.oauth.core.api.config.OAuthComponentConfiguration;
import com.ibm.oauth.core.api.error.OAuthException;
import com.ibm.oauth.core.api.error.oauth20.OAuth20MediatorException;
import com.ibm.oauth.core.api.oauth20.mediator.OAuth20Mediator;
import com.ibm.oauth.core.internal.oauth20.OAuth20Constants;
import com.ibm.websphere.security.CustomRegistryException;
import com.ibm.websphere.security.PasswordCheckFailedException;
import com.ibm.websphere.security.UserRegistry;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class ResourceOwnerValidationMedidator implements OAuth20Mediator {
private static final String CLASS = ResourceOwnerValidationMedidator.class.getName();
private static final Logger LOG = Logger.getLogger(CLASS);
private UserRegistry reg = null;
public void init(OAuthComponentConfiguration config) {
try {
InitialContext ctx = new InitialContext();
reg = (UserRegistry) ctx.lookup("UserRegistry");
} catch (NamingException ne) {
LOG.log(Level.SEVERE, "Cannot lookup UserRegistry", ne);
}
}
public void mediateAuthorize(AttributeList attributeList)
throws OAuth20MediatorException {
// nothing to do here
}
public void mediateAuthorizeException(AttributeList attributeList,
OAuthException exception)
throws OAuth20MediatorException {
// nothing to do here
}
public void mediateResource(AttributeList attributeList)
throws OAuth20MediatorException {
// nothing to do here
}
public void mediateResourceException(AttributeList attributeList,
OAuthException exception)
throws OAuth20MediatorException {
// nothing to do here
}
public void mediateToken(AttributeList attributeList)
throws OAuth20MediatorException {
final String methodName = "mediateToken";
LOG.entering(CLASS, methodName, attributeList);
if("password".equals(attributeList.getAttributeValueByName("grant_type"))) {
String username = attributeList.getAttributeValueByName("username");
String password = attributeList.getAttributeValueByName("password");
try {
reg.checkPassword(username, password);
} catch (PasswordCheckFailedException e) {
throw new OAuth20MediatorException("User doesn't exist or the
password doesn't match.", e);
} catch (CustomRegistryException e) {
throw new OAuth20MediatorException("Cannot validate resource owner.", e);
} catch (RemoteException e) {
throw new OAuth20MediatorException("Cannot validate resource owner.", e);
}
}
LOG.exiting(CLASS, methodName);
}
public void mediateTokenException(AttributeList attributeList,
OAuthException exception)
throws OAuth20MediatorException {
final String methodName = "mediateTokenException";
LOG.entering(CLASS, methodName, new Object[] {attributeList, exception});
if("password".equals(attributeList.getAttributeValueByName("grant_type"))) {
// clear sensitive data
attributeList.setAttribute("access_token",
OAuth20Constants.ATTRTYPE_RESPONSE_ATTRIBUTE,
new String[0]);
attributeList.setAttribute("refresh_token",
OAuth20Constants.ATTRTYPE_RESPONSE_ATTRIBUTE,
new String[0]);
}
LOG.exiting(CLASS, methodName);
}
}