You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:57:26