将 JWT 与 Ktor 结合使用并在声明中包含用户信息
Using JWT with Ktor and including user info in claim
我已在我的应用程序中成功包含一个 jwt 身份验证令牌,并且能够限制对端点的访问。我想在jwt令牌中嵌入用户的ID,但我正在努力如何在Ktor中实现jwt验证器。
我为客户创建了一个类似这样的令牌:
val token = JWT.create().withAudience(audience).withIssuer(issuer).withClaim("userId", "XXX").sign(algorithm)
路线是这样设置的。身份验证 {} 块在服务器启动时为 运行,并且不允许使用 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()
正确的做法是什么?我知道我需要为每个请求创建一个验证器,但我真的不知道在哪里做,也不知道这是否可取。
你应该在这里实现它。您不需要检查用户 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
}
我已在我的应用程序中成功包含一个 jwt 身份验证令牌,并且能够限制对端点的访问。我想在jwt令牌中嵌入用户的ID,但我正在努力如何在Ktor中实现jwt验证器。
我为客户创建了一个类似这样的令牌:
val token = JWT.create().withAudience(audience).withIssuer(issuer).withClaim("userId", "XXX").sign(algorithm)
路线是这样设置的。身份验证 {} 块在服务器启动时为 运行,并且不允许使用 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()
正确的做法是什么?我知道我需要为每个请求创建一个验证器,但我真的不知道在哪里做,也不知道这是否可取。
你应该在这里实现它。您不需要检查用户 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
}