Normalmente cuando creemos una API, la lógica será llevada a cabo por otro backend o endpoint. En un mundo real, es muy posible que este otro endpoint tenga su propio sistema de autenticación. Api Manager te resuelve el problema de autenticación para la mayoría de los casos, ya que te proporciona la configuración para dos algoritmos de seguridad: Basic y Digest. Incluso para aquellos casos en los que se requiera otro tipo de autenticación, Api Manager es fácilmente extensible y permite configurar otros algoritmos en caso de necesidad.
Extensibilidad
La extensibilidad es una de las características más importantes en el API Manager, debido a su capacidad para aumentar y personalizar sus ya de por sí amplias características.
Se nos ofrecen dos posibilidades: custom handlers y custom mediation.
- Custom Handler: Al crear una API, se genera un fichero de configuración donde se incluyen todos los handlers asociados a dicha API. Este conjunto de handlers será ejecutado en el orden que indica el fichero cada vez que se invoque la API. Con los custom handlers podremos crear una lógica que se ejecute en cada una de las invocaciones a las APIs generadas.
- Custom Mediation (Mediation flow): Al llamar a una API, se sigue un flujo de ejecución fijo. Similar a como es una API en el ESB, es decir, está compuesto de una secuencia de entrada, otra de salida y otra de error. A través de un custom mediation, podremos modificar este flujo creando secuencias específicas de entrada, salida o error.
Aunque por parte de WSO2 se recomienda el uso de custom handlers antes que los custom mediation. Para este caso elegiremos la segunda opción. Y esto es debido a que los custom handlers nos permiten hacer una personalización más genérica y global. Pero es posible que nosotros solo querramos aplicar este nuevo algoritmo de securización a una única API. Y aunque también es posible realizar esto con los custom handlers, a nivel de configuración es más sencillo y reutilizable con los custom mediations.
– Este artículo te puede interesar: API MANAGER TUTORIAL: EXTENSIBILIDAD –
Ejemplo de custom mediation flow
Para nuestro ejemplo crearemos una API que llamará a un endpoint que necesita securización. Esta autenticación se pasará como es habitual en la cabecera de la petición, Authorization. Dentro de esta cabecera vendrá una clave HMAC-MD5 codificada en Base64.
Custom class
El primer paso es crear una librería que nos permita generar la cabecera de autorización. Esta librería estará compuesta de una clase que extiende de AbstractMediator y tiene dos parámetros de entrada, los cuales nos permitirán crear correctamente la cabecera. Como esta cabecera debe ir en la petición al endpoint final, la librería debe ser invocada en la secuencia de entrada a través de un class mediator.
public class CreateHeaderHMACMD5 extends AbstractMediator {
private String consumerSecret;
private String data;
@Override
public boolean mediate(final MessageContext context) {
try {
String sHMACMD5Encode = sStringToHMACMD5(data, consumerSecret);
String sBasicEncode = Base64.getEncoder().encodeToString(sHMACMD5Encode.getBytes());
org.apache.axis2.context.MessageContext mc = ((org.apache.synapse.core.axis2.Axis2MessageContext) context).getAxis2MessageContext();
Map<String, String> transportHeaders = (Map<String, String>) mc.getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
transportHeaders.put("Authorization", "Basic " + sBasicEncode);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return true;
}
//...
}
Para poder usar esta librería, deberemos empaquetarla como un JAR y ponerla en la carpeta
{APIM_HOME}/repository/components/lib.
Posteriormente, debemos reiniciar el servidor para que sea correctamente detectada.
Custom Mediation
La secuencia de entrada de la cual hemos hablado antes, será nuestro custom mediation. La cual debemos de crear con el mismo formato con el cual crearíamos otra secuencia.
<sequence xmlns="http://ws.apache.org/ns/synapse" name="authenticationHMACMD5:v1--In"> <class name="com.chakray.apim.mediator.CreateHeaderHMACMD5"> <property name="consumerSecret" value="<consumerSecretValue>"/> <property name="data" value="<dataValue>"/> </class> </sequence>
En las variables consumerSecret y data debemos indicar los valores específicos que nos permitan crear la clave correctamente.
-CÓMO CREAR UN CUSTOM MEDIATOR Y ASOCIARLE UN TAG PROPIO EN WSO2-
API
Por último crearemos nuestra API, aquella que llamará al backend y la cual a través del custom mediation le asociará la cabecera de autorización necesaria.
Para ello creamos una API a través del publisher. Y en el segundo paso, Implementación, indicamos que queremos modificar la mediación por defecto. E incluimos como secuencia de entrada, la secuencia creada en el paso anterior.
Posteriormente seguimos con la generación de forma normal de la API, tanto en la parte del Publisher como del Store.
Práctica
Realizaremos una llamada a nuestra API de ejemplo ‘secureApi’ y a su método ‘authorize’. Al ser una API securizada por el API Manager, para poder invocarla necesitaremos el bearer token proporcionado por el API Manager.
curl -k -X POST "https://localhost:8243/secureApi/v1/authorize" -H "Content-Type: application/json" -H "Authorization: Bearer e90f5c06-411b-3fcc-8e09-47b2bed105aa" -d "{ \"payload\": \"string\"}"
Y como backend para el ejemplo hemos utilizado un wiremock, a fin de que podamos ver la llamada que llega desde el API Manager. En dicha llamada podremos ver como va la cabecera de autorización con la clave HMAC-MD5 en base64.
127.0.0.1 - POST /authorize
Authorization: [Basic Y29uc3VtZXJLZXlWYWx1ZTpmZmVmOGIxZmI4YjAzNzZlMWE4ZTI3NWM5MWU1NTQ3YQ==]
Transfer-Encoding: [chunked]
Accept: [application/json]
Connection: [keep-alive]
User-Agent: [Synapse-PT-HttpComponents-NIO]
Host: [localhost:57001]
Content-Type: [application/json; charset=UTF-8]
{ "payload": "string"}
Conclusión
Con este ejemplo de custom mediation flow se ha podido ver como WSO2 nos provee de una solución más allá del paquete inicial propuesto por ellos, fácilmente implementables. Y cómo de esta forma podremos dar solución a un problema real a la hora de crear nuestras API y su integración con otros servicios.
En definitiva, API Manager nos provee de un mecanismo que nos permite configurar y personalizar la securización de endpoint.