【问题标题】: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()))
                }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2011-02-11
    • 1970-01-01
    • 2019-10-28
    • 2018-03-12
    • 2017-08-25
    • 2019-10-29
    • 2021-10-11
    • 2013-06-26
    • 1970-01-01
    相关资源
    最近更新 更多