2017-06-23 34 views
0

從有效載荷中獲取自定義字段好的,當我生成JWT時,我將有幾個自定義聲明添加到有效內容中,並且我可以在我的前端將它們拉出(JavaScript )。然後我有我的JavaScript發送ajax調用一個微服務,並通過JWT一起。我想從微服務中的JWT中獲得我的定製理賠。我正在做以下事情:如何使用JJWT

Claims claims = Jwts.parser().setSigningKey(Vars.SECRET_KEY).parseClaimsJws(token).getBody(); 
User user = claims.get("customuser", User.class); 

它會引發異常。

io.jsonwebtoken.RequiredTypeException: Expected value to be of type: class net.netdatacorp.netdauth.model.User, but was class java.util.LinkedHashMap 
    at io.jsonwebtoken.impl.DefaultClaims.get(DefaultClaims.java:128) 

以下是我的自定義聲明的數據在前端的JWT檢查器中的顯示方式。

{ 
    jti: "83bffbad-7d36-4370-9332-21a84f2a3dce", 
    iat: 1498241526, 
    sub: "test", 
    iss: "www.test.net", 
    customuser: { 
    userId: 1, 
    userCd: "TMM", 
    firstNm: "Testy", 
    lastNm: "McTesty", 
    userNm: "test", 
    emailAddress: "[email protected]", 
    active: true, 
    createdDt: 1491355712000, 
    createdByUserId: 0, 
    lastUpdateDt: 1498199278000, 
    lastUpdateByUserId: 0, 
    lastLoginDt: 1484928016000 
    } 
} 

我錯過了什麼可以拉我的自定義聲明?

+0

我拿了永樂,看到JwtParser'的'提供的唯一實現是'DefaultJwtParser',依靠傑克遜的'ObjectMapper',但可悲的是不暴露它允許定製。甚至沒有通過繼承:方法'readValue'是'protected',但只有對象返回'Map'([參見0.7.0](https://github.com/jwtk/jjwt/blob/0.7.0/) src/main/java/io/jsonwebtoken/impl/DefaultJwtParser.java#L550-L556))。看起來你需要從頭開始自己實現'JwtParser' ...或手動將映射轉換爲對象: -/ –

+0

在這種情況下,它看起來像我將切換庫,它看起來像jose4j可以處理我我想要做。 –

+0

@JacobMiles,你介意發佈'jose4j'代碼進行比較嗎? – chenrui

回答

0

好的,所以我轉而使用Jose4J而不是JJWT,並且在努力完成每一件事情之後,我意識到我可能會做出與JJWT類似的事情。所以我最終做的是使用Gson來執行對象的JSON編碼,並將所得到的JSON字符串作爲索賠附加。因此,當我想要返回定製聲明時,我會將聲明提取爲字符串,並使用Gson庫將其轉換回POJO。

GsonBuilder gsonBuilder = new GsonBuilder(); 
Gson gson = gsonBuilder.create(); 

JwtConsumer jwtConsumer = getConsumer(); 

JwtClaims jwtClaims = jwtConsumer.processToClaims(token); 
String userStr = jwtClaims.getClaimValue("user", String.class); 
User user = gson.fromJson(userStr, User.class);