Angepasster Mediator

Ein OAuth20-Mediator wird während der OAuth20-Nachrichtenverarbeitung als Callback verwendet, um eine angepasste Nachverarbeitung durchzuführen.

OAuth20-Mediator schreiben

Wenn Sie einen Mediator schreiben möchten, müssen Sie die Schnittstelle mit dem Namen com.ibm.oauth.core.api.oauth20.mediator.OAuth20Mediator implementieren. Sie können eine oder mehrere der folgenden Methoden verwenden, um die angepasste Nachverarbeitung 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 nach der Basisnachrichtenvalidierung und -verarbeitung von der Kernkomponente aufgerufen, um die Nachverarbeitung durch den Komponentennutzer in der Methode processAuthorization zuzulassen.
void mediateAuthorizeException(AttributeList attributeList, OAuthException exception)
Diese Methode wird beim Auftreten der Protokollausnahme von der Kernkomponente aufgerufen, um die Nachverarbeitung durch den Komponentennutzer in der Methode processAuthorization zuzulassen.
void mediateResource(AttributeList attributeList)
Diese Methode wird nach der Basisnachrichtenvalidierung und -verarbeitung von der Kernkomponente aufgerufen, um die Nachverarbeitung durch den Komponentennutzer in der Methode processResourceRequest zuzulassen.
void mediateResourceException(AttributeList attributeList, OAuthException exception)
Diese Methode wird beim Auftreten der Protokollausnahme von der Kernkomponente aufgerufen, um die Nachverarbeitung durch den Komponentennutzer in der Methode processResourceRequest zuzulassen.
void mediateToken(AttributeList attributeList)
Diese Methode wird nach der Basisnachrichtenvalidierung und -verarbeitung von der Kernkomponente aufgerufen, um die Nachverarbeitung durch den Komponentennutzer in der Methode processTokenRequest zuzulassen.
void mediateTokenException(AttributeList attributeList, OAuthException exception)
Diese Methode wird beim Auftreten der Protokollausnahme von der Kernkomponente aufgerufen, um die Nachverarbeitung durch den Komponentennutzer in der Methode processTokenRequest zuzulassen.

OAuth20-Mediator für einen OAuth-Provider aktivieren

Wenn Sie einem bestimmten OAuth20-Service-Provider einen angepassten Mediator hinzufügen möchten, aktualisieren Sie die Providerdefinition in der Datei server.xml. Fügen Sie das Attribut mediatorClassname des Elements oauthProvider hinzu, und geben Sie den Klassennamen für den Mediator an. Mit dem Unterelement mediatorClassname des Elements oauthProvider können auch mehrere Klassennamen für Mediators angegeben werden. Wenn mehrere Mediators angegeben sind, werden diese Mediators in der angegebenen Reihenfolge gestartet. Außerdem müssen Sie ein Element library definieren, das die Mediatorklasse enthält, und mit dem Attribut libraryRef auf die Bibliothek verweisen.

Im Folgenden sehen Sie ein Beispiel für einen angepassten Mediatoreintrag in der Providerdefinition in der Datei 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>
Das folgende Codebeispiel implementiert die Berechtigungsnachweisvalidierung mithilfe der Benutzerregistry von WebSphere Application Server im Kennwortberechtigungsnachweisablauf des Ressourceneigners.
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);
  }

}

Symbol das den Typ des Artikels anzeigt. Konzeptartikel



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