Documentation for a newer release is available. View Latest

Autenticación Bearer

La Autenticación Bearer (o autenticación por token) es un esquema de autenticación HTTP que implica usar tokens de seguridad llamados bearer tokens. IPF incluye soporte para Autenticación Bearer; esta guía explica cómo implementarla en un RequestReplyConnectorTransport. Para detalles adicionales sobre la configuración de un HTTPConnectorTransport consulte Inicio rápido de HTTP.

Paso 1: Configurar AutoRefreshingAuthTokenManager

La clase AutoRefreshingAuthTokenManager es proporcionada por la dependencia connector-http

    @Bean(destroyMethod = "shutdown")
    AutoRefreshingAuthTokenManager authTokenManager(SendingConnector<Object, AccessToken> authTokenConnector, (2)
                                                    Clock clock, (3)
                                                    EventBus eventBus) { (4)

        var tokenConfiguration = apiClientProperties.getToken(); (5)

        return new AutoRefreshingAuthTokenManager(
            actorSystem, (6)
            new OAuthTokenProvider(authTokenConnector, clock), (7)
            tokenConfiguration.getRefreshInterval(), (8)
            tokenConfiguration.getThrottleInterval(), (9)
            tokenConfiguration.getTtlBeforeRefresh(), (10)
            eventBus (11)
        );
    }
1 Especifique el método destroy para asegurar que se invoque el killSwitch a fin de terminar limpiamente el flujo de Akka usado por AutoRefreshingAuthTokenManager
2 AutoRefreshingAuthTokenManager debe configurarse como un bean de Spring
3 Se inyecta un Clock para ayudar a mapear de un AccessToken propietario a un AuthToken de IPF
4 AutoRefreshingAuthTokenManager publica eventos en el eventBus en caso de fallo de autenticación (inyectado en el punto 11)
5 La configuración puede parametrizarse opcionalmente como ConfigurationProperties para facilitar la configurabilidad; vea Paso 2
6 AutoRefreshingAuthTokenManager usa Akka Streams, por lo que se debe inyectar un ActorSystem
7 Inyecte una clase que implemente la interfaz AuthTokenProvider. AutoRefreshingAuthTokenManager delegará a esta clase para recuperar realmente un access token de un proveedor de tokens, en base a los valores refreshInterval, throttleInterval y ttlBeforeRefresh. Como el AuthTokenProvider hará la llamada para recuperar un token de un proveedor, estamos inyectando un SendingConnector, vea Paso 3
8 Duración tras la cual se desencadena automáticamente un refresh del token.
9 Duración dentro de la cual solo se permitirá pasar una única solicitud de obtención de token (sin contar reintentos).
10 Duración que especifica el tiempo de vida restante mínimo de un token. Se disparará un refresh para todos los tokens cuyo TTL restante esté por debajo de este valor.

Paso 2: Configuración

Como en el paso 1, algunos valores se han expuesto como propiedades de configuración, por lo que deben configurarse según corresponda

token { (1)
  refresh-interval = 7h (2)
  throttle-interval = 5s (3)
  ttl-before-refresh = 5m (4)
}
1 En el ejemplo anterior el prefijo de ConfigurationProperties es token
2 Especificado en un formato aceptado por Spring Boot.
3 Especificado en un formato aceptado por Spring Boot.
4 Especificado en un formato aceptado por Spring Boot.

Paso 3: Crear SendingConnector

A continuación se muestra un SendingConnector para recuperar un AccessToken

    SendingConnector<Object, AccessToken> authTokenSendConnector() { (1)

        var connectorTransport = apiTransportBuilderWithName("AuthTokenConnectorTransport").build(); (2)
        return new RequestReplySendConnector.Builder<Object, Object, AccessToken, AccessToken>("AuthTokenRequestReplyConnector")
            .withActorSystem(actorSystem)
            .withTargetToTransportMessageConverter(new TransportAuthTokenMessageConverter(apiClientProperties))
            .withTransportMessageToTargetConverter(this::transportMessageToAuthToken)
            .withConnectorTransport(connectorTransport)
            .build();
    }
1 AccessToken es el formato de token propietario devuelto por un proveedor de tokens externo. Esto debe convertirse en la implementación de TokenProvider a un AuthToken para manejarlo en IPF
2 Configure un HttpConnectorTransport para recuperar un AccessToken; para más detalles sobre la configuración de un HTTPConnectorTransport vea Inicio rápido de HTTP

Paso 4: Agregar BearerTokenEnricher

Para endpoints que implementan Autenticación Bearer, se puede agregar un BearerTokenEnricher al RequestReplyHttpConnectorTransport, que luego usa el AutoRefreshingAuthTokenManager (o cualquier clase que implemente la interfaz AuthTokenProvider)

    @Bean
    @SneakyThrows
    RequestReplyHttpConnectorTransport exampleConnectorTransport(AutoRefreshingAuthTokenManager tokenManager) { (1)

        var transportBuilder = new RequestReplyHttpConnectorTransport
            .Builder()
            .withName("ExampleTransport")
            .withActorSystem(actorSystem)
            .withHost(apiClientProperties.getBaseUrl()) (2)
            .withPort(apiClientProperties.baseUriPort()) (3)
            .withProxyHost(apiClientProperties.proxyHost()) (4)
            .withProxyPort(apiClientProperties.proxyPort()) (5)
            .withEnricher(new BearerTokenEnricher(tokenManager)); (6)

        return apiClientProperties.isHttpsUri(apiClientProperties.baseUri()) (7)
            ? transportBuilder.withSslContext(SSLContext.getDefault()).build() (8)
            : transportBuilder.build(); (9)
    }
1 Inyectar AutoRefreshingAuthTokenManager configurado en Paso 1
2 Host del endpoint tal como se recupera de la configuración de la aplicación
3 Puerto del host tal como se recupera de la configuración de la aplicación
4 Configuración de proxy (opcional)
5 Configuración de proxy (opcional)
6 BearerTokenEnricher es una clase proporcionada por el módulo connector-http; recibe un AuthTokenProvider. En el ejemplo usamos AutoRefreshingAuthTokenManager, que implementa la interfaz AuthTokenProvider
7 En este ejemplo se verifica si el URI contiene "https"; si es así, se configura el transport con un SSLContext como en el punto 8; de lo contrario, se configura sin ese contexto como en el punto 9