Ktor OAuth集成问题:获取令牌后无法设置User Session
Ktor OAuth会话错误解决方案
问题原因
你碰到的Session data for type class com.example.plugins.UserSession was not registered错误,本质是Ktor的会话机制要求所有要存储的Session类必须提前在应用中注册,和你传入的参数无关——哪怕用硬编码的字符串创建UserSession,只要没注册类型就会报错。
解决步骤
1. 确保UserSession类可序列化
Ktor会话需要序列化Session对象,给你的UserSession加上@Serializable注解:
import kotlinx.serialization.Serializable @Serializable data class UserSession(val state: String, val accessToken: String)
如果项目还没引入kotlinx.serialization,需要在build.gradle.kts里添加依赖:
dependencies { implementation("io.ktor:ktor-serialization-kotlinx-json:$ktor_version") }
2. 在应用中注册UserSession类型
在Ktor应用配置模块(通常是Application.module函数)里,通过install(Sessions)注册UserSession,Cookie存储是最常用的入门方案:
import io.ktor.server.application.* import io.ktor.server.sessions.* fun Application.module() { // 安装并配置会话 install(Sessions) { cookie<UserSession>("USER_SESSION") { // 可选:配置Cookie属性,比如有效期、作用路径 cookie.path = "/" cookie.maxAgeInSeconds = 86400 // 有效期1天 } } // 这里放你的OAuth配置、路由定义(包括/callback)... }
3. 验证路由位置
确保你的/callback路由是在module函数的routing块内定义的,这样会话中间件才能覆盖到该路由。
完成以上步骤后,再调用call.sessions.set(UserSession(...))就不会再报注册错误了。
内容的提问来源于stack exchange,提问作者Fprogramer
相关产品推荐
相关产品推荐

