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