【发布时间】:2021-06-10 13:37:11
【问题描述】:
我正在制作一个使用 keycloak 作为身份验证的 ktor Web 应用程序。
val keycloakProvider = OAuthServerSettings.OAuth2ServerSettings(
name = CLIENT_NAME,
authorizeUrl = KEYCLOAK_AUTH,
accessTokenUrl = KEYCLOAK_TOKEN,
clientId = CLIENT_ID,
clientSecret = CLIENT_SECRET,
accessTokenRequiresBasicAuth = false,
requestMethod = HttpMethod.Post, // must POST to token endpoint
defaultScopes = listOf("roles")
)
我想要保护多个端点,但重定向 URI 只能设置为一个 URL,在下面的示例中为 /login/oauth 和 /secret。
install(Authentication)
{
oauth("secretOAuth") {
client = HttpClient(Apache)
providerLookup = { keycloakProvider }
urlProvider = { "/secret" }
}
oauth("keycloakOAuth") {
client = HttpClient(Apache)
providerLookup = { keycloakProvider }
urlProvider = { "/login/oauth" }
}
}
像上面的示例那样创建多个这样的身份验证路径是否有意义,还是不好的做法?
/login/oauth 和 /secret 指向以下路由:
authenticate(keycloakOAuth) {
get("/login/oauth") {
val principal = call.authentication.principal<OAuthAccessTokenResponse.OAuth2>()
?: throw Exception("No principal was given")
createSession(principal)
call.respondRedirect("/")
}
}
authenticate(secretOAuth){
get("/secret")
{
val principal = call.authentication.principal<OAuthAccessTokenResponse.OAuth2>()
?: throw Exception("No principal was given")
createSession(principal)
call.respondHtml {
body{
h1{
+"You accessed secure page!"
}
}
}
}
}
功能方面,它可以工作,当用户未登录时,它会通过登录窗口提示他们,否则他们会看到秘密/他们的会话被创建,但我不确定这是否是正确的做法它。真的没有办法根据访问的URI更改urlProvider吗?因为那样我将不得不为每个受保护的端点进行身份验证,这可能有点太多了。
【问题讨论】:
标签: authentication web oauth-2.0 keycloak ktor