Angepasster Mediator

Während der OAuth-2.0-Nachrichtenverarbeitung wird ein OAuth-2.0-Mediator zur Ausführung angepasster Nachverarbeitungsoperationen verwendet.

OAuth20-Mediator schreiben

Wenn Sie einen angepassten Mediator schreiben möchten, müssen Sie die Schnittstelle com.ibm.oauth.core.api.oauth20.mediator.OAuth20Mediator implementieren. Sie können eine oder mehrere Methoden des Typs mediate* implementieren, um angepasste Nachverarbeitungsoperationen auszuführen.
void init(OAuthComponentConfiguration config)
Diese Methode wird von einer Factory aufgerufen, wenn eine Instanz dieses Objekts erstellt wird.
void mediateAuthorize(AttributeList attributeList)
Diese Methode wird von der Kernkomponente nach Ausführung der Basisnachrichtenvalidierung und -verarbeitung aufgerufen, um die Nachverarbeitung durch den Konsumenten der Komponente in der Methode processAuthorization zu ermöglichen.
void mediateAuthorizeException(AttributeList attributeList, OAuthException exception)
Diese Methode wird von der Kernkomponente aufgerufen, wenn die Protokollausnahme auftritt, um die Nachverarbeitung durch den Konsumenten der Komponente in der Methode processAuthorization zu ermöglichen.
void mediateResource(AttributeList attributeList)
Diese Methode wird von der Kernkomponente nach Ausführung der Basisnachrichtenvalidierung und -verarbeitung aufgerufen, um die Nachverarbeitung durch den Konsumenten der Komponente in der Methode processResourceRequest zu ermöglichen.
void mediateResourceException(AttributeList attributeList, OAuthException exception)
Diese Methode wird von der Kernkomponente aufgerufen, wenn eine Protokollausnahme auftritt, um die Nachverarbeitung durch den Konsumenten der Komponente in der Methode processResourceRequest zu ermöglichen.
void mediateToken(AttributeList attributeList)
Diese Methode wird von der Kernkomponente nach Ausführung der Basisnachrichtenvalidierung und -verarbeitung aufgerufen, um die Nachverarbeitung durch den Konsumenten der Komponente in der Methode processTokenRequest zu ermöglichen.
void mediateTokenException(AttributeList attributeList, OAuthException exception)
Diese Methode wird von der Kernkomponente aufgerufen, wenn eine Protokollausnahme auftritt, um die Nachverarbeitung durch den Konsumenten der Komponente in der Methode processTokenRequest zu ermöglichen.

OAuth20-Mediator für einen OAuth-Provider aktivieren

Wenn Sie einen angepassten Mediator einem bestimmten OAuth20-Service-Provider hinzufügen möchten, aktualisieren Sie die Konfigurationsdatei für den Service-Provider, z. B. OauthConfigSample.xml. Lokalisieren Sie den Parameter oauth20.mediator.classnames, und fügen Sie den Klassennamen für den Mediator hinzu. Es ist auch möglich, mehrere Klassennamen für Mediatoren für den Parameter oauth20.mediator.classnames anzugeben. Werden mehrere Mediatoren angegeben, müssen diese in der Reihenfolge gestartet werden, in der sie im Parameter angegeben sind. Das folgende Beispiel zeigt einen angepassten Mediatorbeispieleintrag in der Providerkonfigurationsdatei:
<parameter name="oauth20.mediator.classnames" type="cc" customizable="false">
  <value>org.acme.oauth2.sampleMediator</value>
  <value>org.acme.oauth2.sampleMediator2</value>
</parameter>
Das folgende Codebeispiel implementiert die Validierung der Berechtigungsnachweise, indem die Benutzerregistry von WebSphere Application Server im Verarbeitungsablauf für den Kennwortberechtigungsnachweis des Ressourceneigners verwendet wird.
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 {
    // keine Aktion erforderlich
  }

  public void mediateAuthorizeException(AttributeList attributeList,
                                        OAuthException exception)
    throws OAuth20MediatorException {
    // keine Aktion erforderlich
  }

  public void mediateResource(AttributeList attributeList)
    throws OAuth20MediatorException {
    // keine Aktion erforderlich
  }

  public void mediateResourceException(AttributeList attributeList,
                                       OAuthException exception)
    throws OAuth20MediatorException {
    // keine Aktion erforderlich
  }

  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("Benutzer existiert nicht oder
                                           Kennwort stimmt nicht überein.", e);
      } catch (CustomRegistryException e) {
        throw new OAuth20MediatorException("Ressourceneigner kann nicht validiert werden.", e);
      } catch (RemoteException e) {
        throw new OAuth20MediatorException("Ressourceneigner kann nicht validiert werden.", 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"))) {
      // sensible Daten löschen
      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);
  }

}

Symbol, das den Typ des Artikels anzeigt. Konzeptartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cwbs_oauthcustommediator
Dateiname:cwbs_oauthcustommediator.html