将JWT与Ktor一起使用并在索赔中包含用户信息

时间:2018-03-06 22:08:22

标签: kotlin jwt ktor

我已成功在我的应用程序中包含一个jwt身份验证令牌,并且能够限制对端点的访问。我想在jwt令牌中嵌入用户ID,但我正在努力如何在Ktor中实现jwt验证器。

我为客户创建了这样的代码:

val token = JWT.create().withAudience(audience).withIssuer(issuer).withClaim("userId", "XXX").sign(algorithm)

路线设置如下。 authentication {}块在服务器启动时运行,不允许使用userId创建验证程序。

这来自jwt样本:

route("/api") {
    authentication {
        val jwtVerifier = makeJwtVerifier(issuer, audience)
        jwtAuthentication(jwtVerifier, realm) { credential ->
        if (credential.payload.audience.contains(audience))
            JWTPrincipal(credential.payload)
        else
            null
    }

    handle {
       // Handle jwt succcess here
    }
}

private fun makeJwtVerifier(issuer: String, audience: String): JWTVerifier = JWT
        .require(algorithm)
        .withAudience(audience)
        .withIssuer(issuer)
        .build()

这样做的正确方法是什么?我理解我需要为每个请求创建一个验证程序,但是不知道该在哪里执行此操作,也不知道这是否合适。

1 个答案:

答案 0 :(得分:1)

你应该在这里实现它。您不需要检查用户ID的验证程序。

jwtAuthentication(jwtVerifier, realm) { credential ->
  if (credential.payload.audience.contains(audience))
    val userId = credential.payload.claims["userId"].asString()
    // check if user exists ... if you want

    JWTPrincipal(credential.payload)
  else
    null
}