Mediador personalizado

Se utiliza un mediador OAuth 2.0 como devolución de llamada durante el procesamiento de mensajes OAuth 2.0 para realizar el postprocesamiento personalizado.

Escribir un mediador OAuth20

Para escribir un mediador, debe implementar la interfaz denominada com.ibm.oauth.core.api.oauth20.mediator.OAuth20Mediator. Puede implementar uno o más métodos mediate* para realizar el procesamiento posterior personalizado.
void init(OAuthComponentConfiguration config)
A este método lo llama una fábrica cuando se crea una instancia de este objeto.
void mediateAuthorize(AttributeList attributeList)
A este método lo llama el componente principal después de la validación de mensajes básica y el procesamiento para permitir cualquier procesamiento posterior personalizado por parte del consumidor del componente en el método processAuthorization.
void mediateAuthorizeException(AttributeList attributeList, OAuthException exception)
A este método lo llama el componente principal cuando se produce la excepción de protocolo para permitir cualquier procesamiento posterior personalizado por parte del consumidor del componente en el método processAuthorization.
void mediateResource(AttributeList attributeList)
A este método lo llama el componente principal después de la validación de mensajes básica y el procesamiento para permitir cualquier procesamiento posterior personalizado por parte del consumidor del componente en el método processResourceRequest.
void mediateResourceException(AttributeList attributeList, OAuthException exception)
A este método lo llama el componente principal cuando se produce la excepción de protocolo para permitir cualquier procesamiento posterior personalizado por parte del consumidor del componente en el método processResourceRequest.
void mediateToken(AttributeList attributeList)
A este método lo llama el componente principal después de la validación de mensajes básica y el procesamiento para permitir cualquier procesamiento posterior personalizado por parte del consumidor del componente en el método processTokenRequest.
void mediateTokenException(AttributeList attributeList, OAuthException exception)
A este método lo llama el componente principal cuando se produce la excepción de protocolo para permitir cualquier procesamiento posterior personalizado por parte del consumidor del componente en el método processTokenRequest.

Habilitar el mediador OAuth20 para un proveedor OAuth

Para añadir un mediador personalizado a un proveedor de servicios OAuth20 específico, actualice el archivo de configuración del proveedor de servicios, por ejemplo, OauthConfigSample.xml. Localice el parámetro oauth20.mediator.classnames y añada el nombre de clase para los mediadores. También puede especificar varios nombres de clase para los mediadores para los parámetros oauth20.mediator.classnames. Si se especifican varios mediadores, los mediadores se inician en el orden en que se especifican en el parámetro. El ejemplo siguiente muestra una entrada de mediador personalizado de ejemplo en el archivo de configuración del proveedor:
<parameter name="oauth20.mediator.classnames" type="cc" customizable="false">
  <value>org.acme.oauth2.sampleMediator</value>
  <value>org.acme.oauth2.sampleMediator2</value>
</parameter>
El ejemplo de código siguiente implementa la validación de credenciales utilizando el registro de usuarios de WebSphere Application Server en el flujo de credenciales de contraseña del propietario del recurso.
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 {
    // ninguna acción por realizar aquí
  }

  public void mediateAuthorizeException(AttributeList attributeList,
                                        OAuthException exception)
    throws OAuth20MediatorException {
    // ninguna acción por realizar aquí
  }

  public void mediateResource(AttributeList attributeList)
    throws OAuth20MediatorException {
    // ninguna acción por realizar aquí
  }

  public void mediateResourceException(AttributeList attributeList,
                                       OAuthException exception)
    throws OAuth20MediatorException {
    // ninguna acción por realizar aquí
  }

  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("El usuario no existe o la
                                           contraseña no coincide"., e);
      } catch (CustomRegistryException e) {
        throw new OAuth20MediatorException("No se puede validar el propietario de los recursos"., e);
      } catch (RemoteException e) {
        throw new OAuth20MediatorException("No se puede validar el propietario de los recursos"., 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"))) {
      // borrar datos sensibles
      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);
  }

}

Icon that indicates the type of topic Concept topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cwbs_oauthcustommediator
File name: cwbs_oauthcustommediator.html