为什么 auth0 的 Java JWT 库无法接受自定义声明的 Object/Any?

Why is auth0's Java JWT library unable to accept an Object/Any for custom claims?

我正在尝试基于对象创建自定义 JWT 声明。我认为这应该是可行的,因为 auth0.jwt 使用 jackson-databind。这是一个简单的例子:

                data class Foo(val strings: List<String>)

                val bar = Foo(listOf("hello", "world"))

                val jwtAlgorithm = Algorithm.RSA256(
                    loadPublicKeyFromFile("testPublicKey.pem"),
                    loadPrivateKeyFromFile("testPrivateKey_pkcs8.pem")
                )

                val payload = mapOf("customClaim" to bar)
                val token = JWT.create().withPayload(payload).sign(jwtAlgorithm)

但是,我得到以下异常

java.lang.IllegalArgumentException: Claim values must only be of types Map, List, Boolean, Integer, Long, Double, String and Date

我注意到在反序列化自定义声明时,我需要将 Jackson 注释(例如 @JsonCreator 和 @JsonProperty)添加到我的声明模型 类,而我自己使用 Jackson 时则不需要。

我的项目正在使用以下相关库:

            "com.auth0:java-jwt:3.18.1",
            "com.fasterxml.jackson.module:jackson-module-kotlin:$jackson_version", 
            "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jackson_version",
            "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:$jackson_version"

其中 jackson_version = 2.9.7

这是怎么回事,是否有比编写代码将我的自定义声明对象转换为地图更好的修复方法?

我认为这是因为 SDK 试图 validate the payload 通过做一些事情来确保 none 的值是空的,他们通过限制你可以使用的类型来实现它们已实施验证。

readme中提到了这一点(虽然看起来他们忘了提到 Map 是允许的):

Currently supported classes for custom JWT Claim creation and verification are: Boolean, Integer, Double, String, Date and Arrays of type String and Integer.

所以是的,如果您想使用 SDK,您需要转换为地图。或者不要使用 SDK - 我个人已经分叉了他们的 SDK 来解决它不支持刷新管理 API 令牌和遵守速率限制的问题。我怀疑在长 运行 中,编写自己的 Auth0 API 客户端可能更容易。