sábado, 15 de febrero de 2020

Wiremock: Moquear backend HTTPS

Ya hemos hablado otras veces de Wiremock y de muchas de sus posibilidades, aquí o aquí. Hoy vamos a ver algo más de esta gran herramienta de QA para web services, API REST o microservicios. En este caso veremos como simular con Wiremock que nuestro servidor/backend tiene un certificado SSL. Es decir que lo podemos invocar a través de HTTP. 

Para empezar vamos a indicar los pasos necesarios para crear un certificado autofirmado. Este certificado consta de un par de claves: pública/privada Y para crearlo usaremos el siguiente comando, que contiene varios parámetros claves:
  • alias: El identificador de la clave que vamos a crear.
  • keypass/storepass: Las claves de la clave privada y del almacén de claves.
  • keystore: El almacén de claves donde almacenaremos el certificado.
keytool -genkey -alias localhost -keyalg RSA -keysize 1024 \
 -validity 365 -keypass password -keystore identity.jks -storepass password

Una vez ejecutado nos pedirá diferentes valores. Lo importante es que en el primer valor pongamos el nombre de la máquina, normalmente localhost.

Ya creado nuestro almacén de certificados con el certificado autofirmado, vamos a proceder a configurar el Wiremock. Primero lo haremos a través de JUnit y luego en el modo Standalone.

Para el modo Java, vamos a realizarlo con JUnit 5, para el cual no podemos utilizar la anotación @Rule. Así que lo configuraremos y arrancaremos a través de las anotaciones @Before y @After.

private final static String FOLDER = "src/test/resources/wiremock";
WireMockServer wireMockServer;
@BeforeEach
public void setup() {
    wireMockServer = new WireMockServer(WireMockConfiguration.wireMockConfig()
        .withRootDirectory(FOLDER).port(57002).httpsPort(57005)
        .keystorePath(FOLDER + "/identity.jks")
        .notifier(new ConsoleNotifier(true)));
    wireMockServer.start();
}

Ahora realizaremos el test con la hipotética llamada securizada a través de HTTPS.

@Test
public void getToken() {
    try {
        wireMockServer.stubFor(post(urlPathEqualTo("/token"))
            .withQueryParam("grant_type", WireMock.equalTo("client_credentials"))
            .withHeader("Authorization", WireMock.equalTo("Basic MTIzNDo0MzIx"))
            .willReturn(aResponse().withBodyFile("tokenCredentialsResponse.json")));
        Map<String, String> headers = new HashMap<>();
        headers.put("Authorization", "Basic MTIzNDo0MzIx");
        String sEndpoint = "https://localhost:57005/token?grant_type=client_credentials";
        Token token = HttpClientHelper.doPost(sEndpoint, headers, Token.class);
        assertThat(token, is(notNullValue()));
        assertThat(token.getAccessToken(), is(equalTo("123456")));
    } catch (IOException except) {
        log.error(except.getMessage(), except);
        Assert.fail();
    }
 }

Si queremos ejecutarlo en modo standalone, debemos arrancar Wiremock con el siguiente comando.

java -jar wiremock-standalone-2.25.1.jar --https-port 57005 --port 57002 --verbose --https-keystore ./identity.jks

Podremos comprobar su funcionamiento con el siguiente curl

curl -X POST \
  'https://localhost:57005/token?grant_type=client_credentials' \
  -H 'Authorization: Basic MTIzNDo0MzIx' 

Todo el código lo podéis encontrar aquí.

No hay comentarios:

Publicar un comentario