使用从PL / SQL调用的Auth0 Java客户端的JWT验证失败

时间:2019-07-19 09:12:47

标签: java oracle plsql jwt auth0

我有一个数据库应用程序(Oracle DB)。我们最近添加了用于创建到外部应用程序的链接的选项,其中包括用于标识用户身份的已签名JWT。我使用Auth0库以Java生成JWT,并将Java库加载到数据库中,以便可以从PL / SQL调用Java函数。它产生的令牌似乎可以在jwt.io上验证。

我现在还希望支持链接到应用程序,因此我想验证JWT。添加了Java代码,如果我在Eclipse中运行它,它将起作用。但是,当从PL / SQL调用它时,我从Auth0库中得到一个错误:

  

字符串'{“ typ”:“ JWT”,“ alg”:“ RS256”}'没有有效的JSON   格式。

这很奇怪。据我所知,字符串是有效的JSON!完整的堆栈跟踪(返回到我的代码)是

com.auth0.jwt.exceptions.JWTDecodeException: The string '{"typ":"JWT","alg":"RS256"}' doesn't have a valid JSON format.
        at com.auth0.jwt.impl.JWTParser.convertFromJSON(JWTParser.java:52)
        at com.auth0.jwt.impl.JWTParser.parseHeader(JWTParser.java:33)
        at com.auth0.jwt.JWTDecoder.<init>(JWTDecoder.java:37)
        at com.auth0.jwt.JWT.decode(JWT.java:21)
        at com.auth0.jwt.JWTVerifier.verify(JWTVerifier.java:352)

正如我所说,如果我在Eclipse中但不在数据库服务器上运行它,它将起作用。我的测试用例只是调用一个函数来生成JWT,然后将其直接传递给verify函数。

我认为通过PL / SQL传递字符串时可能是字符编码问题,因此我直接从Java中的generate添加了对verify例程的调用。因此,生成器会生成一个JWT,然后调用Java例程进行验证,然后再将其返回到PL / SQL。如果原始调用来自数据库,即使这样也失败!但是在这种情况下,该字符串尚未离开Java,因此我认为它不是字符编码。

如果我让Java调试出令牌,那么它将在JWT.io上进行验证。如果我复制该令牌并在Eclipse中的纯Java测试用例中使用它,那么它将正常工作!

Eclipse我尝试在数据库使用1.8.0_201时使用Java版本1.8.0_112和1.8.0_221(如System.getProperty("java.version")所报告)。找不到201 JDK,但怀疑是问题所在。

有什么想法吗?

0 个答案:

没有答案