Decode JWT in Clojure/Java



我有一个JWT字符串。我可以将它粘贴到谷歌上任何一个"解码JWT"的热门结果中,它可以正确解码,而无需我提供任何秘密或加密声明。但我看到的所有例子,例如Buddy或jwtt,都要求我提供加密后的任何秘密。我怎么能像所有网站一样简单地解码原始字符串呢?

下面的答案内容丰富,效果良好;这是适用于我的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
    )

关于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=> 

解码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.
}

最新更新