【发布时间】:2021-11-04 21:54:16
【问题描述】:
我正在使用通过 keycloak 进行身份验证的服务器。在 keycloak 中,我创建了一个领域,并且能够获得一个访问令牌作为响应。这个访问令牌现在被输入到我的 Ktor 应用程序中。
但是,我不太确定如何以简单的方式保护路线。我希望有一些受保护的路由,其周围有一个authenticate("keycloakOAuth"){} 范围,用于处理验证访问令牌并在访问令牌过期时使用刷新令牌进行刷新。
目前我在 Ktor 中的 keycloak 配置如下:
authenticate("keycloakOAuth") {
get("login") {}
route("/callback") {
// This handler will be executed after making a request to a provider's token URL.
handle {
val principal = call.authentication.principal<OAuthAccessTokenResponse>()
if (principal != null) {
val response = principal as OAuthAccessTokenResponse.OAuth2
call.respondText { "Access token: ${response.accessToken}" }
} else {
call.respondText { "NO principal" }
}
}
}
}
这很好用,因为当我登录时,我会被发送到 Keycloak 登录页面并且我可以登录。当我登录时,回调执行,我得到了我的访问令牌。
但是,当我尝试保护路线时,会发生一些奇怪的事情。我知道我需要验证传入的 JWT 令牌。但我不知道如何赋予 Ktor 能力。这些例子也没什么帮助,因为它们很模糊。
目前我有这样的事情:
authenticate("keycloakOAuth") {
get("/testAuth") {
val principal = call.authentication.principal<OAuthAccessTokenResponse.OAuth2>()
if(principal != null) {
call.respondText("Authenticated!")
} else {
call.respondText("Unauthenticated...")
}
}
}
但我的应用程序将始终将我发送到登录页面,然后是回调页面,即使我在测试此调用时正在发送 Bearer 令牌。
我的问题是:
如何以需要有效令牌的方式保护路由,使用与 Ktor 相同的语法(如 authenticate(){})。我需要为此配置 JWT 吗?
【问题讨论】:
标签: kotlin keycloak access-token ktor