Kotlin 为什么我的Ktor应用程序在几秒钟后失败?
我有一个小的Ktor应用程序(我知道这是一个愚蠢的应用程序,我是一个试图学习Ktor的初学者): 我的build.gradle.kts:Kotlin 为什么我的Ktor应用程序在几秒钟后失败?,kotlin,netty,ktor,Kotlin,Netty,Ktor,我有一个小的Ktor应用程序(我知道这是一个愚蠢的应用程序,我是一个试图学习Ktor的初学者): 我的build.gradle.kts: import com.auth0.jwt.JWT import com.auth0.jwt.JWTVerifier import com.auth0.jwt.algorithms.Algorithm import io.ktor.application.* import io.ktor.auth.* import io.ktor.auth.jwt.* impo
import com.auth0.jwt.JWT
import com.auth0.jwt.JWTVerifier
import com.auth0.jwt.algorithms.Algorithm
import io.ktor.application.*
import io.ktor.auth.*
import io.ktor.auth.jwt.*
import io.ktor.features.*
import io.ktor.jackson.*
import io.ktor.response.*
import io.ktor.routing.*
import io.ktor.server.netty.*
private val algorithm = Algorithm.HMAC256("secret")
private fun makeJwtVerifier(issuer: String, audience: String): JWTVerifier = JWT
.require(algorithm)
.withAudience(audience)
.withIssuer(issuer)
.build()
fun main(args: Array<String>): Unit = EngineMain.main(args)
fun Application.module(testing: Boolean = false) {
val jwtIssuer = environment.config.property("jwt.domain").getString()
val jwtAudience = environment.config.property("jwt.audience").getString()
val jwtRealm = environment.config.property("jwt.realm").getString()
install(ContentNegotiation) {
jackson()
}
install(Authentication) {
basic {
realm = jwtRealm
validate { credentials ->
UserIdPrincipal(credentials.name)
}
}
jwt {
realm = jwtRealm
verifier(makeJwtVerifier(jwtIssuer, jwtAudience))
validate { credential ->
if (credential.payload.audience.contains(jwtAudience)) JWTPrincipal(credential.payload) else null
}
}
}
routing {
authenticate("basic") {
post("/auth/login") {
val principal = call.principal<UserIdPrincipal>() ?: error ("no auth found")
call.respondText(principal.name)
}
}
}
}
ktor {
development = true
deployment {
port = 8080
watch = [ com.contedevel ]
}
application {
modules = [ com.contedevel.backend.ApplicationKt.module ]
}
jwt {
domain = "https://localhost/"
audience = "jwt-audience"
realm = "acupoftea"
}
}
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
application
kotlin("jvm") version "1.4.30"
}
group = "com.contedevel"
version = "1.0-SNAPSHOT"
application {
mainClass.set("io.ktor.server.netty.EngineMain")
}
repositories {
mavenCentral()
}
dependencies {
// Standard
implementation(kotlin("stdlib"))
// Ktor
implementation("io.ktor:ktor-server-core:1.5.2")
implementation("io.ktor:ktor-server-netty:1.5.2")
implementation("ch.qos.logback:logback-classic:1.2.1")
// Jackson
implementation("io.ktor:ktor-jackson:1.5.2")
// JWT
implementation("io.ktor:ktor-auth:1.5.2")
implementation("io.ktor:ktor-auth-jwt:1.5.2")
// Testing
testImplementation(kotlin("test-junit"))
}
tasks.test {
useJUnit()
}
tasks.withType<KotlinCompile>() {
kotlinOptions.jvmTarget = "13"
}
然而,当我调用/gradlew build
时,一切都成功了。。。我犯了什么错
p.S.我使用的是Liberica JDK v.15我在运行应用程序时遇到两个错误:
未找到属性jwt.accession
。可以通过传递所需的参数来修复此错误和类似错误:/gradlew run-P:jwt.domain=domain-P:jwt.acquisition=acquisition-P:jwt.realm=realm
名为null的提供程序已注册
。这是由于未命名提供程序的名称冲突造成的,可以通过显式命名修复:install(Authentication) {
basic("basic") {
realm = jwtRealm
validate { credentials ->
UserIdPrincipal(credentials.name)
}
}
jwt("jwt") {
realm = jwtRealm
verifier(makeJwtVerifier(jwtIssuer, jwtAudience))
validate { credential ->
if (credential.payload.audience.contains(jwtAudience)) JWTPrincipal(credential.payload) else null
}
}
}
您是如何运行应用程序的?我在输出中没有看到错误,只有一些警告。通过IDEA中
main
函数左侧的槽图标
install(Authentication) {
basic("basic") {
realm = jwtRealm
validate { credentials ->
UserIdPrincipal(credentials.name)
}
}
jwt("jwt") {
realm = jwtRealm
verifier(makeJwtVerifier(jwtIssuer, jwtAudience))
validate { credential ->
if (credential.payload.audience.contains(jwtAudience)) JWTPrincipal(credential.payload) else null
}
}
}