【问题标题】:Ktor websockets authenticationKtor websockets 身份验证
【发布时间】:2021-12-11 01:50:53
【问题描述】:
问题与使用 JWT 的 WebSocket 身份验证有关。
我知道如何使用路由(HTTP 请求)创建常规 API 调用,使用 JWT 对其进行身份验证并且工作正常。
困扰我的是在使用 WebSockets 时如何使用 JWT?身份验证不适用于 JWT,就像 HTTP 请求一样。我已经研究过如何但遇到了死胡同。
问题是如何使用 JWT 验证 WebSocket 路由?任何指针表示赞赏,或者如果我错过了它的工作原理,请您解释一下我的理解错误。
【问题讨论】:
标签:
kotlin
authentication
websocket
jwt
ktor
【解决方案1】:
我发现将 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()))
}
}
}
}