从SpringBoot Java迁移到Kotlin+http4k:获取RefreshingOAuthToken生成的JWT
在http4k中暴露路由返回OAuth2 JWT的方案
当然有等效方案。http4k的RefreshingOAuthToken过滤器本身已经内置了token的自动刷新与管理能力,要获取它生成的JWT,核心是持有并访问过滤器使用的TokenStore,具体实现步骤如下:
1. 显式创建TokenStore实例
默认情况下RefreshingOAuthToken会内部创建InMemoryTokenStore,但为了外部能访问到存储的token,我们需要自己实例化并传入过滤器:
// 显式创建内存token存储,后续用来获取最新token val tokenStore = InMemoryTokenStore()
2. 修改OAuth客户端配置
在创建RefreshingOAuthToken过滤器时,把自定义的tokenStore传入构造参数,替换默认的内部存储:
fun provideOauthClient( @Named("baseHttp") baseHttp: @JvmSuppressWildcards Function1<Request, Response>, @Named(OAUTH_CLIENT_ID) clientId: String, @Named(OAUTH_CLIENT_SECRET) clientSecret: String ): Pair<@JvmSuppressWildcards HttpHandler, TokenStore> { val clientCredentials = Credentials(clientId, clientSecret) val handler = ClientFilters.RefreshingOAuthToken( oauthCredentials = clientCredentials, tokenUri = Uri.of("/token"), backend = baseHttp, oAuthFlowFilter = ClientFilters.OAuthClientCredentials(clientCredentials), gracePeriod = Duration.ofSeconds(1), tokenStore = tokenStore // 传入自定义的token存储实例 ).then(baseHttp) return handler to tokenStore }
这里把返回类型改为Pair<HttpHandler, TokenStore>,方便后续路由模块获取tokenStore实例。
3. 编写暴露JWT的路由
通过tokenStore的getToken方法获取当前的OAuth2 token,提取其中的access_token(即JWT)返回:
// 假设已拿到provideOauthClient返回的tokenStore实例 val tokenRoute = routes( "/oauth/current-token" bind GET to { _: Request -> tokenStore.getToken()?.accessToken?.let { jwtToken -> Response(OK).body(jwtToken) } ?: Response(UNAUTHORIZED).body("无有效token可用") } )
补充说明
- 首次访问路由时,如果tokenStore中没有token,会返回401。你可以在路由逻辑里主动触发一次被OAuth过滤器包装的请求,确保token已生成后再返回。
RefreshingOAuthToken会自动处理token的过期刷新,tokenStore始终保存最新的有效token,这和Spring的ReactiveOAuth2AuthorizedClientManager的核心职责完全一致。
内容的提问来源于stack exchange,提问作者Blackbelt
相关产品推荐
相关产品推荐

