Ktor websockets 身份验证
Posted
技术标签:
【中文标题】Ktor websockets 身份验证【英文标题】:Ktor websockets authentication 【发布时间】:2021-12-11 01:50:53 【问题描述】:问题与使用 JWT 的 WebSocket 身份验证有关。
我知道如何使用路由(HTTP 请求)创建常规 API 调用,使用 JWT 对其进行身份验证并且工作正常。
困扰我的是在使用 WebSockets 时如何使用 JWT?身份验证不适用于 JWT,就像 HTTP 请求一样。我已经研究过如何但遇到了死胡同。
问题是如何使用 JWT 验证 WebSocket 路由?任何指针表示赞赏,或者如果我错过了它的工作原理,请您解释一下我的理解错误。
【问题讨论】:
我觉得你的做法是对的。 【参考方案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()))
【讨论】:
以上是关于Ktor websockets 身份验证的主要内容,如果未能解决你的问题,请参考以下文章
来自 UserHashedTableAuth 的 Ktor 基本身份验证
Firebase 身份验证不适用于 AppEngine 上的 Ktor 应用程序
基本身份验证应在邮递员中响应 500(授权),但 401 Unauthorized 可以正常工作。使用 ktor intellij mongodb