如何记录并响应来自 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 授权失败的错误消息?的主要内容,如果未能解决你的问题,请参考以下文章
基本身份验证应在邮递员中响应 500(授权),但 401 Unauthorized 可以正常工作。使用 ktor intellij mongodb