Ktor中使用Cookie验证JWT令牌遇401错误求助
问题核心:默认JWT认证器仅从Authorization请求头读取Bearer <token>格式的令牌,而你的令牌存储在auth_token Cookie中,导致认证器无法获取令牌,直接触发challenge返回401,不会进入validate代码块。
解决方案:修改JWT认证配置,从Cookie提取令牌
在jwt("auth-jwt")块中添加credentials配置,指定从Cookie读取令牌:
install(Authentication) { jwt("auth-jwt") { realm = jwtRealm val jwtAlgorithm = Algorithm.HMAC256(jwtSecret) verifier( JWT.require(jwtAlgorithm) .withIssuer(jwtIssuer) .build() ) // 新增:从Cookie提取令牌 credentials { call -> val token = call.request.cookies["auth_token"] JWTPrincipalCredentials(token) } validate { credential -> Log.i(TAG, "name: " + credential.payload.getClaim("name").asString()) if (credential.payload.getClaim("name").asString().isNotEmpty()) { JWTPrincipal(credential.payload) } else { null } } challenge { defaultScheme, realm -> call.respond(HttpStatusCode.Unauthorized, "Token is not valid or has expired") } } }
关键说明
credentials块负责从请求中提取令牌,这里直接从auth_tokenCookie获取并封装为JWTPrincipalCredentials- 确保前端请求携带Cookie(跨域场景下需配置
withCredentials) - 验证令牌的算法、Issuer等参数需和生成令牌时完全一致(你的
makeToken方法已匹配,无需修改)
额外检查项
- 确认Cookie的
path设置为/,确保所有接口都能携带该Cookie - 检查令牌是否过期(你的
makeToken设置了约16分钟过期,可临时延长测试) - 确保
jwtSecret、jwtIssuer等常量在生成和验证时使用同一值
内容的提问来源于stack exchange,提问作者Ozgur Baykal
相关产品推荐
相关产品推荐

