如何记录并响应来自 Ktor 中 JWT 授权失败的错误消息?

Posted

技术标签:

【中文标题】如何记录并响应来自 Ktor 中 JWT 授权失败的错误消息?【英文标题】:How to log and respond with error messages from failed JWT authorisation in Ktor? 【发布时间】:2021-05-19 23:17:49 【问题描述】:

当我授权请求时,如果 JWT 中的任何标准声明无效,或者由于某些其他原因(例如签名不正确)而失败,我希望能够查看到底是什么不正确,尤其是在测试时。目前,我无法在Unauthorized 401 响应中看到任何消息,也无法在我的日志中看到任何消息。

我的身份验证设置(在我的 Application.module() 函数中),使用 auth0-jwt 库。

    val jwtVerifier = JWT.require(Algorithm.RSA256(getPublicKeyFromString(publicKey), null))
        .withAudience("audience")
        .acceptLeeway(1)
        .acceptExpiresAt(5)
        .build()

    install(Authentication) 
        jwt 
            verifier(jwtVerifier)
            validate  credential: JWTCredential ->
                JWTPrincipal(credential.payload)
            
        
    

    @OptIn(KtorExperimentalLocationsAPI::class)
    install(Locations) // see http://ktor.io/features/locations.html
    install(Routing) 
        authenticate 
            ServiceEndpoints()
        
    

我已经设置了一个端点处理程序如下:

fun Route.ServiceEndpoints() 
   
    get<Paths.getData>  params ->
        checkCustomClaim(context.authentication.principal(), <some other parameters here>)
        //handling code here

    

我会指出,如果自定义声明失败,checkCustomClaim() 将引发 AuthorisationException(只是我创建的一个简单异常)。我这样做是因为每个端点都会检查我的自定义声明中的不同信息。

我已尝试使用自定义状态页面在响应中获取日志和更多信息。我能够获取我的 AuthorisationExceptions 的日志消息和响应数据,但不能获取标准声明中的失败。

install(StatusPages) 
    exception<JWTVerificationException>  cause ->
        log.warn("Unauthorized: $cause.message")
        this.call.respond(
            status = HttpStatusCode.Unauthorized,
            message = cause.message ?: "Unauthorized"
        )
    
    exception<AuthorisationException>  cause ->
        log.warn("Unauthorized: $cause.message")
        this.call.respond(
            status = HttpStatusCode.Unauthorized,
            message = cause.message ?: "Unauthorized"
        )
    
    

【问题讨论】:

在仔细检查 Ktor 源后,可以在跟踪级别使用 io.ktor.auth.jwt 的记录器记录 JWT 验证失败。不过,我仍在寻找一种很好的方法来将该消息放入响应中。 【参考方案1】:

您可以使用写在TRACE 级别的JWT diagnostics 日志中的信息。

【讨论】:

以上是关于如何记录并响应来自 Ktor 中 JWT 授权失败的错误消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何访问自定义 Ktor JWT 挑战中的错误?

将 JWT 与 Ktor 一起使用并在声明中包含用户信息

为啥我的 Ktor 应用程序会在几秒钟后失败?

基本身份验证应在邮递员中响应 500(授权),但 401 Unauthorized 可以正常工作。使用 ktor intellij mongodb

ASP.NET Core 2.0 JWT 验证失败并出现“用户授权失败:(null)”错误

Django DRF websocket 通道 2 并使用来自 Simple JWT 的令牌进行授权