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 应用程序

Android 中 Ktor 服务器身份验证的几个问题

在 KTor 客户端中更改身份验证凭据

基本身份验证应在邮递员中响应 500(授权),但 401 Unauthorized 可以正常工作。使用 ktor intellij mongodb

使用 websockets 和 Nest.js 的 Passport 会话身份验证未进行身份验证