在 Clojure/Java 中解码 JWT

Posted

技术标签:

【中文标题】在 Clojure/Java 中解码 JWT【英文标题】:Decode JWT in Clojure/Java 【发布时间】:2016-12-08 12:42:33 【问题描述】:

我有一个 JWT 字符串。我可以将它粘贴到“解码 JWT”的任何***谷歌搜索结果中,它可以正确解码,这不需要我提供任何秘密或加密声明。但是我看到的所有例子,例如Buddy 或 jwtt,要求我提供他们加密的任何秘密。我怎样才能像每个网站一样简单地解码原始字符串?

【问题讨论】:

【参考方案1】:

解码 JWT 非常简单,但在验证签名之前,您永远不应该相信声明。这就是为什么任何体面的 JWT 库都需要您提供秘密或公钥(如果它是使用 RSA 签名的)。

无论如何,JWT 的格式非常简单——由. 分隔的三部分:

<header> . <payload> . <signature>

每个部分都经过 base64 编码。因此,如果您只想查看声明,可以执行以下操作:

String jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ";
String [] jwtParts = jwt.split("\\.");
if (jwtParts.length == 3) 
    String payload = new String(Base64.getDecoder().decode(jwtParts[1]));
    System.out.println(payload);
    // Now you can use some JSON library to decode payload.

【讨论】:

【参考方案2】:

下面的答案内容丰富且很好;这是对我有用的 Clojure 版本:

(ns decode-jwt
  (:require [cheshire.core :as json])
  (:import [org.apache.commons.codec.binary Base64]))

(-> returned-jwt ;; returned-jwt is your full jwt string
    (clojure.string/split #"\.") ;; split into the 3 parts of a jwt, header, body, signature
    second ;; get the body
    Base64/decodeBase64 ;; read it into a byte array
    String. ;; byte array to string
    json/decode ;; make it into a sensible clojure map
    )

【讨论】:

【参考方案3】:

https://jwt.io/clojure JWT 库上:[funcool/buddy], doc:http://funcool.github.io/buddy-sign/latest/`

user=> (require '[buddy.sign.jwt :as jwt])
user=> (jwt/sign :userid 1 "secret")
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyaWQiOjF9.5sxiy9q0YcpnXl2jBl-s4--C9iq5-4qC6CrW30NfRS4"
user=> (jwt/unsign "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyaWQiOjF9.5sxiy9q0YcpnXl2jBl-s4--C9iq5-4qC6CrW30NfRS4" "secret")
:userid 1
user=> 

【讨论】:

以上是关于在 Clojure/Java 中解码 JWT的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 clojure.java.jdbc 进行 UPSERT

在 Clojure 中需要命名空间时出现 FileNotFoundException

clojure.java.jdbc 更新 id 在哪里

在Clojure中打印文件

clojure.java.jdbc /查询大结果集懒惰

java.jdbc clojure 执行!插入数量