2016-08-03 65 views
0

我有一個JWT字符串。我可以將它粘貼到任何「解碼JWT」的谷歌搜索結果中,並且它可以正確解碼,而且不需要任何祕密或加密聲明。但是我看到的所有例子,例如Buddy或jwtt,要求我提供他們加密的任何祕密。我怎麼能簡單地解碼原始字符串,就像每個網站那樣容易?在Clojure中解碼JWT/Java

回答

0

以下答案是豐富和良好的;這裏是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 
    ) 
1

對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. 
} 
1

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