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

Ktor Digest Authentication认证返回401 Unauthorized问题咨询

你观察到的realm返回值和预期不一致就是认证失败的直接原因。

问题根源

Ktor的Digest认证服务端配置默认使用Ktor Server作为realm值,你没有在服务端的digest配置块中显式指定自定义realm,导致实际生效的realm和你预计算哈希、客户端配置的realm完全不匹配,认证流程自然无法通过。
同时你贴出的服务端代码存在语法错误:userTable的mapOf定义缺少闭合右括号,会先导致编译异常。

解决方法

修正服务端Digest认证配置,显式指定realm为你定义的myRealm变量即可:

val myRealm = "Access to the '/' path"
// 补全mapOf的闭合右括号
val userTable: Map<String, ByteArray> = mapOf(
    "jetbrains" to getMd5Digest("jetbrains:$myRealm:foobar"),
    "admin" to getMd5Digest("admin:$myRealm:password")
)

fun Application.configureSecurity() {
    install(Authentication) {
        digest("myDigestAuth") {
            // 新增这行,指定自定义realm
            realm = myRealm
            digestProvider { userName, realm ->
                userTable[userName]
            }
        }
    }

    routing {
        authenticate("myDigestAuth") {
            get("/protected/route/digest") {
                val principal = call.principal<UserIdPrincipal>()!!
                call.respondText("Hello ${principal.name}")
            }
        }
    }
}

修改后服务端401响应的WWW-Authenticate头中的realm会变成你定义的Access to the '/' path,和客户端配置的realm、预存的用户哈希计算用的realm一致,认证即可正常通过。

内容的提问来源于stack exchange,提问作者Cristian Rosa jDark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:57:00