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 OAuth 2.0

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 des méthodes suivantes afin de 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 OAuth 2.0 pour un fournisseur OAuth

Pour ajouter un médiateur personnalisé à un fournisseur de services OAuth 2.0 spécifique, mettez à jour la définition de fournisseur dans le fichier server.xml. Ajoutez l'attribut mediatorClassname de l'élément oauthProvider et spécifiez le nom de classe pour le médiateur. Vous pouvez spécifier plusieurs noms de classe pour plusieurs médiateurs via le sous-élément mediatorClassname de l'élément oauthProvider. Si plusieurs médiateurs sont spécifiés, ils sont démarrés dans l'ordre dans lequel ils sont indiqués. Vous devez aussi définir un élément library qui contient la classe du médiateur et référencer la bibliothèque avec l'attribut libraryRef.

L'exemple suivant illustre une entrée de médiateur personnalisé dans la définition de fournisseur dans le fichier server.xml :
<oauthProvider id="OAuthConfigSample" libraryRef="myLib"
  mediatorClassname="com.ibm.ws.security.oauth20.mediator.ResourceOwnerValidationMediator" ...>
  ...
</oauthProvider>

<library id="myLib">
  <fileset dir="C:\mydir" includes="myLib.jar" />
</library>
L'exemple de code ci-dessous implémente la validation de données d'identification à l'aide du registre d'utilisateurs WebSphere Application Servers dans le flux de données personnelles de mot 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);
  }

}

Icône indiquant le type de rubrique Rubrique de concept

Dispositions pour les centres de documentation | Commentaires


Icône d'horodatage Dernière mise à jour: Wednesday, 2 September 2015
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=cwlp_oauth_custommediator
Nom du fichier : cwlp_oauth_custommediator.html