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
相关产品推荐
相关产品推荐

