当前位置: 首页 > 知识库问答 >
问题:

如何使用java时间生成JWT exp声明?

廉展鹏
2023-03-14

JWT令牌的大多数示例都使用clj时间,而现在不推荐使用clj时间,而是使用本机java。时间我正试图与buddy一起使用java time对令牌进行签名/验证,但我一直在尝试将exp声明传递给我的令牌。以下是我所拥有的一个例子:

(ns test-app.test-ns
  (:require
   [buddy.sign.jwt :as jwt]
   [buddy.auth.backends.token :as bat]
   [java-time :as t]))

(def secret "myfishysecret")

(def auth-backend (bat/jws-backend {:secret secret
                                    :options {:alg :hs512}}))
(def token (jwt/sign {:user "slacker"
                      :exp (t/plus (t/local-date-time) (t/seconds 60))
                      } secret {:alg :hs512}))

当我测试是否可以取消令牌签名时

(jwt/unsign token secret {:alg :hs512})

我得到以下错误:

柴郡执行错误(JsonGenerationException)。生成/生成(generate.clj:152)。无法对类java的对象进行JSON编码。时间本地日期时间:2021-01-22T12:37:52.206456

因此,我试图通过封装对(t/plus…)的调用来传递相同的消息在一个(str)内,但我得到了以下错误:

类java。无法将lang.String转换为类java。lang.Number
(java.lang.String和java.lang.Number位于加载程序“bootstrap”的模块java.base中)

所以,我被卡住了,因为我真的不知道如何使用java时间生成有效的exp number值(根据这个问题,格式应该是从纪元开始的秒数)。使用clj time的旧示例只是将exp声明值传递为

(clj-time.core/plus (clj-time.core/now) (clj-time.core/seconds 3600))

非常感谢您的帮助。

编辑:艾伦·汤普森的答案非常完美,因为值得的是,它相当于使用java-time包装器:

(t/plus (t/instant) (t/seconds 60))

共有1个答案

郏志学
2023-03-14

以下是两种方法:

  (let [now+60          (-> (Instant/now)
                          (.plusSeconds 60))
        now+60-unixsecs (.getEpochSecond now+60)]

    (jwt/sign {:user "slacker" :exp now+60         } secret {:alg :hs512})
    (jwt/sign {:user "slacker" :exp now+60-unixsecs} secret {:alg :hs512}))

现在我们有了结果:

now+60            => <#java.time.Instant #object[java.time.Instant 0x7ce0054c "2021-01-22T19:04:51.905586442Z"]>
now+60-unixsecs   => <#java.lang.Long 1611342291>

所以你可以选择不同的方法。buddy似乎知道如何从java转换。时间即时,因此不必一直使用unix秒。

您可能还对这个帮助器和方便函数库感兴趣,以便使用java.time

 类似资料:
  • 问题内容: 我想生成一个随机时间戳,并向其添加一个随机增量,以生成第二个时间戳。那可能吗? 如果我传递随机的long值来创建时间戳,并且我想随机生成该long值,那么生成该值以给出2012年的时间戳的约束是什么? 问题答案: 您需要将随机数缩放到特定年份的范围,然后将年份的开始添加为偏移量。一年中的毫秒数从一年到另一年(le年有额外的一天,某些年份有leap分钟,依此类推),因此您可以按以下步骤确

  • 问题内容: 我正在寻找可用于在运行时生成声音的Java代码-而不是现有声音文件的播放。 例如,在2毫秒的时间内生成440 Hz的锯齿波形的最佳代码是什么? 源代码赞赏! 我记得我的Commodore 128有一个简单的Sound命令,该命令以语音,频率,波形和持续时间作为参数来定义声音。在许多简单的情况下(快速而肮脏的游戏,声音实验等),效果都很好。 我正在专门寻找声音效果,例如声音,而不是音乐或

  • 问题内容: 如何使用Java获取声音文件的总时间? -更新 看起来这段代码确实起作用了:long audioFileLength = audioFile.length(); 我知道如何获取文件长度,但是我没有找到如何获取声音文件的帧频和帧大小…任何想法或链接吗? -更新 另一个工作代码(使用@mdma的提示): 问题答案: 给一个File你可以写

  • 问题内容: 我想将Java中01/01/2100的UTC时间设置为‘2100-01-01 00:00:00’。我收到“ 2100-01-01 00:08:00”。任何想法,如何纠正这一点。 问题答案: 您还需要为SimpleDateFormat指定时区-当前正在解析 当地时间 午夜,该 时间 以UTC上午8点结束。 像以往一样,我个人建议使用Joda Time,它通常功能更强大。如果您愿意,我很乐

  • 本文向大家介绍python如何快速生成时间戳,包括了python如何快速生成时间戳的使用技巧和注意事项,需要的朋友参考一下 结果是 知识点扩展: 获取秒级时间戳与毫秒级时间戳、微秒级时间戳 返回 获取当前日期时间 返回 到此这篇关于python如何快速生成时间戳的文章就介绍到这了,更多相关python生成时间戳的简单方法内容请搜索呐喊教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持呐喊教

  • 如何生成版本1(基于时间的)UUID?是否有一个单独的库,或者它是如何在Java7 API中提供的,我错过了它。