Autenticación de portador
La autenticación de portador (o autenticación por token) es un HTTP esquema de autenticación que implica el uso de tokens de seguridad llamados tokens portadores. El soporte para la Autenticación Bearer está incluido con IPF, esta guía explica cómo implementar la Autenticación Bearer en un RequestReplyConnectorTransport. Para obtener detalles adicionales sobre la configuración de un HTTPConnectorTransport por favor, consulte Inicio Rápido de HTTP.
Paso 1: Configurar AutoRefreshingAuthTokenManager
El AutoRefreshingAuthTokenManager la clase es proporcionada por el connector-http dependencia
@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 de destrucción, para asegurar que el killSwitch se invoca para terminar de manera elegante el Akka Flujo utilizado por AutoRefreshingAuthTokenManager
<2>`AutoRefreshingAuthTokenManager` debe ser configurado como un spring bean |
| 2 | A Clock se inyecta para ayudar en mapping de un propietario AccessToken a un IPF AuthToken |
| 3 | El AutoRefreshingAuthTokenManager publica events en el eventBus en el caso de fallo de autenticación-inyectado en el punto 11 |
| 4 | La configuración puede ser opcionalmente parametrizada como un ConfigurationProperties así facilite la configurabilidad vea Step 2
<6>`AutoRefreshingAuthTokenManager` usos Akka Streams so an ActorSystem needs to be injected |
| 5 | Inyecte una clase que implemente el AuthTokenProvider interfaz.AutoRefreshingAuthTokenManager delegará a esta clase para recuperar realmente un token de acceso de un proveedor de tokens, basado en los valores de refreshInterval, throttleInterval y ttlBeforeRefresh. A medida que el AuthTokenProvider realmente realizará la llamada para recuperar un token de un proveedor de tokens, estamos inyectando un SendingConnector, vea Step 3 |
| 6 | Una duración después de la cual se realiza una actualización del token triggered automáticamente. |
| 7 | Una duración dentro de la cual solo se permitirá una única solicitud de token de obtención (sin contar los reintentos). |
| 8 | Una duración que especifica el tiempo mínimo restante de vida útil de un token. Un refresco de token será triggered para todos los tokens cuyo TTL restante esté por debajo de este valor. == Paso 2: Configuración |
De acuerdo con el paso 1, algunos valores han sido expuestos como propiedades de configuración, por lo que deben ser configurados según corresponda.
token { (1)
refresh-interval = 7h (2)
throttle-interval = 5s (3)
ttl-before-refresh = 5m (4)
}
| 1 | En el ejemplo anterior, el ConfigurationProperties prefix 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 encuentra 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 ser convertido en el TokenProvider implementación a un AuthToken para el manejo en IPF
<2> Configure un HttpConnectorTransport para recuperar un AccessToken, para obtener detalles adicionales sobre la configuración de un HTTPConnectorTransport ver Inicio Rápido de HTTP
Paso 4: Agregar BearerTokenEnricher
Para los puntos finales que implementan la Autenticación Bearer, un BearerTokenEnricher puede ser añadido a la RequestReplyHttpConnectorTransport, que luego utiliza el AutoRefreshingAuthTokenManager(o cualquier clase que implemente el AuthTokenProvider interface)
@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 | Inyectando AutoRefreshingAuthTokenManager configurado en Step 1 |
| 2 | Nombre del host del punto final según se recupera de la configuración de la aplicación |
| 3 | Puerto de host según 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 connector-http módulo, recibe un AuthTokenProvider en el ejemplo proporcionado estamos utilizando el AutoRefreshingAuthTokenManager que implementa el AuthTokenProvider interfaz |
| 6 | En este ejemplo, se realiza una verificación para comprobar si el uri contiene " https ", si es así, configura el transporte con un SSLContext de acuerdo con el punto 8, de lo contrario está configurado sin este contexto según el punto 9 |