本文已使用 Google Cloud Translation API 自动翻译。
某些文档最好以原文阅读。
开发学习博客欢迎您阅读另一篇全面且面向实践的文章。这一次,我们将讨论 Kotlin 和 JWT。我们将涵盖与开发相关的高级主题和最佳实践,以便 Kotlin 开发人员可以将他们的技能提升到一个新的水平。
一如既往,我们想提醒我们的读者,该博客提供其他语言版本。如果您有兴趣阅读这篇德语文章,请单击 此处。如果您有兴趣阅读这篇西班牙语文章,请单击 此处。
Kotlin 是一种静态类型的编程语言,运行在 Java 虚拟机上,也可以编译成 JavaScript 源代码。 Kotlin 由 JetBrains 开发,该公司是 IntelliJ IDEA IDE 背后的公司。
Kotlin 项目始于 2010 年,第一个稳定版本是在 2016 年 2 月。从那时起,Kotlin 成为最流行的编程语言之一,现在是 Android 开发的官方语言。
JWT 是一个开放标准 (RFC 7519),它定义了一种紧凑且独立的方式来在各方之间将信息传输为 JSON 对象。此信息可以被验证和信任,因为它是经过数字签名的。 JWT 可以使用秘密或公钥/私钥对进行签名。
JWT 用于分布式系统中各方之间的身份验证和信息交换。在一个典型的场景中,用户通过第三方服务进行身份验证,该服务发布一个 JWT,用户随后可以使用该 JWT 访问其他资源。
将 Kotlin 与 JWT 结合使用有很多好处。首先,Kotlin 是一种非常简洁的语言,JWT 格式也很简洁。这使得在 Kotlin 中读写基于 JWT 的应用程序变得容易。其次,Kotlin 对各种 JSON 库有很好的支持,这使得使用 JWT 声明和有效负载变得容易。最后,Kotlin 的类型系统和 null 安全功能有助于避免在使用 JWT 时出现常见错误。
在本节中,我们将向您展示如何开始使用 Kotlin 和 JWT。我们假设您已经熟悉 Kotlin 和 JSON 的基础知识。
在开始编码之前,我们需要安装 Kotlin 编译器和 JSON 库。我们将使用 Kotlin 编译器 和 Jackson 库。
可以使用 Maven 或 Gradle 等包管理器安装 Kotlin。对于 Jackson,我们需要将以下依赖项添加到我们的 build.gradle 文件中:
implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.+'
现在我们已经安装了所有依赖项,我们可以创建一个新的 Kotlin 项目。我们将把我们的项目命名为“jwt-kotlin”。
现在我们已经设置了项目,我们可以开始编写一些代码了。让我们从编写一个生成 JWT 的函数开始。我们将使用 jwk-set-pub
库来生成 JWT。
import com.auth0.jwk.JwkSet
import com.auth0.jwk.Jwk
fun generateJwt(jwkSet: JwkSet, keyId: String): String {
// Get the JWK for the given key ID
val jwk: Jwk = jwkSet.getKey(keyId)
// Create a JWT with the JWK
val jwt = JWT(jwk)
// Set the claims
jwt.claims
.setSubject("kotlin-jwt")
.setIssuer("https://kotlin-jwt.com")
.setExpiration(Date(Date().time + 5 * 60 * 1000)) // 5 minutes
// Sign the JWT
return jwt.sign()
}
在上面的代码片段中,我们首先导入了 jwk-set-pub 库。然后我们创建了一个函数,该函数将“JwkSet”和“keyId”作为输入并返回包含 JWT 的“String”。接下来,我们从 JwkSet
中检索给定 keyId
的 JWK。
之后,我们使用 JWK
创建了一个新的 JWT
对象。然后我们为 JWT
设置声明。在此示例中,我们设置了“subject”、“issuer”和“expiration”声明。最后,我们使用 sign() 方法对 JWT 进行签名,并返回签名后的 JWT。
现在我们知道如何生成 JWT,让我们编写一个函数来验证 JWT。我们将使用 jwk-set-pub
库来验证 JWT。
import com.auth0.jwk.JwkSet
import com.auth0.jwk.Jwk
fun verifyJwt(jwkSet: JwkSet, jwt: String): Boolean {
// Get the header from the JWT
val header: Map<String, Any> = JWT.getHeader(jwt)
// Get the kid from the header
val kid: String? = header["kid"] as String?
// Get the JWK for the given kid
val jwk: Jwk = jwkSet.getKey(kid)
// Verify the JWT
return JWT.verify(jwt, jwk)
}
在上面的代码片段中,我们首先导入了 jwk-set-pub 库。然后,我们创建了一个函数,该函数将 JwkSet
和 jwt
作为输入并返回一个 Boolean
,指示 jwt
是否有效。
接下来,我们使用 getHeader() 方法从 jwt 中检索标头。然后我们从标头中检索了 kid
。之后,我们从 JwkSet
中检索了给定 kid
的 JWK
。最后,我们通过 verify() 方法验证了 jwt 并返回了结果。
在本节中,我们将讨论一些与 Kotlin 和 JWT 相关的高级主题。
在上一节中,我们了解了如何生成和验证 JWT。在本节中,我们将了解如何编码和解码 JWT。为此,我们将使用 jwt-kotlin
库。
jwt-kotlin
库提供了用于编码 JWT 的 JWT.encode()
方法和用于解码 JWT 的 JWT.decode()
方法。
JWT.encode()
方法将 JWT
对象和 Encoder
对象作为输入,并将 JWT
编码为 String
。 Encoder
对象定义要使用的编码算法。 jwt-kotlin
库为此提供了 Base64Encoder
类。
JWT.decode()
方法将包含 JWT 的 String
和一个 Decoder
对象作为输入,并将 JWT
解码为 JWT
对象。 Decoder
对象定义要使用的解码算法。 jwt-kotlin
库为此提供了 Base64Decoder
类。
在本节中,我们将了解如何在 Web 应用程序中使用 JWT。为此,我们将使用 jwt-kotlin
和 jwt-kotlin-web
库。
jwt-kotlin-web
库提供了 JwtCookie
和 JwtSession
类,这使得在 Web 应用程序中使用 JWT 变得容易。
JwtCookie
类表示存储在 Cookie 中的 JWT。 JwtCookie
类提供了 get()
和 set()
方法来获取和设置 Cookie 中的 JWT。
JwtSession
类表示存储在 Session 中的 JWT。 JwtSession
类提供了 get()
和 set()
方法来获取和设置 Session 中的 JWT。
在本节中,我们将讨论使用 Kotlin 和 JWT 的一些最佳实践。
在 Kotlin 中使用 JWT 时,最好使用诸如 jwt-kotlin 之类的库。 jwt-kotlin
库提供了许多有用的函数和类来处理 JWT。
使用 JWT 时,确保秘密安全非常重要。绝不能以纯文本或源代码的形式存储秘密。它应该存储在安全位置,例如配置文件或数据库。
JWT 不应重复使用。一旦使用了 JWT,它就应该失效,并且应该生成一个新的 JWT。
使用 JWT 时,最好维护一份已失效 JWT 的黑名单。这将有助于防止重放攻击。
在本文中,我们讨论了 Kotlin 和 JWT。我们涵盖了与开发相关的高级主题和最佳实践,因此 Kotlin 开发人员可以将他们的技能提升到一个新的水平。