JWT parser().setSigningKey() 方法已废弃
1、概览
Java JWT(JSON Web Token)库是一个用于创建、解析和验证 JWT Token 的工具。这些 Token 可确保 API 和 Web 应用的安全,是身份验证和授权的通用解决方案。
本文将带你了解如何使用更先进的 parserBuilder.setSigningKey()
方法替换该库中已废弃的 parser().setSigningKey()
方法,以及使用 JWT Parser Builder 解析和验证 JWT 的优势。
2、签名密钥是什么?
签名密钥是 JWT Token 的关键要素。JWT Token 由三部分组成:Header、Payload 和签名。签名是通过使用秘钥或公钥/私钥对对 Header 和 Payload 进行签名来创建的。当 Token 发送到服务器时,签名密钥将用于验证签名,确保 Token 未被篡改。
在 Java JWT 库中,签名密钥是在 Token 验证过程中提供给解析器的。这可以确保 Token 的完整性,并使服务器能够信任其内容。
3、Jwts 类是什么?
Jwts
类是 Java JWT 库中的一个核心工具类。它是处理 JWT 的入口点。该类为我们提供了创建、解析和验证 JWT 的各种方法。例如,当我们要解析 JWT 时,首先要调用 Jwts.parserBuilder()
方法,该方法为我们提供了一个构建器,用于构建带有必要配置选项(如设置签名密钥)的解析器。
3.1、已废弃方法概述
有了上述理论后,来看看我们要替换的已废弃的 parser().setSigningKey()
方法:
JwtParser parser = Jwts.parser().setSigningKey(key);
如上,使用 setSigningKey()
设置用于解析和验证 JWT 的密钥。这种方法简单明了,但存在局限性,尤其是在不变性和线程安全性方面,因此最终被废弃。
具体来说,这种配置签名密钥的方式在 0.11.0 版本中已被弃用。
4、使用 parserBuilder.setSigningKey() 重构
我们使用在 0.11.0 版本中引入的 JwtParserBuilder
类来取代已废弃的方法,它为我们提供了更安全、更灵活的 API 来处理 JWT Token。
如下:
JwtParser parser = Jwts.parserBuilder()
.setSigningKey(key)
.build();
在本例中,parserBuilder()
允许我们使用签名密钥构建解析器,同时提供额外的配置选项。最后,build()
方法会创建一个不可变的解析器实例,确保其线程安全,并允许在应用程序的不同部分重复使用。
5、为什么要改变?
parser().setSigningKey()
的弃用是增强 JWT 处理的安全性和灵活性这一更广泛举措的一部分。
促使这一改变的一些主要原因如下:
- 不可变性和线程安全:新的
parserBuilder.setSigningKey()
方法生成的 JWT 解析器实例是不可变和线程安全的。这也意味着我们可以在多个线程中重复使用同一个解析器,而不必担心状态捕获和意外行为。 - 增强安全性:通过
parserBuilder.setSigningKey()
,我们可以灵活配置特定的必要声明(Claim),还可以设置自定义验证规则。这有助于我们执行更严格的安全规则,并轻松定制 JWT 验证流程。 - 提高可读性:我们还可以通过使用
parserBuilder.setSigningKey()
使配置更明确、更易懂,从而提高代码的可读性。
6、总结
本文介绍了如何用 parserBuilder.setSigningKey()
方法替换已弃用的 parser().setSigningKey()
方法,及其背后的原因和使用更新后的 API 创建 JWT 解析器的好处。
Ref:https://www.baeldung.com/jwt-deprecated-setsigningkey