Ktor 全栈之路 (5):JWT 认证全流程实战 —— 打造安全通信闭环

前言

如果一个后端 API 没有任何认证,那它在互联网上就是裸奔。

对于全栈项目来说,最流行的认证方案莫过于 JWT (JSON Web Token)。它的优势在于"无状态",服务器不需要存储 Session,非常适合 KMP 这种跨多个端(Android, iOS, Web)的场景。

今天我们就来手把手实现在 Ktor 中搭建 JWT 认证防线。


一、 JWT 的三驾马车

  1. Header:类型和加密算法。
  2. Payload :存放用户信息(如 userId, username)和过期时间。
  3. Signature:服务器私钥签名,防止篡改。

二、 后端实战:配置 JWT 校验

首先,在 Ktor 中安装认证插件:

kotlin 复制代码
install(Authentication) {
    jwt("auth-jwt") {
        realm = "Access to 'protected' routes"
        verifier(
            JWT.require(Algorithm.HMAC256("secret-key"))
                .withAudience("my-audience")
                .withIssuer("my-issuer")
                .build()
        )
        validate { credential ->
            if (credential.payload.getClaim("username").asString() != "") {
                JWTPrincipal(credential.payload)
            } else {
                null
            }
        }
    }
}

三、 实战:受保护的路由

配置好后,你可以通过 authenticate 块来保护特定的 API:

kotlin 复制代码
routing {
    // 登录接口:公开访问,返回 Token
    post("/login") {
        val user = call.receive<LoginRequest>()
        val token = generateToken(user) // 生成 JWT
        call.respond(mapOf("token" to token))
    }

    // 个人资料接口:必须带 Token 才能访问
    authenticate("auth-jwt") {
        get("/profile") {
            val principal = call.principal<JWTPrincipal>()
            val username = principal!!.payload.getClaim("username").asString()
            call.respondText("Welcome, $username!")
        }
    }
}

四、 全栈闭环:App 侧的 Token 存储

作为资深 Android 开发,你不仅要写后端,还要考虑 App 怎么存:

  1. 安全存储 :Android 用 EncryptedSharedPreferences,iOS 用 Keychain
  2. 自动注入 :利用 Ktor Client 的 Auth 插件,在每次发请求时自动在 Header 中加上 Authorization: Bearer <token>

五、 安全建议

  1. 绝不在 Payload 中存敏感信息 :记住,JWT 的 Payload 只是 Base64 编码,任何人都可以解码看里面的内容。它防的是篡改,不防偷看。不要把用户密码、手机号放进去。
  2. 使用 Refresh Token 机制:Access Token 设置短寿命(如 1 小时),Refresh Token 设置长寿命(如 30 天)。这能极大提升安全性。
  3. 私钥管理secret-key 绝对不能写死在代码里!生产环境必须通过环境变量或 AWS Secrets Manager 获取。

结语

掌握了 JWT,你就打通了前后端信任的"最后一公里"。你的 Ktor 后端现在已经具备了初步的商用安全性。

下一篇是大结局:Ktor 生产级调优:HTTPS、限流与监控

相关推荐
xcLeigh1 小时前
从搜索引擎到 AI 编程:开发者获取知识方式的范式转移
人工智能·ai·架构·ai编程·开发·范式转移
️学习的小王2 小时前
Python + MySQL 学生信息管理系统实战教程
android·python·mysql
XUHUOJUN2 小时前
Azure Stack Hub 套餐、计划与订阅模型深度解析(下篇)
microsoft·架构·azure stack
帅次2 小时前
Android 高级工程师面试:Flutter 路由导航 近1年高频追问 18 题
android·flutter·面试
微三云 - 廖会灵 (私域系统开发)2 小时前
电商系统API设计与开放平台建设:从内部调用到商业化API交付的架构演进
架构
AI应用苏大大2 小时前
企业AI采购决策架构缺陷:服务商主导选型导致技术绑架与成本失控的优化方案
人工智能·架构
薛定猫AI3 小时前
【技术干货】目标驱动型编码智能体实战:用 Claude Opus 4.8 构建可验证的开发任务闭环
人工智能·架构
qq_454245033 小时前
GraphFoundation — 通用图基础框架
算法·架构
alexhilton10 小时前
MVI模式的完整历史、误解和现代Android范式
android·kotlin·android jetpack