Kotlin 为什么我的Ktor应用程序在几秒钟后失败?

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

我有一个小的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.*
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
            }
        }
    }