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);
}
}