Я использую ktor v0.9.2 и хочу отправлять разный контент по одному и тому же маршруту, в зависимости от того, аутентифицирован пользователь или нет.
У меня проблема в том, что я не могу получить доступ к принципалу за пределами блока authenticate { }
.
Моя установка такая:
data class User(
val userId: Int
) : io.ktor.auth.Principal
fun Application.myApp() {
install(Authentication) {
jwt {
verifier(JwtConfig.verifier)
validate { credential ->
val userId = credential.payload.getClaim("userId").asInt()
when {
userId > 0 -> User(userId)
else -> null
}
}
}
}
install(DefaultHeaders)
install(CallLogging)
install(ContentNegotiation) {
jackson { }
}
install(Routing) {
authenticate {
get("/protected") {
// This works fine!!
val user = call.authentication.principal<User>()
call.respond(user)
}
}
get("/") {
val user = call.authentication.principal<User>() // -> User is always null here
if (user == null) {
call.respondText("Not Logged User")
} else {
call.respondText("Logged User")
}
}
}
}
Маршрут /protected
работает нормально, но в маршруте /
принципал всегда равен нулю. Я думаю, что это какой-то конвейер, но я немного растерялся. Может ли кто-нибудь дать некоторое представление? Спасибо!