2017-02-27 94 views
0

我必須缺少一些東西。我正在使用JJWT庫創建JWT。根據權利要求中設置的數據,JWT從庫中不一致地創建。我的代碼:Java jjwt爲JWT創建無效的JSON

Date now = new Date(); 
Date expiration = new Date(now.getTime() + TimeUnit.MINUTES.toMillis(30)); 

Claims claims = Jwts.claims(); 

JSONObject jsonObject = new JSONObject(); 
jsonObject.put("serviceName1", "serviceStatus1"); 
jsonObject.put("serviceName2", "serviceStatus2"); 
claims.put("services",jsonObject); 

claims.setSubject("225544"); 
claims.setExpiration(expiration); 
claims.setId(UUID.randomUUID().toString()); 
claims.setIssuedAt(now); 

return Jwts.builder() 
    .setClaims(claims) 
    .signWith(SignatureAlgorithm.HS256, Base64.encodeBase64(secret.getBytes())) 
    .compact(); 

此代碼創建JWT並正確簽名。但是,當有效載荷被解碼時,有效載荷值並不總是有效的JSON。大多數情況下,它會丟失關閉}導致任何解析失敗。 如果Subject是8個字符,它工作正常。如果長度爲7或6個字符,則JSON無效。或者,如果我在索賠中添加其他標籤,有時會起作用,有時甚至不起作用。難道我做錯了什麼?

我也嘗試過使用Auth0 java-JWT庫並獲得類似的結果,Payload並不總是有效的JSON。

+1

嘗試'claims.put( 「服務」,jsonObject.toString());'或使用'Map'。 –

+0

你使用了什麼庫來用於'JSONObject'?可能是將JSON對象編碼爲字符串的問題。 – pedrofb

+0

嘗試'.toString()'沒有幫助。我使用net.sf.json-lib作爲庫。我決定用手動構建令牌比較容易,然後通過庫來驗證它們,而不是更多地與之對抗。感謝您的幫助 – Niro

回答

1

的,請改爲JSONObject嘗試Map<String,String>