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 |