如何在开启Ktor Client WebSocket时携带Bearer Token?
在浏览器环境下使用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
相关产品推荐
相关产品推荐

