问题与使用JWT的WebSocket认证有关。
我知道如何使用路由(HTTP请求)创建常规API调用,使用JWT进行身份验证,并且工作良好。
困扰我的事情是如何使用JWT与WebSockets工作时?身份验证不能像处理HTTP请求那样处理JWT。我已经研究了一下怎么做,但是没有结果。
问题是我如何使用JWT认证WebSocket路由?任何指针都很感激,或者如果我错过了它是如何工作的,你会好心解释我理解错误的地方吗?
我发现在authenticate中包装WebSocket路由实际上需要报头中的令牌。从那里,我可以做同样的我做与路由(从呼叫中获取数据,建立连接),并关闭套接字,如果用户没有经过身份验证。如果有人遇到这个问题,我就把它留在这里。
routing {
authenticate {
webSocket("/ws") {
val principal = call.principal<JWTPrincipal>()
val email = principal?.payload?.getClaim("email")?.asString()
val expiresAt = principal?.expiresAt?.time ?: System.currentTimeMillis()
val users = userService.getAllUsers()
val randNum = Random(System.currentTimeMillis()).nextInt(0, 2)
if (randNum % 2 == 0) {
close(CloseReason(CloseReason.Codes.PROTOCOL_ERROR, "Please auth the user"))
}
incoming.consumeAsFlow()
.mapNotNull {
(it as? Frame.Text)?.readText()?.let { data ->
Json.decodeFromString<User>(data)
}
}.collect {
send(Frame.Text(userService.insertUser(it).toString()))
}
}
}
}