You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在开启Ktor Client WebSocket时携带Bearer Token?

Ktor Client v2.3.0 WSS连接添加Authorization头的正确方式

在浏览器环境下使用Ktor Client建立WSS连接时,直接在wss的request块中调用header方法添加Authorization头会失效——这是因为浏览器原生WebSocket API限制了自定义请求头的设置,会忽略这类头信息,导致后端无法获取令牌进而拒绝连接。

以下是两种可行的解决方案:

方案一:通过URL查询参数传递令牌

将Authorization令牌嵌入到WSS连接的URL查询参数中,后端从查询参数提取令牌验证:

suspend fun main() {
    val client = HttpClient() {
        install(ContentNegotiation) {
            json()
        }
        install(WebSockets) {
            pingInterval = 300_000
        }
    }

    client.wss(
        request = {
            url.takeFrom("wss://localhost:8000/ws/test?token=Bearer%20THISTOKENISINVALID00")
        },
        block = {
            close(CloseReason(CloseReason.Codes.NORMAL, ""))
        }
    )
}

注意:需要对令牌中的空格等特殊字符进行URL编码(示例中用%20替换空格)。

方案二:通过Cookie传递令牌

先将Authorization令牌写入浏览器Cookie,后端从Cookie中读取令牌:

suspend fun main() {
    // 先设置Cookie,注意根据实际环境调整secure、SameSite等属性
    document.cookie = "Authorization=Bearer THISTOKENISINVALID00; path=/; secure; SameSite=Strict"

    val client = HttpClient() {
        install(ContentNegotiation) {
            json()
        }
        install(WebSockets) {
            pingInterval = 300_000
        }
    }

    client.wss(
        request = {
            url.takeFrom("wss://localhost:8000/ws/test")
        },
        block = {
            close(CloseReason(CloseReason.Codes.NORMAL, ""))
        }
    )
}

补充:如果是在JVM等非浏览器环境下,直接使用header方法添加Authorization头是有效的,仅浏览器环境受限于原生API需要使用上述替代方案。

内容的提问来源于stack exchange,提问作者Jolly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 16:05:11